6# define _SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING true
17#if defined(_WIN32) && !defined(WIN32)
22 #define CODEPORTING_WINDOWS 1
23#elif defined(__APPLE__)
24 #define CODEPORTING_MACOS 1
25#elif defined(__linux__)
26 #define CODEPORTING_LINUX 1
27#elif defined(__EMSCRIPTEN__)
28 #define CODEPORTING_WEBASSEMBLY 1
30 #error "Unknown platform"
34#if __cplusplus >= 202002L || _MSVC_LANG >= 202002L
35# define CODEPORTING_CPP_STANDARD 20
36#elif __cplusplus >= 201703L || _MSVC_LANG >= 201703L
37# define CODEPORTING_CPP_STANDARD 17
38#elif __cplusplus >= 201402L || _MSVC_LANG >= 201402L
39# define CODEPORTING_CPP_STANDARD 14
41# error The C++ language standard you specified is not supported.
46#elif defined(_MSC_VER)
49 #error unsupported compiler.
57 #define ABSTRACT __declspec(novtable)
61#define ASPOSE_CONST const
63#ifdef ASPOSECPP_STATIC_LIB
64 #define ASPOSECPP_SHARED_API
65 #define ASPOSECPP_SHARED_CLASS
66 #define ASPOSECPP_SHARED_RTTI_INFO_DECL() RTTI_INFO_DECL()
67#elif defined(CODEPORTING_WINDOWS)
69 #ifdef ASPOSECPP_SHARED_EXPORTS
71 #define ASPOSECPP_SHARED_API __declspec(dllexport)
72 #define ASPOSECPP_SHARED_CLASS
75 #define ASPOSECPP_SHARED_API __declspec(dllimport)
76 #define ASPOSECPP_SHARED_CLASS
79 #define ASPOSECPP_SHARED_RTTI_INFO_DECL() RTTI_INFO_DECL_EX(ASPOSECPP_SHARED_API)
81 #ifdef ASPOSECPP_SHARED_EXPORTS
83 #define ASPOSECPP_SHARED_API __attribute__ ((dllexport))
84 #define ASPOSECPP_SHARED_CLASS __attribute__ ((dllexport))
87 #define ASPOSECPP_SHARED_API __attribute__ ((dllimport))
88 #define ASPOSECPP_SHARED_CLASS __attribute__ ((dllimport))
91 #define ASPOSECPP_SHARED_RTTI_INFO_DECL() RTTI_INFO_DECL()
93#elif defined(CODEPORTING_MACOS)
94 #define ASPOSECPP_SHARED_API __attribute__ ((visibility ("default")))
95 #define ASPOSECPP_SHARED_CLASS __attribute__ ((visibility ("default")))
96 #define ASPOSECPP_SHARED_RTTI_INFO_DECL() RTTI_INFO_DECL()
98 #ifdef ASPOSECPP_SHARED_EXPORTS
100 #define ASPOSECPP_SHARED_API __attribute__ ((visibility ("default")))
101 #define ASPOSECPP_SHARED_CLASS __attribute__ ((visibility ("default")))
104 #define ASPOSECPP_SHARED_API
105 #define ASPOSECPP_SHARED_CLASS
108 #define ASPOSECPP_SHARED_RTTI_INFO_DECL() RTTI_INFO_DECL()
112#if defined(_MSC_VER) && (_MSC_VER < 1910)
113 #error "Only Microsoft Visual Studio 2017 (and higher) is supported"
116#if (defined(_MSC_VER) || defined(FORCE_BUILD_DEBUG)) && (defined(_DEBUG) || defined(DEBUG))
117 #if !defined(ASPOSECPP_DEBUG)
121 #define ASPOSECPP_DEBUG
124 #undef ASPOSECPP_DEBUG
127namespace System {
namespace Detail {
129 typedef enum {} empty_enum;
130 typedef enum class empty_enum_class {} empty_enum_class;
132 template <
int PtrSize,
int A,
int B,
int C,
int D>
133 struct __InternalTypeStub {};
135 template <
int A,
int B,
int C,
int D>
136 struct __InternalTypeStub<4,
A,
B,
C,
D>
138 typedef typename std::aligned_storage<A, B>::type type;
141 template <
int A,
int B,
int C,
int D>
142 struct __InternalTypeStub<8,
A,
B,
C,
D>
144 typedef typename std::aligned_storage<C, D>::type type;
148#define ASPOSE_NO_EXPORT
151#define ASPOSE_FAST_RTTI_DECL(keyword) \
152 keyword bool FastCast(const ::System::Details::FastRttiBase& helper, void** out_ptr) const override;
154#define ASPOSE_FAST_RTTI_IMPL(class_name) \
155 bool class_name::FastCast(const ::System::Details::FastRttiBase& helper, void** out_ptr) const \
157 *out_ptr = helper.Cast(this); \
162#ifdef ASPOSECPPLIB_BEING_BUILT
165 #define ASPOSECPP_3RD_PARTY_CLASS(type_name) class type_name;
168 #define ASPOSECPP_3RD_PARTY_STRUCT(type_name) struct type_name;
172 #define ASPOSECPP_3RD_PARTY_ENUM_CLASS_WITHOUT_UNDERLYING(type_name) {}
177 #define ASPOSECPP_3RD_PARTY_ENUM_WITH_UNDERLYING(type_name, underlying) \
178 static_assert(std::is_enum<type_name>::value, #type_name " is not a enum but is declared as one!"); \
179 static_assert(sizeof(type_name) == sizeof(underlying), "Declaring " #type_name " enum with wrong size of underlying type " #underlying "!"); \
180 static_assert(std::is_signed<std::underlying_type<type_name>::type>::value == std::is_signed<underlying>::value, "Declaring " #type_name " enum with wrong signedness of underlying type " #underlying "!"); \
181 static_assert(std::is_same<std::underlying_type<type_name>::type, underlying>::value, "Declaring " #type_name " enum with wrong underlying type " #underlying "!");
182 #define ASPOSECPP_3RD_PARTY_ENUM_CLASS_WITH_UNDERLYING(type_name, underlying) ASPOSECPP_3RD_PARTY_ENUM_WITH_UNDERLYING(type_name, underlying)
186 #define ASPOSECPP_3RD_PARTY_ENUM(type_name) ASPOSECPP_3RD_PARTY_ENUM_WITH_UNDERLYING(type_name, std::underlying_type<::System::Detail::empty_enum>::type);
187 #define ASPOSECPP_3RD_PARTY_ENUM_CLASS(type_name) ASPOSECPP_3RD_PARTY_ENUM_CLASS_WITH_UNDERLYING(type_name, std::underlying_type<::System::Detail::empty_enum_class>::type);
193 #define ASPOSECPP_3RD_PARTY_TYPEDEF(name, type) \
194 static_assert(std::is_same<name, type>::value, "Wrong type " #type " specified for typedef " #name "!");
201 #define ASPOSECPP_3RD_PARTY_TYPEDEF_WITH_PTR(name, type) \
202 ASPOSECPP_3RD_PARTY_TYPEDEF(name, type) \
203 ASPOSECPP_3RD_PARTY_TYPEDEF(name##Ptr, type*)
210 #define ASPOSECPP_3RD_PARTY_CONSTANT(constant_name, constant_type, constant_value) \
211 static_assert(std::is_same<decltype(constant_name), constant_type>::value || \
212 std::is_enum<decltype(constant_name)>::value && \
213 std::is_integral<constant_type>::value && \
214 sizeof(constant_type) == sizeof(decltype(constant_name)), \
215 "Wrong type " #constant_type " specified for constant " #constant_name "!"); \
216 static_assert(constant_name == constant_value, "Wrong value " #constant_value " specified for constant " #constant_name "!");
222 #define ASPOSECPP_3RD_PARTY_ENUM_HOLDER(enum_name, underlying, alias) \
224 static_assert(std::is_enum<enum_name>::value, #enum_name " is not a enum!"); \
225 static_assert(std::is_integral<underlying>::value && sizeof(underlying) == sizeof(enum_name) && alignof(underlying) == alignof(enum_name), \
226 "Wrong underlying type " #underlying " is specified for enum " #enum_name "!"); \
227 std::aligned_storage<sizeof(underlying), alignof(underlying)>::type m_data; \
229 alias(enum_name value) { *reinterpret_cast<enum_name*>(&m_data) = value; } \
230 inline alias(const alias &other) { *reinterpret_cast<enum_name*>(&m_data) = *reinterpret_cast<const enum_name*>(&other.m_data); } \
231 inline alias& operator = (const alias &other) { *reinterpret_cast<enum_name*>(&m_data) = *reinterpret_cast<const enum_name*>(&other.m_data); return *this; } \
232 operator enum_name& () { return *reinterpret_cast<enum_name*>(&m_data); } \
233 operator enum_name () const { return *reinterpret_cast<const enum_name*>(&m_data); } \
234 enum_name* operator & () { return reinterpret_cast<enum_name*>(&m_data); } \
235 const enum_name* operator & () const { return reinterpret_cast<const enum_name*>(&m_data); } \
245 #define ASPOSECPP_3RD_PARTY_TYPE_HOLDER(type_name, destructor_name, type_size, alignment, alias) \
248 typedef type_name value_type; \
250 static_assert(sizeof(value_type) == type_size, "Wrong size of storage generated when wrapping type " #type_name "!"); \
251 static_assert(alignof(value_type) == alignof(alignment), "Wrong alignment '" #alignment "' specified for type " #type_name "!"); \
252 std::aligned_storage<type_size, alignof(alignment)>::type m_data; \
254 template <typename ...Args> alias(Args&& ...args) { new (&m_data) value_type(std::forward<Args>(args)...); } \
255 alias(const alias &other) { new (&m_data) value_type(*reinterpret_cast<const value_type*>(&other.m_data)); } \
256 alias(alias&& other) noexcept { new(&m_data) value_type(std::move(*reinterpret_cast<value_type*>(&other.m_data))); }\
257 alias& operator = (const alias &other) { if (this == std::addressof(other)) { return *this; } ; *reinterpret_cast<value_type*>(&m_data) = *reinterpret_cast<const value_type*>(&other.m_data); return *this; } \
258 alias& operator = (alias&& other) noexcept { if (this == std::addressof(other)) { return *this; } ; *reinterpret_cast<value_type*>(&m_data) = std::move(*reinterpret_cast<value_type*>(&other.m_data)); return *this; } \
259 ~alias() { reinterpret_cast<value_type*>(&m_data)->~destructor_name(); } \
260 operator value_type& () { return *reinterpret_cast<value_type*>(&m_data); } \
261 operator const value_type& () const { return *reinterpret_cast<const value_type*>(&m_data); } \
262 value_type& operator * () { return *reinterpret_cast<value_type*>(&m_data); } \
263 const value_type& operator * () const { return *reinterpret_cast<const value_type*>(&m_data); } \
264 value_type* operator -> () { return reinterpret_cast<value_type*>(&m_data); } \
265 const value_type* operator -> () const { return reinterpret_cast<const value_type*>(&m_data); } \
266 value_type* operator & () { return reinterpret_cast<value_type*>(&m_data); } \
267 const value_type* operator & () const { return reinterpret_cast<const value_type*>(&m_data); } \
277 #define ASPOSECPP_3RD_PARTY_UNCOPYBALE_TYPE_HOLDER(type_name, destructor_name, type_size, alignment, alias) \
280 typedef type_name value_type; \
282 static_assert(sizeof(value_type) == type_size, "Wrong size of storage generated when wrapping type " #type_name "!"); \
283 static_assert(alignof(value_type) == alignof(alignment), "Wrong alignment '" #alignment "' specified for type " #type_name "!"); \
284 std::aligned_storage<type_size, alignof(alignment)>::type m_data; \
286 template <typename ...Args> alias(Args&& ...args) { new (&m_data) value_type(std::forward<Args>(args)...); } \
287 alias() { new (&m_data) value_type(); } \
288 alias(alias&& other) noexcept { new(&m_data) value_type(std::move(*reinterpret_cast<value_type*>(&other.m_data))); }\
289 alias& operator = (alias&& other) noexcept { if (this == std::addressof(other)) { return *this; } ; *reinterpret_cast<value_type*>(&m_data) = std::move(*reinterpret_cast<value_type*>(&other.m_data)); return *this; } \
290 ~alias() { reinterpret_cast<value_type*>(&m_data)->~destructor_name(); } \
291 operator value_type& () { return *reinterpret_cast<value_type*>(&m_data); } \
292 operator const value_type& () const { return *reinterpret_cast<const value_type*>(&m_data); } \
293 value_type& operator * () { return *reinterpret_cast<value_type*>(&m_data); } \
294 const value_type& operator * () const { return *reinterpret_cast<const value_type*>(&m_data); } \
295 value_type* operator -> () { return reinterpret_cast<value_type*>(&m_data); } \
296 const value_type* operator -> () const { return reinterpret_cast<const value_type*>(&m_data); } \
297 value_type* operator & () { return reinterpret_cast<value_type*>(&m_data); } \
298 const value_type* operator & () const { return reinterpret_cast<const value_type*>(&m_data); } \
302 #define ASPOSECPP_3RD_PARTY_TYPE_HOLDER_HIDDEN_TYPE(type_name, destructor_name, type_size, alignment, alias) \
303 ASPOSECPP_3RD_PARTY_TYPE_HOLDER(type_name, destructor_name, type_size, alignment, alias)
307 #define ASPOSECPP_3RD_PARTY_CLASS(type_name) class type_name;
310 #define ASPOSECPP_3RD_PARTY_STRUCT(type_name) struct type_name;
314 #define ASPOSECPP_3RD_PARTY_ENUM_CLASS_WITHOUT_UNDERLYING(type_name) enum class type_name;
318 #define ASPOSECPP_3RD_PARTY_ENUM_WITH_UNDERLYING(type_name, underlying) enum type_name : underlying;
319 #define ASPOSECPP_3RD_PARTY_ENUM_CLASS_WITH_UNDERLYING(type_name, underlying) enum class type_name : underlying;
322 #define ASPOSECPP_3RD_PARTY_ENUM(type_name) ASPOSECPP_3RD_PARTY_ENUM_WITH_UNDERLYING(type_name, std::underlying_type<::System::Detail::empty_enum>::type);
323 #define ASPOSECPP_3RD_PARTY_ENUM_CLASS(type_name) ASPOSECPP_3RD_PARTY_ENUM_CLASS_WITH_UNDERLYING(type_name, std::underlying_type<::System::Detail::empty_enum_class>::type);
328 #define ASPOSECPP_3RD_PARTY_TYPEDEF(name, type) typedef type name;
332 #define ASPOSECPP_3RD_PARTY_TYPEDEF_WITH_PTR(name, type) \
333 ASPOSECPP_3RD_PARTY_TYPEDEF(name, type) \
334 ASPOSECPP_3RD_PARTY_TYPEDEF(name##Ptr, type*)
340 #define ASPOSECPP_3RD_PARTY_CONSTANT(name, constant_type, value) namespace { constexpr constant_type name = value; }
347 #define ASPOSECPP_3RD_PARTY_ENUM_HOLDER(enum_name, underlying, alias) \
349 std::aligned_storage<sizeof(underlying), alignof(underlying)>::type m_data; \
351 alias(enum_name value); \
352 alias(const alias&); \
353 alias& operator = (const alias&); \
354 operator enum_name& (); \
355 operator enum_name (); \
356 enum_name* operator & (); \
357 const enum_name* operator & () const; \
368 #define ASPOSECPP_3RD_PARTY_TYPE_HOLDER(type_name, destructor_name, type_size, alignment, alias) \
370 std::aligned_storage<type_size, alignof(alignment)>::type m_data; \
372 template <typename ...Args> alias(Args&& ...args); \
373 alias(const alias&); \
374 alias(alias&& other) noexcept; \
375 alias& operator = (const alias&); \
376 alias& operator = (alias&& other) noexcept; \
378 operator type_name& (); \
379 operator const type_name& () const; \
380 type_name& operator * (); \
381 const type_name& operator * () const; \
382 type_name* operator -> (); \
383 const type_name* operator -> () const; \
384 type_name* operator & (); \
385 const type_name* operator & () const; \
395 #define ASPOSECPP_3RD_PARTY_UNCOPYBALE_TYPE_HOLDER(type_name, destructor_name, type_size, alignment, alias) \
397 std::aligned_storage<type_size, alignof(alignment)>::type m_data; \
399 template <typename ...Args> alias(Args&& ...args); \
400 alias(alias&& other) noexcept; \
401 alias& operator = (alias&& other) noexcept; \
403 operator type_name& (); \
404 operator const type_name& () const; \
405 type_name& operator * (); \
406 const type_name& operator * () const; \
407 type_name* operator -> (); \
408 const type_name* operator -> () const; \
409 type_name* operator & (); \
410 const type_name* operator & () const; \
421 #define ASPOSECPP_3RD_PARTY_TYPE_HOLDER_HIDDEN_TYPE(type_name, destructor_name, type_size, alignment, alias) \
423 std::aligned_storage<type_size, alignof(alignment)>::type m_data; \
425 template <typename ...T> alias(const T& ...args); \
432template <
int A,
int B,
int C,
int D>
435 typedef typename ::System::Detail::__InternalTypeStub<
sizeof(
int*), A, B, C, D>::type type;
439namespace System {
namespace Detail {
442 void ASPOSECPP_SHARED_API CodePortingCheckedCastAssert(
bool within_bounds);
449 template <
typename From,
typename To,
450 bool canUnderflow = std::numeric_limits<From>::is_signed && ((
sizeof(To) <
sizeof(From)) || !std::numeric_limits<To>::is_signed),
451 bool canOverflow = (
sizeof(To) <
sizeof(From)) || ((
sizeof(To) ==
sizeof(
From)) && !std::numeric_limits<From>::is_signed && std::numeric_limits<To>::is_signed)
453 struct AssertedFitter
455 static constexpr typename std::remove_cv<typename std::remove_reference<To>::type>::type convert(From value)
457 return static_cast<typename std::remove_cv<typename std::remove_reference<To>::type
>::type>(value);
465 template <
typename From,
typename To>
466 struct AssertedFitter<
From, To, true, true>
468 static constexpr typename std::remove_cv<typename std::remove_reference<To>::type>::type convert(From value)
470 CodePortingCheckedCastAssert(value >=
static_cast<typename std::remove_cv<typename std::remove_reference<From>::type
>::type>((std::numeric_limits<
typename std::remove_cv<
typename std::remove_reference<From>::type>::type>::min)()));
471 CodePortingCheckedCastAssert(value <=
static_cast<typename std::remove_cv<typename std::remove_reference<From>::type
>::type>((std::numeric_limits<
typename std::remove_cv<
typename std::remove_reference<From>::type>::type>::max)()));
472 return static_cast<typename std::remove_cv<typename std::remove_reference<To>::type
>::type>(value);
480 template <
typename From,
typename To>
481 struct AssertedFitter<
From, To, true, false>
483 static constexpr typename std::remove_cv<typename std::remove_reference<To>::type>::type convert(From value)
485 CodePortingCheckedCastAssert(value >=
static_cast<typename std::remove_cv<typename std::remove_reference<From>::type
>::type>((std::numeric_limits<
typename std::remove_cv<
typename std::remove_reference<From>::type>::type>::min)()));
486 return static_cast<typename std::remove_cv<typename std::remove_reference<To>::type
>::type>(value);
494 template <
typename From,
typename To>
495 struct AssertedFitter<
From, To, false, true>
497 static constexpr typename std::remove_cv<typename std::remove_reference<To>::type>::type convert(From value)
499 CodePortingCheckedCastAssert(value <=
static_cast<typename std::remove_cv<typename std::remove_reference<From>::type
>::type>((std::numeric_limits<
typename std::remove_cv<
typename std::remove_reference<From>::type>::type>::max)()));
500 return static_cast<typename std::remove_cv<typename std::remove_reference<To>::type
>::type>(value);
505#if defined(OPTIMIZE_ALL)
506 #define ASPOSECPP_NO_CHECKED_CASTS
509#if !defined(ASPOSE_NO_COMPARE_BY_REF)
510 #define ASPOSE_COMPARE_BY_REF
511#elif defined (ASPOSE_COMPARE_BY_REF)
512 #undef ASPOSE_COMPARE_BY_REF
515#if (defined(DEBUG) || defined(_DEBUG)) && !defined(ASPOSECPP_NO_CHECKED_CASTS)
516 #define ASPOSECPP_CHECKED_CAST(to, value) (::System::Detail::AssertedFitter<decltype(value), to>::convert(value))
518 #define ASPOSECPP_CHECKED_CAST(to, value) static_cast<to>(value)
529#if (defined(ENABLE_CYCLES_DETECTION_EXT) || defined(__DBG_GARBAGE_COLLECTION))
530#define ASPOSE_GET_SHARED_MEMBERS
533#define ASPOSE_UNUSED(arg) (void)arg;
535namespace System {
namespace Details {
539class BoxableObjectBase
543#ifdef __cpp_lib_is_invocable
544template <
typename T,
typename... Args>
545using ResultOf =
typename std::invoke_result<
T, Args...>::type;
547template <
typename T,
typename... Args>
548using ResultOf =
typename std::result_of<
T(Args...)>::type;
552#if CODEPORTING_CPP_STANDARD >= 17
554using IsPod =
typename std::bool_constant<std::is_standard_layout<T>::value && std::is_trivial<T>::value>;
557using IsPod =
typename std::is_pod<T>;
560#if CODEPORTING_CPP_STANDARD >= 17
562template <
class _Category,
class _Ty,
class _Diff = std::ptrdiff_t,
class _Po
inter = _Ty*,
class _Reference = _Ty&>
565 using iterator_category = _Category;
566 using value_type = _Ty;
567 using difference_type = _Diff;
568 using pointer = _Pointer;
569 using reference = _Reference;
572template <
class _Category,
class _Ty,
class _Diff = std::ptrdiff_t,
class _Po
inter = _Ty*,
class _Reference = _Ty&>
573using BaseIterator = std::iterator<_Category, _Ty, _Diff, _Pointer, _Reference>;
577#if CODEPORTING_CPP_STANDARD >= 17
579# pragma warning(push)
580# pragma warning(disable : 4996)
582# pragma clang diagnostic push
583# pragma clang diagnostic ignored "-Wdeprecated-declarations"
586inline std::wstring Utf8ToWString(
const char* utf8Str)
588 return std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,
wchar_t>().from_bytes(utf8Str);
590inline std::basic_string<char16_t> Utf8To16String(
const char* utf8Str)
592 return std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,
char16_t>().from_bytes(utf8Str);
594#if CODEPORTING_CPP_STANDARD >= 17
598# pragma clang diagnostic pop
608inline bool operator == (
const std::atomic_long &lhs,
int rhs)
610 return lhs.load() == rhs;
612# if CODEPORTING_CPP_STANDARD >= 20
614inline bool operator == (
const std::atomic_long &lhs,
long rhs)
616 return lhs.load() == rhs;
Definition: db_command.h:9