parent
							
								
									20ed114766
								
							
						
					
					
						commit
						2bd7fdac52
					
				
											
												
													File diff suppressed because one or more lines are too long
												
											
										
									
								@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					debug:
 | 
				
			||||||
 | 
						g++ -g3 -O0 server/server.cpp server/table.cpp  -o a.out -Wall -Wextra -Wpedantic
 | 
				
			||||||
 | 
						
 | 
				
			||||||
@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					// Hint files help the Visual Studio IDE interpret Visual C++ identifiers
 | 
				
			||||||
 | 
					// such as names of functions and macros.
 | 
				
			||||||
 | 
					// For more information see https://go.microsoft.com/fwlink/?linkid=865984
 | 
				
			||||||
 | 
					#define Ops(o) template<typename T> vector_type<typename types::Coercion<_Ty, T>::type> operator##o(const vector_type<T>& r) { [[likely]] if (r.size == size) { return add(r); } else if (r.size == 1 || size == 1) { const bool lr = size == 1; const uint32_t& _size = lr ? r.size : size; const auto& _container = lr ? r.container : container; const auto& scalar = *(lr ? container : r.container); vector_type<typename types::Coercion<_Ty, T>::type> ret(_size); for (int i = 0; i < _size; ++i) ret[i] = _container[i] o scalar; return ret; } }
 | 
				
			||||||
 | 
					#define Op(o, x) template<typename T> vector_type<typename types::Coercion<_Ty, T>::type> inline x(const vector_type<T>& r) { vector_type<typename types::Coercion<_Ty, T>::type> ret(size); for (int i = 0; i < size; ++i) ret[i] = container[i] o r[i]; return ret; }
 | 
				
			||||||
 | 
					#define _Make_Ops(M) M(+, add) M(-, minus) M(*, multi) M(/, div) M(%, mod) M(&, and) M(|, or) M(^, xor) 
 | 
				
			||||||
@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					#ifndef _AQUERY_H
 | 
				
			||||||
 | 
					#define _AQUERY_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "table.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Context{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include "libaquery.h"
 | 
				
			||||||
 | 
					#ifdef _WIN32
 | 
				
			||||||
 | 
					#include "winhelper.h"
 | 
				
			||||||
 | 
					#else 
 | 
				
			||||||
 | 
					#include <dlfcn.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					typedef int (*code_snippet)(void*);
 | 
				
			||||||
 | 
					int main()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    void* handle = dlopen("dll.so", RTLD_LAZY);
 | 
				
			||||||
 | 
					    code_snippet c = static_cast<code_snippet>(dlsym(handle, "dlmain"));
 | 
				
			||||||
 | 
					    printf("%d", c(0));
 | 
				
			||||||
 | 
					    dlclose(handle);
 | 
				
			||||||
 | 
					    vector_type<double> t1{ 1.2, 3.4, .2, 1e-5, 1, 3, 5, 4, 5};
 | 
				
			||||||
 | 
					    vector_type<int> t2{ 2, 4, 3, 5, 0, 2, 6, 1, 2};
 | 
				
			||||||
 | 
					    printf("x: ");
 | 
				
			||||||
 | 
					    const auto& ret = t1 - t2;
 | 
				
			||||||
 | 
					    for (const auto& x : ret) {
 | 
				
			||||||
 | 
					        printf("%lf ", x);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    puts("");
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,160 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
				
			||||||
 | 
					  <ItemGroup Label="ProjectConfigurations">
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Debug|Win32">
 | 
				
			||||||
 | 
					      <Configuration>Debug</Configuration>
 | 
				
			||||||
 | 
					      <Platform>Win32</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Release|Win32">
 | 
				
			||||||
 | 
					      <Configuration>Release</Configuration>
 | 
				
			||||||
 | 
					      <Platform>Win32</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Debug|x64">
 | 
				
			||||||
 | 
					      <Configuration>Debug</Configuration>
 | 
				
			||||||
 | 
					      <Platform>x64</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Release|x64">
 | 
				
			||||||
 | 
					      <Configuration>Release</Configuration>
 | 
				
			||||||
 | 
					      <Platform>x64</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Label="Globals">
 | 
				
			||||||
 | 
					    <VCProjectVersion>16.0</VCProjectVersion>
 | 
				
			||||||
 | 
					    <Keyword>Win32Proj</Keyword>
 | 
				
			||||||
 | 
					    <ProjectGuid>{031352c2-afbb-45aa-9518-dbc1f9ef2af3}</ProjectGuid>
 | 
				
			||||||
 | 
					    <RootNamespace>server</RootNamespace>
 | 
				
			||||||
 | 
					    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>Application</ConfigurationType>
 | 
				
			||||||
 | 
					    <UseDebugLibraries>true</UseDebugLibraries>
 | 
				
			||||||
 | 
					    <PlatformToolset>v143</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>Unicode</CharacterSet>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>Application</ConfigurationType>
 | 
				
			||||||
 | 
					    <UseDebugLibraries>false</UseDebugLibraries>
 | 
				
			||||||
 | 
					    <PlatformToolset>v143</PlatformToolset>
 | 
				
			||||||
 | 
					    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
				
			||||||
 | 
					    <CharacterSet>Unicode</CharacterSet>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>Application</ConfigurationType>
 | 
				
			||||||
 | 
					    <UseDebugLibraries>true</UseDebugLibraries>
 | 
				
			||||||
 | 
					    <PlatformToolset>v143</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>Unicode</CharacterSet>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>Application</ConfigurationType>
 | 
				
			||||||
 | 
					    <UseDebugLibraries>false</UseDebugLibraries>
 | 
				
			||||||
 | 
					    <PlatformToolset>v143</PlatformToolset>
 | 
				
			||||||
 | 
					    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
				
			||||||
 | 
					    <CharacterSet>Unicode</CharacterSet>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
 | 
				
			||||||
 | 
					  <ImportGroup Label="ExtensionSettings">
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Label="Shared">
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Label="UserMacros" />
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					    <LinkIncremental>true</LinkIncremental>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					    <LinkIncremental>false</LinkIncremental>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
				
			||||||
 | 
					    <LinkIncremental>true</LinkIncremental>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
				
			||||||
 | 
					    <LinkIncremental>false</LinkIncremental>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <SDLCheck>true</SDLCheck>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <ConformanceMode>true</ConformanceMode>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
				
			||||||
 | 
					      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
				
			||||||
 | 
					      <SDLCheck>true</SDLCheck>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <ConformanceMode>true</ConformanceMode>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
				
			||||||
 | 
					      <OptimizeReferences>true</OptimizeReferences>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <SDLCheck>true</SDLCheck>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <ConformanceMode>true</ConformanceMode>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
				
			||||||
 | 
					      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
				
			||||||
 | 
					      <SDLCheck>true</SDLCheck>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <ConformanceMode>true</ConformanceMode>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <SubSystem>Console</SubSystem>
 | 
				
			||||||
 | 
					      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
				
			||||||
 | 
					      <OptimizeReferences>true</OptimizeReferences>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClCompile Include="table.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="server.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="vector_type.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="winhelper.cpp" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClInclude Include="table.h" />
 | 
				
			||||||
 | 
					    <ClInclude Include="libaquery.h" />
 | 
				
			||||||
 | 
					    <ClInclude Include="types.h" />
 | 
				
			||||||
 | 
					    <ClInclude Include="vector_type.hpp" />
 | 
				
			||||||
 | 
					    <ClInclude Include="winhelper.h" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <None Include="cpp.hint" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
				
			||||||
 | 
					  <ImportGroup Label="ExtensionTargets">
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					</Project>
 | 
				
			||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					#include "table.h"
 | 
				
			||||||
@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					#ifndef _TABLE_H
 | 
				
			||||||
 | 
					#define _TABLE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "types.h"
 | 
				
			||||||
 | 
					#include "vector_type.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <class T>
 | 
				
			||||||
 | 
					class vector_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _MSC_VER
 | 
				
			||||||
 | 
					namespace types {
 | 
				
			||||||
 | 
						enum Type_t;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename Ty>
 | 
				
			||||||
 | 
					class ColRef : public vector_type<Ty>
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const char* name;
 | 
				
			||||||
 | 
						types::Type_t ty;
 | 
				
			||||||
 | 
						ColRef(const char* name) : name(name) {}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TableInfo {
 | 
				
			||||||
 | 
						const char* name;
 | 
				
			||||||
 | 
						ColRef<void>* colrefs;
 | 
				
			||||||
 | 
						uint32_t n_cols;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
@ -0,0 +1,72 @@
 | 
				
			|||||||
 | 
					#ifndef _TYPES_H
 | 
				
			||||||
 | 
					#define _TYPES_H
 | 
				
			||||||
 | 
					#include <typeinfo>
 | 
				
			||||||
 | 
					#include <functional>
 | 
				
			||||||
 | 
					#include <cstdint>
 | 
				
			||||||
 | 
					#include <type_traits>
 | 
				
			||||||
 | 
					#include "table.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace types {
 | 
				
			||||||
 | 
						enum Type_t {
 | 
				
			||||||
 | 
							AINT, AFLOAT, ASTR, ADOUBLE, ALDOUBLE, ALONG, ASHORT, ADATE, ATIME, ACHAR, NONE, 
 | 
				
			||||||
 | 
							AUINT, AULONG, AUSHORT, AUCHAR
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO: deal with data/time <=> str/uint conversion
 | 
				
			||||||
 | 
						struct date_t {
 | 
				
			||||||
 | 
							uint32_t val;
 | 
				
			||||||
 | 
							date_t(const char* d) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							const char* toString() const{
 | 
				
			||||||
 | 
								return "";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						struct time_t {
 | 
				
			||||||
 | 
							uint32_t val;
 | 
				
			||||||
 | 
							time_t(const char* d) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							const char* toString() const {
 | 
				
			||||||
 | 
								return "";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						template <typename T>
 | 
				
			||||||
 | 
						struct Types {
 | 
				
			||||||
 | 
							typedef T type;
 | 
				
			||||||
 | 
							constexpr Types() noexcept = default;
 | 
				
			||||||
 | 
					#define ConnectTypes(f, x, y) \
 | 
				
			||||||
 | 
							f(int, AINT) \
 | 
				
			||||||
 | 
							f(float, AFLOAT) \
 | 
				
			||||||
 | 
							f(const char*, ASTR) \
 | 
				
			||||||
 | 
							f(double, ADOUBLE) \
 | 
				
			||||||
 | 
							f(long double, ALDOUBLE) \
 | 
				
			||||||
 | 
							f(long, ALONG) \
 | 
				
			||||||
 | 
							f(short, ASHORT) \
 | 
				
			||||||
 | 
							f(date_t, ADATE) \
 | 
				
			||||||
 | 
							f(time_t, ATIME) \
 | 
				
			||||||
 | 
							f(unsigned short, AUSHORT) \
 | 
				
			||||||
 | 
							f(unsigned long, AULONG) \
 | 
				
			||||||
 | 
							f(unsigned int, AUINT) \
 | 
				
			||||||
 | 
							f(unsigned char, ACHAR) \
 | 
				
			||||||
 | 
							f(void, NONE) 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							constexpr Type_t getType() const {
 | 
				
			||||||
 | 
					#define	TypeConnect(x, y) if(typeid(T) == typeid(x)) return y; else
 | 
				
			||||||
 | 
								ConnectTypes(TypeConnect, x, y)
 | 
				
			||||||
 | 
								return NONE;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					#define Cond(c, x, y) typename std::conditional<c, x, y>::type
 | 
				
			||||||
 | 
					#define Comp(o) (sizeof(T1) o sizeof(T2))
 | 
				
			||||||
 | 
					#define Same(x, y) (std::is_same_v<x, y>)
 | 
				
			||||||
 | 
					#define _U(x) std::is_unsigned<x>::value
 | 
				
			||||||
 | 
					#define Fp(x) std::is_floating_point<x>::value
 | 
				
			||||||
 | 
						template <class T1, class T2>
 | 
				
			||||||
 | 
						struct Coercion {
 | 
				
			||||||
 | 
							using t1 = Cond(Comp(<=), Cond(Comp(==), Cond(Fp(T1), T1, Cond(Fp(T2), T2, Cond(_U(T1), T2, T1))), T2), T1);
 | 
				
			||||||
 | 
							using t2 = Cond(Same(T1, T2), T1, Cond(Same(T1, const char*) || Same(T2, const char*), const char*, void));
 | 
				
			||||||
 | 
							using type = Cond(Same(t2, void), Cond(Same(T1, date_t) && Same(T2, time_t) || Same(T1, time_t) && Same(T2, time_t), void, t1), t2);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif // !_TYPES_H
 | 
				
			||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					#include "vector_type.hpp"
 | 
				
			||||||
@ -0,0 +1,220 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					* Bill Sun 2022
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _VECTOR_TYPE
 | 
				
			||||||
 | 
					#define _VECTOR_TYPE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <cstring>
 | 
				
			||||||
 | 
					#include <cstdlib>
 | 
				
			||||||
 | 
					#include <cstdint>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <algorithm>
 | 
				
			||||||
 | 
					#include <initializer_list>
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					#include <stdarg.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "types.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma pack(push, 1)
 | 
				
			||||||
 | 
					template <typename _Ty>
 | 
				
			||||||
 | 
					class vector_type {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
						void inline _copy(vector_type<_Ty>& vt) {
 | 
				
			||||||
 | 
							this->size = vt.size;
 | 
				
			||||||
 | 
							this->capacity = vt.capacity;
 | 
				
			||||||
 | 
							this->container = (_Ty*)malloc(size * sizeof(_Ty));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							memcpy(container, vt.container, sizeof(_Ty) * size);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						void inline _move(vector_type<_Ty>&& vt) {
 | 
				
			||||||
 | 
							this->size = vt.size;
 | 
				
			||||||
 | 
							this->capacity = vt.capacity;
 | 
				
			||||||
 | 
							this->container = vt.container;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							vt.size = vt.capacity = 0;	
 | 
				
			||||||
 | 
							vt.container = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
						_Ty* container;
 | 
				
			||||||
 | 
						uint32_t size, capacity;
 | 
				
			||||||
 | 
						typedef _Ty* iterator_t;
 | 
				
			||||||
 | 
						vector_type(uint32_t size) : size(size), capacity(size) {
 | 
				
			||||||
 | 
							container = (_Ty*)malloc(size * sizeof(_Ty));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						constexpr vector_type(std::initializer_list<_Ty> _l) {
 | 
				
			||||||
 | 
							size = capacity = _l.size();
 | 
				
			||||||
 | 
							_Ty* container = this->container = (_Ty*)malloc(sizeof(_Ty) * _l.size());
 | 
				
			||||||
 | 
							for (const auto& l : _l) {
 | 
				
			||||||
 | 
								*(container++) = l;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						constexpr vector_type() noexcept = default;
 | 
				
			||||||
 | 
						constexpr vector_type(vector_type<_Ty>& vt) noexcept {
 | 
				
			||||||
 | 
							_copy(vt);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						constexpr vector_type(vector_type<_Ty>&& vt) noexcept {
 | 
				
			||||||
 | 
							_move(std::move(vt));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						vector_type<_Ty> operator =(vector_type<_Ty>& vt) {
 | 
				
			||||||
 | 
							_copy(vt);
 | 
				
			||||||
 | 
							return *this;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						vector_type<_Ty> operator =(vector_type<_Ty>&& vt) {
 | 
				
			||||||
 | 
							_move(std::move(vt));
 | 
				
			||||||
 | 
							return *this;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						void emplace_back(_Ty _val) {
 | 
				
			||||||
 | 
							if (size >= capacity) { // geometric growth
 | 
				
			||||||
 | 
								capacity += 1 + capacity >> 1;
 | 
				
			||||||
 | 
								_Ty* n_container = (_Ty*)malloc(capacity * sizeof(_Ty));
 | 
				
			||||||
 | 
								memcpy(n_container, container, sizeof(_Ty) * size);
 | 
				
			||||||
 | 
								free(container);
 | 
				
			||||||
 | 
								container = n_container;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							container[size++] = _val;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						iterator_t erase(iterator_t _it) {
 | 
				
			||||||
 | 
					#ifdef DEBUG 
 | 
				
			||||||
 | 
							// Do bound checks 
 | 
				
			||||||
 | 
							if (!(size && capicity && container &&
 | 
				
			||||||
 | 
								_it >= container && (_it - container) < size))
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
							iterator_t curr = _it + 1, end = _it + --size;
 | 
				
			||||||
 | 
							while (curr < end)
 | 
				
			||||||
 | 
								*(curr - 1) = *(curr++);
 | 
				
			||||||
 | 
							return _it;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						iterator_t begin() const {
 | 
				
			||||||
 | 
							return container;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						iterator_t end() const {
 | 
				
			||||||
 | 
							return container + size;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						iterator_t find(const _Ty item) const {
 | 
				
			||||||
 | 
							iterator_t curr = begin(), _end = end();
 | 
				
			||||||
 | 
							while (curr != _end && *(curr++) != item);
 | 
				
			||||||
 | 
							return curr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_Ty& operator[](const std::size_t _i) const {
 | 
				
			||||||
 | 
							return container[_i];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void shrink_to_fit() {
 | 
				
			||||||
 | 
							if (size && capacity != size) {
 | 
				
			||||||
 | 
								capacity = size;
 | 
				
			||||||
 | 
								_Ty* _container = (_Ty*)malloc(sizeof(_Ty) * size);
 | 
				
			||||||
 | 
								memcpy(_container, container, sizeof(_Ty) * size);
 | 
				
			||||||
 | 
								free(container);
 | 
				
			||||||
 | 
								container = _container;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_Ty& back() {
 | 
				
			||||||
 | 
							return container[size - 1];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						void qpop() {
 | 
				
			||||||
 | 
							size = size ? size - 1 : size;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						void pop() {
 | 
				
			||||||
 | 
							if (size) {
 | 
				
			||||||
 | 
								--size;
 | 
				
			||||||
 | 
								if (capacity > (size << 1))
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									_Ty* new_container = (_Ty*)malloc(sizeof(_Ty) * size);
 | 
				
			||||||
 | 
									memcpy(new_container, container, sizeof(_Ty) * size);
 | 
				
			||||||
 | 
									free(container);
 | 
				
			||||||
 | 
									container = new_container;
 | 
				
			||||||
 | 
									capacity = size;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_Ty pop_back() {
 | 
				
			||||||
 | 
							return container[--size];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						void merge(vector_type<_Ty>& _other) {
 | 
				
			||||||
 | 
							if (capacity < this->size + _other.size)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								_Ty* new_container = (_Ty*)malloc(sizeof(_Ty) * (_other.size + this->size));
 | 
				
			||||||
 | 
								capacity = this->size + _other.size;
 | 
				
			||||||
 | 
								memcpy(new_container, container, sizeof(_Ty) * this->size);
 | 
				
			||||||
 | 
								memcpy(new_container + this->size, _other.container, sizeof(_Ty) * _other.size);
 | 
				
			||||||
 | 
								free(container);
 | 
				
			||||||
 | 
								container = new_container;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								memcpy(container + this->size, _other.container, sizeof(_Ty) * _other.size);
 | 
				
			||||||
 | 
							size = this->size + _other.size;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						template<class _Iter>
 | 
				
			||||||
 | 
						void merge(_Iter begin, _Iter end) {
 | 
				
			||||||
 | 
							unsigned int dist = static_cast<unsigned int>(std::distance(begin, end));
 | 
				
			||||||
 | 
							if (capacity < this->size + dist) {
 | 
				
			||||||
 | 
								_Ty* new_container = (_Ty*)malloc(sizeof(_Ty) * (dist + this->size));
 | 
				
			||||||
 | 
								capacity = this->size + dist;
 | 
				
			||||||
 | 
								memcpy(new_container, container, sizeof(_Ty) * this->size);
 | 
				
			||||||
 | 
								free(container);
 | 
				
			||||||
 | 
								container = new_container;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (int i = 0; i < dist; ++i) {
 | 
				
			||||||
 | 
								container[i + this->size] = *(begin + i);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							size = this->size + dist;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						~vector_type() {
 | 
				
			||||||
 | 
							if (capacity > 0) free(container);
 | 
				
			||||||
 | 
							container = 0; size = capacity = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#define Op(o, x) \
 | 
				
			||||||
 | 
						template<typename T>\
 | 
				
			||||||
 | 
						vector_type<typename types::Coercion<_Ty, T>::type> inline x(const vector_type<T>& r) const {\
 | 
				
			||||||
 | 
							vector_type<typename types::Coercion<_Ty, T>::type> ret(size);\
 | 
				
			||||||
 | 
							for (int i = 0; i < size; ++i)\
 | 
				
			||||||
 | 
								ret[i] = container[i] o r[i];\
 | 
				
			||||||
 | 
							return ret;\
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Opeq(o, x) \
 | 
				
			||||||
 | 
						template<typename T>\
 | 
				
			||||||
 | 
						vector_type<typename types::Coercion<_Ty, T>::type> inline x##eq(const vector_type<T>& r) {\
 | 
				
			||||||
 | 
							for (int i = 0; i < size; ++i)\
 | 
				
			||||||
 | 
								container[i] = container[i] o##= r[i];\
 | 
				
			||||||
 | 
							return *this;\
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Ops(o, x) \
 | 
				
			||||||
 | 
						template<typename T>\
 | 
				
			||||||
 | 
						vector_type<typename types::Coercion<_Ty, T>::type> operator o (const vector_type<T>& r) const {\
 | 
				
			||||||
 | 
							[[likely]] if (r.size == size) {\
 | 
				
			||||||
 | 
								return x(r);\
 | 
				
			||||||
 | 
							}\
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Opseq(o, x) \
 | 
				
			||||||
 | 
						template<typename T>\
 | 
				
			||||||
 | 
						vector_type<typename types::Coercion<_Ty, T>::type> operator o##= (const vector_type<T>& r) {\
 | 
				
			||||||
 | 
							[[likely]] if (r.size == size) {\
 | 
				
			||||||
 | 
								return x##eq(r);\
 | 
				
			||||||
 | 
							}\
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define _Make_Ops(M) \
 | 
				
			||||||
 | 
						M(+, add) \
 | 
				
			||||||
 | 
						M(-, minus) \
 | 
				
			||||||
 | 
						M(*, multi) \
 | 
				
			||||||
 | 
						M(/, div) \
 | 
				
			||||||
 | 
						M(%, mod) 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_Make_Ops(Op)
 | 
				
			||||||
 | 
						_Make_Ops(Opeq)
 | 
				
			||||||
 | 
						_Make_Ops(Ops)
 | 
				
			||||||
 | 
						_Make_Ops(Opseq)
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#pragma pack(pop)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					#include "winhelper.h"
 | 
				
			||||||
 | 
					#include <Windows.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void* dlopen(const char* lib, int)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return LoadLibraryA(lib);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void* dlsym(void* handle, const char* proc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return GetProcAddress(static_cast<HMODULE>(handle), proc);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int dlclose(void* handle)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return FreeLibrary(static_cast<HMODULE>(handle));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					#ifndef _WINHELPER_H
 | 
				
			||||||
 | 
					#define _WINHELPER_H
 | 
				
			||||||
 | 
					#define RTLD_LAZY 1
 | 
				
			||||||
 | 
					void* dlopen(const char*, int);
 | 
				
			||||||
 | 
					void* dlsym(void*, const char*);
 | 
				
			||||||
 | 
					int dlclose(void*);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue