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