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