knowL: Knowledge Libraries
Loading...
Searching...
No Matches
Global.h
1#pragma once
2
3#include <QList>
4#include <QSharedPointer>
5#include <QString>
6#include <type_traits>
7
8#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
9#define KNOWCORE_QT_SKIP_EMPTY_PART Qt::SkipEmptyParts
10#else
11#define KNOWCORE_QT_SKIP_EMPTY_PART QString::SkipEmptyParts
12#endif
13
14#ifdef __GNU_LIBRARY__
15#ifndef __clang__
16#define KNOWCORE_GLIBC_CONSTEXPR constexpr
17#endif
18#endif
19
20// BEGIN knowCore Macros
21
22#ifndef KNOWCORE_GLIBC_CONSTEXPR
23#define KNOWCORE_GLIBC_CONSTEXPR
24#endif
25
26#if defined __has_builtin
27#define __KNOWCORE_HAS_BUILTIN(_X_) __has_builtin(_X_)
28#else
29#define __KNOWCORE_HAS_BUILTIN(_X_) 0
30#endif
31
32#define __KNOWCORE_STR_2(_X_) #_X_
33#define __KNOWCORE_STR(_X_) __KNOWCORE_STR_2(_X_)
34
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
38
39#ifdef __COUNTER__
40#define __KNOWCORE_UNIQUE_STATIC_NAME(_X_) __KNOWCORE_CAT(_X_, __COUNTER__)
41#else
42#define __KNOWCORE_UNIQUE_STATIC_NAME(_X_) __KNOWCORE_CAT(_X_, __LINE__)
43#endif
44
45#define __KNOWCORE_GET_2ND_ARG(s, arg1, arg2, ...) arg2
46
47#define KNOWCORE_UNPACK(...) __VA_ARGS__
48#define KNOWCORE_COMMA ,
49
50// BEGIN knowCore Foreach
51
52// The following macros are for internal use by knowCore, no warranty of behavior is guaranteed
53
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
76
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__)
137
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, ...) \
141 NAME
142
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__)
174
192#define KNOWCORE_FOREACH(action, ...) KNOWCORE_FOREACH_SEP(action, , __VA_ARGS__)
193
194// END knowCore Foreach
195
196#define __KNOWCORE_UNLIST_ACTION(__X__, __I__) __X__
197
201#define KNOWCORE_UNLIST(...) KNOWCORE_FOREACH(__KNOWCORE_UNLIST_ACTION, __VA_ARGS__)
202
203// BEGIN knowCore List
204
205#define __KNOWCORE_LIST_ACTION(__X__, __I__) , __X__
206
215#define KNOWCORE_LIST(__A__, ...) __A__ KNOWCORE_FOREACH(__KNOWCORE_LIST_ACTION, __VA_ARGS__)
216
217// END knowCore List
218
219// END Macros
220
221// BEGIN knowCore Literal Operators
222
223#if __cplusplus > 201703L
224inline QString operator"" _kCs(const char8_t* _text, std::size_t _size)
225{
226 return QString::fromUtf8((const char*)_text, _size);
227}
228#endif
229
230inline QString operator"" _kCs(const char* _text, std::size_t _size)
231{
232 return QString::fromUtf8((const char*)_text, _size);
233}
234
235namespace knowCore::details
236{
237 // From https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1423r3.html
238 template<std::size_t N>
240 {
241 static constexpr inline std::size_t size = N;
242 template<std::size_t... I>
243 constexpr char8_t_string_literal(const char8_t (&r)[N], std::index_sequence<I...>) : s{r[I]...}
244 {
245 }
246 constexpr char8_t_string_literal(const char8_t (&r)[N])
247 : char8_t_string_literal(r, std::make_index_sequence<N>())
248 {
249 }
250 auto operator<=>(const char8_t_string_literal&) const = default;
251 char8_t s[N];
252 };
253
254 template<char8_t_string_literal L, std::size_t... I>
255 constexpr inline const char as_char_buffer[sizeof...(I)] = {static_cast<char>(L.s[I])...};
256
257 template<char8_t_string_literal L, std::size_t... I>
258 constexpr auto& make_as_char_buffer(std::index_sequence<I...>)
259 {
260 return as_char_buffer<L, I...>;
261 }
262} // namespace knowCore::details
263
264constexpr char operator""_kC_as_char(char8_t c) { return c; }
265
273template<knowCore::details::char8_t_string_literal L>
274constexpr auto& operator""_kC_as_char()
275{
276 return knowCore::details::make_as_char_buffer<L>(std::make_index_sequence<decltype(L)::size>());
277}
278
279// END knowCore Literal Operators
280
281// BEGIN knowCore Utils and C++ extensions
282
283namespace knowCore
284{
285 // BEGIN demangle and prettyTypename
286 namespace details
287 {
291 QString demangle(const char* _mangled_symbol);
292 } // namespace details
296 template<typename _T_>
297 QString prettyTypename()
298 {
299 return details::demangle(typeid(_T_).name());
300 }
301 // END demangle and prettyTypename
302
303 namespace details
304 {
305
306 template<typename _T_>
308 {
309 DeleteAll(const QList<_T_>&) {}
310 };
311 template<typename _T_>
312 struct DeleteAll<_T_*>
313 {
314 DeleteAll(const QList<_T_*>& _list) { qDeleteAll(_list); }
315 };
316 } // namespace details
317 template<typename _T_>
318 void deleteAll(const QList<_T_>& _list)
319 {
320 (void)details::DeleteAll<_T_>(_list);
321 }
322
323 namespace details
324 {
333 template<typename T, typename... Ts>
334 struct contains : std::disjunction<std::is_same<T, Ts>...>
335 {
336 };
337 template<typename T, typename... Ts>
338 inline constexpr bool contains_v = contains<T, Ts...>::value;
339
340 //
341 // The following template can be used to detect if a class is fully implemented
342 //
343 template<typename T, class = void>
344 struct is_complete : std::false_type
345 {
346 };
347
348 template<typename T>
349 struct is_complete<T, decltype(void(sizeof(T)))> : std::true_type
350 {
351 };
352
353 template<typename... T>
354 inline constexpr bool is_complete_v = is_complete<T...>::value;
355
356 //
357 // The following template can be used to detect if a class is an instance of atempolate
358 //
359 namespace
360 {
361 template<typename, template<typename...> typename>
362 struct is_instance_impl : public std::false_type
363 {
364 };
365
366 template<template<typename...> typename U, typename... Ts>
367 struct is_instance_impl<U<Ts...>, U> : public std::true_type
368 {
369 };
370 } // namespace
371
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;
376
377 template<template<typename...> class Template, typename T>
378 struct is_specialisation_of : std::false_type
379 {
380 };
381
382 template<template<typename...> class Template, typename... Args>
383 struct is_specialisation_of<Template, Template<Args...>> : std::true_type
384 {
385 };
386
387 template<template<typename...> class Template, typename... Args>
388 inline constexpr bool is_specialisation_of_v = is_specialisation_of<Template, Args...>::value;
389 } // namespace details
401 template<class... Ts>
402 struct Overloaded : Ts...
403 {
404 using Ts::operator()...;
405 };
406} // namespace knowCore
407
408// END knowCore Utils and C++ extensions
409
410// BEGIN knowCore D-Pointer Utilities
411
412namespace knowCore::Private
413{
414 template<typename _TD_, typename _TS_, class Enable = void>
415 struct CastD
416 {
417 typedef _TD_* ReturnT;
418 static ReturnT get(_TS_ _t) { return static_cast<_TD_*>(_t); }
419 };
420 template<typename _TD_, typename _TS_>
421 requires(not std::is_const_v<_TD_>)
423 {
424 typedef _TD_* ReturnT;
425 static ReturnT get(_TS_ _t) { return const_cast<_TD_*>(static_cast<const _TD_*>(_t)); }
426 };
427 template<typename _TD_, typename _TS_>
428 struct CastD<_TD_, QSharedPointer<_TS_>>
429 {
430 typedef std::remove_const_t<_TD_> TD;
432 static ReturnT get(const QSharedPointer<_TS_> _t) { return _t.template staticCast<TD>(); }
433 };
434 template<typename _TD_, typename _TS_>
435 struct CastD<_TD_, QExplicitlySharedDataPointer<_TS_>>
436 {
437 typedef std::remove_const_t<_TD_> TD;
438 typedef QExplicitlySharedDataPointer<TD> ReturnT;
439 static ReturnT get(const QExplicitlySharedDataPointer<_TS_> _t)
440 {
441 return ReturnT(const_cast<TD*>(static_cast<_TD_*>(_t.data())));
442 }
443 };
444 template<typename _TD_, typename _TS_>
445 typename CastD<_TD_, _TS_>::ReturnT castD(const _TS_& _t)
446 {
447 return CastD<_TD_, _TS_>::get(_t);
448 };
449} // namespace knowCore::Private
450
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
460
461#define KNOWCORE_D_DECL() \
462 struct Private; \
463 __KNOWCORE_D_FUNC_DECL()
464
465#define KNOWCORE_D_FUNC_DEF(_KLASS_) \
466 decltype(knowCore::Private::castD<_KLASS_::Private>(static_cast<_KLASS_*>(nullptr)->d)) \
467 _KLASS_::D() \
468 { \
469 return knowCore::Private::castD<Private>(d); \
470 } \
471 decltype(knowCore::Private::castD<const _KLASS_::Private>(static_cast<_KLASS_*>(nullptr)->d)) \
472 _KLASS_::CD() \
473 { \
474 return knowCore::Private::castD<const Private>(d); \
475 } \
476 decltype(knowCore::Private::castD<_KLASS_::Private>(static_cast<_KLASS_*>(nullptr)->d)) \
477 _KLASS_::NCD() const \
478 { \
479 return knowCore::Private::castD<Private>(d); \
480 } \
481 decltype(knowCore::Private::castD<const _KLASS_::Private>(static_cast<_KLASS_*>(nullptr)->d)) \
482 _KLASS_::D() const \
483 { \
484 return knowCore::Private::castD<const Private>(d); \
485 }
486
487// END knowCore D-Pointer Utilities
488
489// BEGIN function forward
490
491#define KNOWCORE_FORWARD_INTERFACE_DEFAULT interface()
492
496#define KNOWCORE_FORWARD_INTERFACE KNOWCORE_FORWARD_INTERFACE_DEFAULT
497
498#define __KNOWCORE_FORWARD_CONST_FUNCTION_ACTION(__NAME__, __I__) \
499 auto __NAME__() const -> decltype(this->KNOWCORE_FORWARD_INTERFACE->__NAME__()) override \
500 { \
501 return this->KNOWCORE_FORWARD_INTERFACE->__NAME__(); \
502 }
503
504#define __KNOWCORE_FORWARD_FUNCTION_ACTION(__NAME__, __I__) \
505 auto __NAME__() -> decltype(this->KNOWCORE_FORWARD_INTERFACE->__NAME__()) override \
506 { \
507 return this->KNOWCORE_FORWARD_INTERFACE->__NAME__(); \
508 }
509
510#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_ACTION(__TYPE__, __I__) __TYPE__ _arg##__I__
511
512#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS(...) \
513 KNOWCORE_FOREACH_SEP(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_ACTION, KNOWCORE_COMMA, __VA_ARGS__)
514
515#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES_ACTION(__TYPE__, __I__) _arg##__I__
516
517#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES(...) \
518 KNOWCORE_FOREACH_SEP(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES_ACTION, KNOWCORE_COMMA, \
519 __VA_ARGS__)
520
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 \
525 { \
526 return this->KNOWCORE_FORWARD_INTERFACE->__NAME__( \
527 __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES(__VA_ARGS__)); \
528 }
529
544#define KNOWCORE_FORWARD_FUNCTION(__NAME__, ...) \
545 ___KNOWCORE_FORWARD_FUNCTION_IMPLEMENTATION(__NAME__, , __VA_ARGS__)
546
561#define KNOWCORE_FORWARD_CONST_FUNCTION(__NAME__, ...) \
562 ___KNOWCORE_FORWARD_FUNCTION_IMPLEMENTATION(__NAME__, const, __VA_ARGS__)
563
584#define KNOWCORE_FORWARD_FUNCTIONS(...) \
585public: \
586 KNOWCORE_FOREACH(__KNOWCORE_FORWARD_FUNCTION_ACTION, __VA_ARGS__)
587
608#define KNOWCORE_FORWARD_CONST_FUNCTIONS(...) \
609public: \
610 KNOWCORE_FOREACH(__KNOWCORE_FORWARD_CONST_FUNCTION_ACTION, __VA_ARGS__)
611
612// END function forward
613
614// BEGIN concepts
615
616namespace knowCore::details
617{
618 template<class Base, class Derived>
619 concept base_of = std::is_base_of_v<Base, Derived>;
620}
621
622// END concepts
623
624namespace knowCore
625{
626 template<typename _T_>
627 std::remove_reference<_T_>::type dereference(_T_&& _t)
628 {
629 return _t;
630 }
631} // namespace knowCore
632
633namespace knowCore
634{
635 template<size_t N>
637 {
638 constexpr FixedString(const char (&str)[N]) { std::copy_n(str, N, value); }
639
640 char value[N];
641 };
642} // namespace knowCore
Definition Forward.h:14
Definition Forward.h:6
Definition Global.h:619
Definition Global.h:637
Definition Global.h:403
Definition Global.h:416
Definition Global.h:308
Definition Global.h:335
Definition Global.h:345