4#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, ...) \
80 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__1(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
81#define __KNOWCORE_FOREACH__3(WHAT, SEP, I, X, ...) \
82 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__2(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
83#define __KNOWCORE_FOREACH__4(WHAT, SEP, I, X, ...) \
84 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__3(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
85#define __KNOWCORE_FOREACH__5(WHAT, SEP, I, X, ...) \
86 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__4(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
87#define __KNOWCORE_FOREACH__6(WHAT, SEP, I, X, ...) \
88 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__5(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
89#define __KNOWCORE_FOREACH__7(WHAT, SEP, I, X, ...) \
90 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__6(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
91#define __KNOWCORE_FOREACH__8(WHAT, SEP, I, X, ...) \
92 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__7(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
93#define __KNOWCORE_FOREACH__9(WHAT, SEP, I, X, ...) \
94 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__8(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
95#define __KNOWCORE_FOREACH__10(WHAT, SEP, I, X, ...) \
96 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__9(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
97#define __KNOWCORE_FOREACH__11(WHAT, SEP, I, X, ...) \
98 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__10(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
99#define __KNOWCORE_FOREACH__12(WHAT, SEP, I, X, ...) \
100 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__11(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
101#define __KNOWCORE_FOREACH__13(WHAT, SEP, I, X, ...) \
102 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__12(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
103#define __KNOWCORE_FOREACH__14(WHAT, SEP, I, X, ...) \
104 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__13(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
105#define __KNOWCORE_FOREACH__15(WHAT, SEP, I, X, ...) \
106 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__14(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
107#define __KNOWCORE_FOREACH__16(WHAT, SEP, I, X, ...) \
108 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__15(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
109#define __KNOWCORE_FOREACH__17(WHAT, SEP, I, X, ...) \
110 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__16(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
111#define __KNOWCORE_FOREACH__18(WHAT, SEP, I, X, ...) \
112 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__17(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
113#define __KNOWCORE_FOREACH__19(WHAT, SEP, I, X, ...) \
114 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__18(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
115#define __KNOWCORE_FOREACH__20(WHAT, SEP, I, X, ...) \
116 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__19(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
117#define __KNOWCORE_FOREACH__21(WHAT, SEP, I, X, ...) \
118 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__20(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
119#define __KNOWCORE_FOREACH__22(WHAT, SEP, I, X, ...) \
120 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__21(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
121#define __KNOWCORE_FOREACH__23(WHAT, SEP, I, X, ...) \
122 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__22(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
123#define __KNOWCORE_FOREACH__24(WHAT, SEP, I, X, ...) \
124 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__23(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
125#define __KNOWCORE_FOREACH__25(WHAT, SEP, I, X, ...) \
126 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__24(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
127#define __KNOWCORE_FOREACH__26(WHAT, SEP, I, X, ...) \
128 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__25(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
129#define __KNOWCORE_FOREACH__27(WHAT, SEP, I, X, ...) \
130 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__26(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
131#define __KNOWCORE_FOREACH__28(WHAT, SEP, I, X, ...) \
132 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__27(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
133#define __KNOWCORE_FOREACH__29(WHAT, SEP, I, X, ...) \
134 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__28(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
135#define __KNOWCORE_FOREACH__30(WHAT, SEP, I, X, ...) \
136 WHAT(X, I) KNOWCORE_UNPACK SEP __KNOWCORE_FOREACH__29(WHAT, SEP, __KNOWCORE_INC(I), __VA_ARGS__)
138#define __KNOWCORE_FOREACH_GET_MACRO(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, \
139 _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, \
140 _26, _27, _28, _29, NAME, ...) \
161#define KNOWCORE_FOREACH_SEP(action, sep, ...) \
162 __KNOWCORE_FOREACH_GET_MACRO( \
163 void, __VA_ARGS__ __VA_OPT__(, ) __KNOWCORE_FOREACH__29, __KNOWCORE_FOREACH__28, \
164 __KNOWCORE_FOREACH__27, __KNOWCORE_FOREACH__26, __KNOWCORE_FOREACH__25, \
165 __KNOWCORE_FOREACH__24, __KNOWCORE_FOREACH__23, __KNOWCORE_FOREACH__22, \
166 __KNOWCORE_FOREACH__21, __KNOWCORE_FOREACH__20, __KNOWCORE_FOREACH__19, \
167 __KNOWCORE_FOREACH__18, __KNOWCORE_FOREACH__17, __KNOWCORE_FOREACH__16, \
168 __KNOWCORE_FOREACH__15, __KNOWCORE_FOREACH__14, __KNOWCORE_FOREACH__13, \
169 __KNOWCORE_FOREACH__12, __KNOWCORE_FOREACH__11, __KNOWCORE_FOREACH__10, __KNOWCORE_FOREACH__9, \
170 __KNOWCORE_FOREACH__8, __KNOWCORE_FOREACH__7, __KNOWCORE_FOREACH__6, __KNOWCORE_FOREACH__5, \
171 __KNOWCORE_FOREACH__4, __KNOWCORE_FOREACH__3, __KNOWCORE_FOREACH__2, __KNOWCORE_FOREACH__1, \
172 __KNOWCORE_FOREACH__0) \
173 (action, (sep), 0, __VA_ARGS__)
192#define KNOWCORE_FOREACH(action, ...) KNOWCORE_FOREACH_SEP(action, , __VA_ARGS__)
196#define __KNOWCORE_UNLIST_ACTION(__X__, __I__) __X__
201#define KNOWCORE_UNLIST(...) KNOWCORE_FOREACH(__KNOWCORE_UNLIST_ACTION, __VA_ARGS__)
205#define __KNOWCORE_LIST_ACTION(__X__, __I__) , __X__
215#define KNOWCORE_LIST(__A__, ...) __A__ KNOWCORE_FOREACH(__KNOWCORE_LIST_ACTION, __VA_ARGS__)
223#if __cplusplus > 201703L
224inline QString
operator"" _kCs(
const char8_t* _text, std::size_t _size)
226 return QString::fromUtf8((
const char*)_text, _size);
230inline QString
operator"" _kCs(
const char* _text, std::size_t _size)
232 return QString::fromUtf8((
const char*)_text, _size);
235namespace knowCore::details
238 template<std::
size_t N>
241 static constexpr inline std::size_t size = N;
242 template<std::size_t... I>
255 constexpr inline const char as_char_buffer[
sizeof...(I)] = {
static_cast<char>(L.s[I])...};
257 template<char8_t_string_literal L, std::size_t... I>
258 constexpr auto& make_as_char_buffer(std::index_sequence<I...>)
260 return as_char_buffer<L, I...>;
264constexpr char operator""_kC_as_char(
char8_t c) {
return c; }
273template<knowCore::details::
char8_t_
string_literal L>
274constexpr auto&
operator""_kC_as_char()
276 return knowCore::details::make_as_char_buffer<L>(std::make_index_sequence<
decltype(L)::size>());
291 QString demangle(
const char* _mangled_symbol);
296 template<
typename _T_>
297 QString prettyTypename()
299 return details::demangle(
typeid(_T_).name());
306 template<
typename _T_>
311 template<
typename _T_>
317 template<
typename _T_>
333 template<
typename T,
typename... Ts>
334 struct contains : std::disjunction<std::is_same<T, Ts>...>
337 template<
typename T,
typename... Ts>
338 inline constexpr bool contains_v =
contains<T, Ts...>::value;
343 template<
typename T,
class =
void>
353 template<
typename... T>
354 inline constexpr bool is_complete_v =
is_complete<T...>::value;
361 template<
typename,
template<
typename...>
typename>
362 struct is_instance_impl :
public std::false_type
366 template<
template<
typename...>
typename U,
typename... Ts>
367 struct is_instance_impl<U<Ts...>, U> :
public std::true_type
372 template<
typename T,
template<
typename...>
typename U>
373 using is_instance = is_instance_impl<std::decay_t<T>, U>;
374 template<
typename T,
template<
typename...>
typename U>
375 inline constexpr bool is_instance_v = is_instance<T, U>::value;
377 template<
template<
typename...>
class Template,
typename T>
382 template<
template<
typename...>
class Template,
typename... Args>
387 template<
template<
typename...>
class Template,
typename... Args>
401 template<
class... Ts>
404 using Ts::operator()...;
412namespace knowCore::Private
414 template<
typename _TD_,
typename _TS_,
class Enable =
void>
417 typedef _TD_* ReturnT;
418 static ReturnT get(_TS_ _t) {
return static_cast<_TD_*
>(_t); }
420 template<
typename _TD_,
typename _TS_>
421 requires(not std::is_const_v<_TD_>)
424 typedef _TD_* ReturnT;
425 static ReturnT get(_TS_ _t) {
return const_cast<_TD_*
>(
static_cast<const _TD_*
>(_t)); }
427 template<
typename _TD_,
typename _TS_>
430 typedef std::remove_const_t<_TD_> TD;
434 template<
typename _TD_,
typename _TS_>
435 struct CastD<_TD_, QExplicitlySharedDataPointer<_TS_>>
437 typedef std::remove_const_t<_TD_> TD;
438 typedef QExplicitlySharedDataPointer<TD> ReturnT;
439 static ReturnT get(
const QExplicitlySharedDataPointer<_TS_> _t)
441 return ReturnT(
const_cast<TD*
>(
static_cast<_TD_*
>(_t.data())));
444 template<
typename _TD_,
typename _TS_>
445 typename CastD<_TD_, _TS_>::ReturnT castD(
const _TS_& _t)
455#define __KNOWCORE_D_FUNC_DECL() \
456 inline decltype(knowCore::Private::castD<Private>(d)) D(); \
457 inline decltype(knowCore::Private::castD<const Private>(d)) CD(); \
458 inline decltype(knowCore::Private::castD<Private>(d)) NCD() const; \
459 inline decltype(knowCore::Private::castD<const Private>(d)) D() const
461#define KNOWCORE_D_DECL() \
463 __KNOWCORE_D_FUNC_DECL()
465#define KNOWCORE_D_FUNC_DEF(_KLASS_) \
466 decltype(knowCore::Private::castD<_KLASS_::Private>(static_cast<_KLASS_*>(nullptr)->d)) \
469 return knowCore::Private::castD<Private>(d); \
471 decltype(knowCore::Private::castD<const _KLASS_::Private>(static_cast<_KLASS_*>(nullptr)->d)) \
474 return knowCore::Private::castD<const Private>(d); \
476 decltype(knowCore::Private::castD<_KLASS_::Private>(static_cast<_KLASS_*>(nullptr)->d)) \
477 _KLASS_::NCD() const \
479 return knowCore::Private::castD<Private>(d); \
481 decltype(knowCore::Private::castD<const _KLASS_::Private>(static_cast<_KLASS_*>(nullptr)->d)) \
484 return knowCore::Private::castD<const Private>(d); \
491#define KNOWCORE_FORWARD_INTERFACE_DEFAULT interface()
496#define KNOWCORE_FORWARD_INTERFACE KNOWCORE_FORWARD_INTERFACE_DEFAULT
498#define __KNOWCORE_FORWARD_CONST_FUNCTION_ACTION(__NAME__, __I__) \
499 auto __NAME__() const -> decltype(this->KNOWCORE_FORWARD_INTERFACE->__NAME__()) override \
501 return this->KNOWCORE_FORWARD_INTERFACE->__NAME__(); \
504#define __KNOWCORE_FORWARD_FUNCTION_ACTION(__NAME__, __I__) \
505 auto __NAME__() -> decltype(this->KNOWCORE_FORWARD_INTERFACE->__NAME__()) override \
507 return this->KNOWCORE_FORWARD_INTERFACE->__NAME__(); \
510#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_ACTION(__TYPE__, __I__) __TYPE__ _arg##__I__
512#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS(...) \
513 KNOWCORE_FOREACH_SEP(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_ACTION, KNOWCORE_COMMA, __VA_ARGS__)
515#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES_ACTION(__TYPE__, __I__) _arg##__I__
517#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES(...) \
518 KNOWCORE_FOREACH_SEP(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES_ACTION, KNOWCORE_COMMA, \
521#define ___KNOWCORE_FORWARD_FUNCTION_IMPLEMENTATION(__NAME__, __MODIFIER__, ...) \
522 auto __NAME__(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS(__VA_ARGS__)) \
523 __MODIFIER__ -> decltype(this->KNOWCORE_FORWARD_INTERFACE->__NAME__( \
524 __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES(__VA_ARGS__))) override \
526 return this->KNOWCORE_FORWARD_INTERFACE->__NAME__( \
527 __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES(__VA_ARGS__)); \
544#define KNOWCORE_FORWARD_FUNCTION(__NAME__, ...) \
545 ___KNOWCORE_FORWARD_FUNCTION_IMPLEMENTATION(__NAME__, , __VA_ARGS__)
561#define KNOWCORE_FORWARD_CONST_FUNCTION(__NAME__, ...) \
562 ___KNOWCORE_FORWARD_FUNCTION_IMPLEMENTATION(__NAME__, const, __VA_ARGS__)
584#define KNOWCORE_FORWARD_FUNCTIONS(...) \
586 KNOWCORE_FOREACH(__KNOWCORE_FORWARD_FUNCTION_ACTION, __VA_ARGS__)
608#define KNOWCORE_FORWARD_CONST_FUNCTIONS(...) \
610 KNOWCORE_FOREACH(__KNOWCORE_FORWARD_CONST_FUNCTION_ACTION, __VA_ARGS__)
616namespace knowCore::details
618 template<
class Base,
class Derived>
619 concept base_of = std::is_base_of_v<Base, Derived>;
626 template<
typename _T_>
627 std::remove_reference<_T_>::type dereference(_T_&& _t)
638 constexpr FixedString(
const char (&str)[N]) { std::copy_n(str, N, value); }