5#include <QSharedPointer>
8#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
9#define KNOWCORE_QT_SKIP_EMPTY_PART Qt::SkipEmptyParts
11#define KNOWCORE_QT_SKIP_EMPTY_PART QString::SkipEmptyParts
16#define KNOWCORE_GLIBC_CONSTEXPR constexpr
22#ifndef KNOWCORE_GLIBC_CONSTEXPR
23#define KNOWCORE_GLIBC_CONSTEXPR
26#if defined __has_builtin
27#define __KNOWCORE_HAS_BUILTIN(_X_) __has_builtin(_X_)
29#define __KNOWCORE_HAS_BUILTIN(_X_) 0
32#define __KNOWCORE_STR_2(_X_) # _X_
33#define __KNOWCORE_STR(_X_) __KNOWCORE_STR_2(_X_)
35#define __KNOWCORE_CAT(a, b) __KNOWCORE_CAT_I(a, b)
36#define __KNOWCORE_CAT_I(a, b) __KNOWCORE_CAT_II(~, a ## b)
37#define __KNOWCORE_CAT_II(p, res) res
40#define __KNOWCORE_UNIQUE_STATIC_NAME(_X_) __KNOWCORE_CAT(_X_, __COUNTER__)
42#define __KNOWCORE_UNIQUE_STATIC_NAME(_X_) __KNOWCORE_CAT(_X_, __LINE__)
45#define __KNOWCORE_GET_2ND_ARG(s, arg1, arg2, ...) arg2
47#define KNOWCORE_UNPACK(...) __VA_ARGS__
48#define KNOWCORE_COMMA ,
54#define __KNOWCORE_INC(I) __KNOWCORE_INC_## I
55#define __KNOWCORE_INC_0 1
56#define __KNOWCORE_INC_1 2
57#define __KNOWCORE_INC_2 3
58#define __KNOWCORE_INC_3 4
59#define __KNOWCORE_INC_4 5
60#define __KNOWCORE_INC_5 6
61#define __KNOWCORE_INC_6 7
62#define __KNOWCORE_INC_7 8
63#define __KNOWCORE_INC_8 9
64#define __KNOWCORE_INC_9 10
65#define __KNOWCORE_INC_10 11
66#define __KNOWCORE_INC_11 12
67#define __KNOWCORE_INC_12 13
68#define __KNOWCORE_INC_13 14
69#define __KNOWCORE_INC_14 15
70#define __KNOWCORE_INC_15 16
71#define __KNOWCORE_INC_16 17
72#define __KNOWCORE_INC_17 18
73#define __KNOWCORE_INC_18 19
74#define __KNOWCORE_INC_19 20
75#define __KNOWCORE_INC_20 21
77#define __KNOWCORE_FOREACH__0(WHAT, SEP, I, ...)
78#define __KNOWCORE_FOREACH__1(WHAT, SEP, I, X, ...) WHAT(X, I)
79#define __KNOWCORE_FOREACH__2(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__1(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
80#define __KNOWCORE_FOREACH__3(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__2(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
81#define __KNOWCORE_FOREACH__4(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__3(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
82#define __KNOWCORE_FOREACH__5(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__4(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
83#define __KNOWCORE_FOREACH__6(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__5(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
84#define __KNOWCORE_FOREACH__7(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__6(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
85#define __KNOWCORE_FOREACH__8(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__7(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
86#define __KNOWCORE_FOREACH__9(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__8(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
87#define __KNOWCORE_FOREACH__10(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__9(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
88#define __KNOWCORE_FOREACH__11(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__10(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
89#define __KNOWCORE_FOREACH__12(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__11(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
90#define __KNOWCORE_FOREACH__13(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__12(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
91#define __KNOWCORE_FOREACH__14(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__13(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
92#define __KNOWCORE_FOREACH__15(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__14(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
93#define __KNOWCORE_FOREACH__16(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__15(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
94#define __KNOWCORE_FOREACH__17(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__16(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
95#define __KNOWCORE_FOREACH__18(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__17(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
96#define __KNOWCORE_FOREACH__19(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__18(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
97#define __KNOWCORE_FOREACH__20(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__19(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
98#define __KNOWCORE_FOREACH__21(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__20(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
99#define __KNOWCORE_FOREACH__22(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__21(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
100#define __KNOWCORE_FOREACH__23(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__22(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
101#define __KNOWCORE_FOREACH__24(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__23(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
102#define __KNOWCORE_FOREACH__25(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__24(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
103#define __KNOWCORE_FOREACH__26(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__25(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
104#define __KNOWCORE_FOREACH__27(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__26(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
105#define __KNOWCORE_FOREACH__28(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__27(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
106#define __KNOWCORE_FOREACH__29(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__28(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
107#define __KNOWCORE_FOREACH__30(WHAT, SEP, I, X, ...) WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__29(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
109#define __KNOWCORE_GET_MACRO(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, NAME, ...) NAME
129#define KNOWCORE_FOREACH_SEP(action, sep, ...) \
130 __KNOWCORE_GET_MACRO(void, __VA_ARGS__ __VA_OPT__(,) \
131 __KNOWCORE_FOREACH__29, __KNOWCORE_FOREACH__28, __KNOWCORE_FOREACH__27, __KNOWCORE_FOREACH__26, __KNOWCORE_FOREACH__25, __KNOWCORE_FOREACH__24, __KNOWCORE_FOREACH__23, __KNOWCORE_FOREACH__22, __KNOWCORE_FOREACH__21, __KNOWCORE_FOREACH__20, \
132 __KNOWCORE_FOREACH__19, __KNOWCORE_FOREACH__18, __KNOWCORE_FOREACH__17, __KNOWCORE_FOREACH__16, __KNOWCORE_FOREACH__15, __KNOWCORE_FOREACH__14, __KNOWCORE_FOREACH__13, __KNOWCORE_FOREACH__12, __KNOWCORE_FOREACH__11, __KNOWCORE_FOREACH__10, \
133 __KNOWCORE_FOREACH__9, __KNOWCORE_FOREACH__8, __KNOWCORE_FOREACH__7, __KNOWCORE_FOREACH__6, __KNOWCORE_FOREACH__5, __KNOWCORE_FOREACH__4, __KNOWCORE_FOREACH__3, __KNOWCORE_FOREACH__2, __KNOWCORE_FOREACH__1, __KNOWCORE_FOREACH__0)(action, (sep), 0, __VA_ARGS__)
152#define KNOWCORE_FOREACH(action, ...) KNOWCORE_FOREACH_SEP(action, , __VA_ARGS__)
156#define __KNOWCORE_UNLIST_ACTION(__X__, __I__) __X__
161#define KNOWCORE_UNLIST(...) KNOWCORE_FOREACH(__KNOWCORE_UNLIST_ACTION, __VA_ARGS__)
165#define __KNOWCORE_LIST_ACTION(__X__, __I__) , __X__
175#define KNOWCORE_LIST(__A__, ...) __A__ KNOWCORE_FOREACH(__KNOWCORE_LIST_ACTION, __VA_ARGS__)
183#if __cplusplus > 201703L
184inline QString
operator "" _kCs(
const char8_t* _text, std::size_t _size)
186 return QString::fromUtf8((
const char*)_text, _size);
190inline QString
operator "" _kCs(
const char* _text, std::size_t _size)
192 return QString::fromUtf8((
const char*)_text, _size);
195namespace knowCore::details
198 template<std::
size_t N>
200 static constexpr inline std::size_t size = N;
201 template<std::size_t... I>
203 const char8_t (&r)[N],
204 std::index_sequence<I...>)
209 const char8_t (&r)[N])
218 constexpr inline const char as_char_buffer[
sizeof...(I)] =
219 {
static_cast<char>(L.s[I])... };
221 template<char8_t_string_literal L, std::size_t... I>
222 constexpr auto& make_as_char_buffer(std::index_sequence<I...>) {
223 return as_char_buffer<L, I...>;
227constexpr char operator ""_kC_as_char(
char8_t c) {
238template<knowCore::details::
char8_t_
string_literal L>
239constexpr auto&
operator""_kC_as_char() {
240 return knowCore::details::make_as_char_buffer<L>(std::make_index_sequence<
decltype(L)::size>());
255 QString demangle(
const char* _mangled_symbol);
260 template<
typename _T_>
261 QString prettyTypename()
263 return details::demangle(
typeid(_T_).name());
269 template<
typename _T_>
273 template<
typename _T_>
280 template<
typename _T_>
289 template<
typename _T_>
290 inline constexpr bool exists_v = std::true_type::value;
291 template<
typename _T_,
typename _T2_>
292 using enable_if_exists_t = std::enable_if_t<details::exists_v<_T_>, _T2_>;
302 template<
typename T,
typename... Ts>
303 struct contains : std::disjunction<std::is_same<T, Ts>...>
305 template<
typename T,
typename... Ts>
306 inline constexpr bool contains_v =
contains<T, Ts...>::value;
312 template <
typename T,
typename ...Rest>
struct all_int<T, Rest...>
313 : std::integral_constant<bool,
314 std::is_convertible<T, int>::value && all_int<Rest...>::value>
317 template <
typename... T>
318 inline constexpr bool all_int_v =
all_int<T...>::value;
320 template<
typename _T_>
329 template <
typename T,
class =
void>
332 template <
typename T>
333 struct is_complete<T,decltype(void(sizeof(T)))> : std::true_type {};
335 template <
typename... T>
336 inline constexpr bool is_complete_v =
is_complete<T...>::value;
343 template <
typename,
template <
typename...>
typename>
344 struct is_instance_impl :
public std::false_type {};
346 template <
template <
typename...>
typename U,
typename...Ts>
347 struct is_instance_impl<U<Ts...>, U> :
public std::true_type {};
350 template <
typename T,
template <
typename ...>
typename U>
351 using is_instance = is_instance_impl<std::decay_t<T>, U>;
352 template <
typename T,
template <
typename ...>
typename U>
353 inline constexpr bool is_instance_v = is_instance<T, U>::value;
355 template <
template <
typename...>
class Template,
typename T >
358 template <
template <
typename...>
class Template,
typename... Args >
361 template<
template <
typename...>
class Template,
typename... Args >
375 template<
class... Ts>
383namespace knowCore::Private
385 template<
typename _TD_,
typename _TS_,
class Enable =
void>
388 typedef _TD_* ReturnT;
389 static ReturnT get(_TS_ _t)
391 return static_cast<_TD_*
>(_t);
394 template<
typename _TD_,
typename _TS_>
395 struct CastD<_TD_, const _TS_, std::enable_if_t<not std::is_const_v<_TD_>>>
397 typedef _TD_* ReturnT;
398 static ReturnT get(_TS_ _t)
400 return const_cast<_TD_*
>(
static_cast<const _TD_*
>(_t));
403 template<
typename _TD_,
typename _TS_>
406 typedef std::remove_const_t<_TD_> TD;
410 return _t.template staticCast<TD>();
413 template<
typename _TD_,
typename _TS_>
414 struct CastD<_TD_, QExplicitlySharedDataPointer<_TS_>>
416 typedef std::remove_const_t<_TD_> TD;
417 typedef QExplicitlySharedDataPointer<TD> ReturnT;
418 static ReturnT get(
const QExplicitlySharedDataPointer<_TS_> _t)
420 return ReturnT(
const_cast<TD*
>(
static_cast<_TD_*
>(_t.data())));
423 template<
typename _TD_,
typename _TS_>
424 typename CastD<_TD_, _TS_>::ReturnT castD(
const _TS_& _t)
434#define __KNOWCORE_D_FUNC_DECL() \
435 inline decltype(knowCore::Private::castD<Private>(d)) D(); \
436 inline decltype(knowCore::Private::castD<const Private>(d)) CD(); \
437 inline decltype(knowCore::Private::castD<Private>(d)) NCD() const; \
438 inline decltype(knowCore::Private::castD<const Private>(d)) D() const
440#define KNOWCORE_D_DECL() \
442 __KNOWCORE_D_FUNC_DECL()
444#define KNOWCORE_D_FUNC_DEF(_KLASS_) \
445 decltype(knowCore::Private::castD<_KLASS_::Private>(static_cast<_KLASS_*>(nullptr)->d)) _KLASS_::D() \
446 { return knowCore::Private::castD<Private>(d); } \
447 decltype(knowCore::Private::castD<const _KLASS_::Private>(static_cast<_KLASS_*>(nullptr)->d)) _KLASS_::CD() \
448 { return knowCore::Private::castD<const Private>(d); } \
449 decltype(knowCore::Private::castD<_KLASS_::Private>(static_cast<_KLASS_*>(nullptr)->d)) _KLASS_::NCD() const \
450 { return knowCore::Private::castD<Private>(d); } \
451 decltype(knowCore::Private::castD<const _KLASS_::Private>(static_cast<_KLASS_*>(nullptr)->d)) _KLASS_::D() const \
452 { return knowCore::Private::castD<const Private>(d); }
458#define KNOWCORE_FORWARD_INTERFACE_DEFAULT interface()
463#define KNOWCORE_FORWARD_INTERFACE KNOWCORE_FORWARD_INTERFACE_DEFAULT
465#define __KNOWCORE_FORWARD_CONST_FUNCTION_ACTION(__NAME__, __I__) \
466 auto __NAME__() const \
467 -> decltype(this->KNOWCORE_FORWARD_INTERFACE->__NAME__()) override \
469 return this->KNOWCORE_FORWARD_INTERFACE->__NAME__(); \
472#define __KNOWCORE_FORWARD_FUNCTION_ACTION(__NAME__, __I__) \
473 auto __NAME__() -> decltype(this->KNOWCORE_FORWARD_INTERFACE->__NAME__()) override \
475 return this->KNOWCORE_FORWARD_INTERFACE->__NAME__(); \
478#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_ACTION(__TYPE__, __I__) \
479 __TYPE__ _arg ## __I__
481#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS(...) \
482 KNOWCORE_FOREACH_SEP(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_ACTION, KNOWCORE_COMMA, __VA_ARGS__)
484#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES_ACTION(__TYPE__, __I__) \
487#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES(...) \
488 KNOWCORE_FOREACH_SEP(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES_ACTION, KNOWCORE_COMMA, __VA_ARGS__)
490#define ___KNOWCORE_FORWARD_FUNCTION_IMPLEMENTATION(__NAME__, __MODIFIER__, ...) \
491 auto __NAME__(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS(__VA_ARGS__)) __MODIFIER__ \
492 -> decltype(this->KNOWCORE_FORWARD_INTERFACE->__NAME__(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES(__VA_ARGS__))) override \
494 return this->KNOWCORE_FORWARD_INTERFACE->__NAME__(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES(__VA_ARGS__)); \
511#define KNOWCORE_FORWARD_FUNCTION(__NAME__, ...) \
512 ___KNOWCORE_FORWARD_FUNCTION_IMPLEMENTATION(__NAME__,, __VA_ARGS__)
528#define KNOWCORE_FORWARD_CONST_FUNCTION(__NAME__, ...) \
529 ___KNOWCORE_FORWARD_FUNCTION_IMPLEMENTATION(__NAME__, const, __VA_ARGS__)
551#define KNOWCORE_FORWARD_FUNCTIONS(...) \
553 KNOWCORE_FOREACH(__KNOWCORE_FORWARD_FUNCTION_ACTION, __VA_ARGS__)
574#define KNOWCORE_FORWARD_CONST_FUNCTIONS(...) \
576 KNOWCORE_FOREACH(__KNOWCORE_FORWARD_CONST_FUNCTION_ACTION, __VA_ARGS__)
582namespace knowCore::details
584 template<
class Base,
class Derived>
585 concept base_of = std::is_base_of_v<Base, Derived>;