knowL: Knowledge Libraries
Loading...
Searching...
No Matches
Global.h
1#pragma once
2
3#include <type_traits>
4#include <QList>
5#include <QSharedPointer>
6#include <QString>
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, ...) 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__)
108
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
110
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__)
134
152#define KNOWCORE_FOREACH(action, ...) KNOWCORE_FOREACH_SEP(action, , __VA_ARGS__)
153
154//END knowCore Foreach
155
156#define __KNOWCORE_UNLIST_ACTION(__X__, __I__) __X__
157
161#define KNOWCORE_UNLIST(...) KNOWCORE_FOREACH(__KNOWCORE_UNLIST_ACTION, __VA_ARGS__)
162
163//BEGIN knowCore List
164
165#define __KNOWCORE_LIST_ACTION(__X__, __I__) , __X__
166
175#define KNOWCORE_LIST(__A__, ...) __A__ KNOWCORE_FOREACH(__KNOWCORE_LIST_ACTION, __VA_ARGS__)
176
177//END knowCore List
178
179//END Macros
180
181//BEGIN knowCore Literal Operators
182
183#if __cplusplus > 201703L
184inline QString operator "" _kCs(const char8_t* _text, std::size_t _size)
185{
186 return QString::fromUtf8((const char*)_text, _size);
187}
188#endif
189
190inline QString operator "" _kCs(const char* _text, std::size_t _size)
191{
192 return QString::fromUtf8((const char*)_text, _size);
193}
194
195namespace knowCore::details
196{
197 // From https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1423r3.html
198 template<std::size_t N>
200 static constexpr inline std::size_t size = N;
201 template<std::size_t... I>
202 constexpr char8_t_string_literal(
203 const char8_t (&r)[N],
204 std::index_sequence<I...>)
205 :
206 s{r[I]...}
207 {}
208 constexpr char8_t_string_literal(
209 const char8_t (&r)[N])
210 :
211 char8_t_string_literal(r, std::make_index_sequence<N>())
212 {}
213 auto operator <=>(const char8_t_string_literal&) const = default;
214 char8_t s[N];
215 };
216
217 template<char8_t_string_literal L, std::size_t... I>
218 constexpr inline const char as_char_buffer[sizeof...(I)] =
219 { static_cast<char>(L.s[I])... };
220
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...>;
224 }
225}
226
227constexpr char operator ""_kC_as_char(char8_t c) {
228 return c;
229}
230
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>());
241}
242
243//END knowCore Literal Operators
244
245//BEGIN knowCore Utils and C++ extensions
246
247namespace knowCore
248{
249 //BEGIN demangle and prettyTypename
250 namespace details
251 {
255 QString demangle(const char* _mangled_symbol);
256 }
260 template<typename _T_>
261 QString prettyTypename()
262 {
263 return details::demangle(typeid(_T_).name());
264 }
265//END demangle and prettyTypename
266
267 namespace details {
268
269 template<typename _T_>
270 struct DeleteAll {
271 DeleteAll(const QList<_T_>&) {}
272 };
273 template<typename _T_>
274 struct DeleteAll<_T_*> {
275 DeleteAll(const QList<_T_*>& _list) {
276 qDeleteAll(_list);
277 }
278 };
279 }
280 template<typename _T_>
281 void deleteAll(const QList<_T_>& _list)
282 {
283 (void)details::DeleteAll<_T_>(_list);
284 }
285
286
287 namespace details
288 {
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_>;
293
302 template<typename T, typename... Ts>
303 struct contains : std::disjunction<std::is_same<T, Ts>...>
304 {};
305 template<typename T, typename... Ts>
306 inline constexpr bool contains_v = contains<T, Ts...>::value;
307
308 template <typename...> struct all_int;
309
310 template <> struct all_int<> : std::true_type { };
311
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>
315 { };
316
317 template <typename... T>
318 inline constexpr bool all_int_v = all_int<T...>::value;
319
320 template<typename _T_>
322 {
323 typedef _T_ type;
324 };
325
326 //
327 // The following template can be used to detect if a class is fully implemented
328 //
329 template <typename T, class = void>
330 struct is_complete : std::false_type {};
331
332 template <typename T>
333 struct is_complete<T,decltype(void(sizeof(T)))> : std::true_type {};
334
335 template <typename... T>
336 inline constexpr bool is_complete_v = is_complete<T...>::value;
337
338 //
339 // The following template can be used to detect if a class is an instance of atempolate
340 //
341 namespace
342 {
343 template <typename, template <typename...> typename>
344 struct is_instance_impl : public std::false_type {};
345
346 template <template <typename...> typename U, typename...Ts>
347 struct is_instance_impl<U<Ts...>, U> : public std::true_type {};
348 }
349
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;
354
355 template < template <typename...> class Template, typename T >
356 struct is_specialisation_of : std::false_type {};
357
358 template < template <typename...> class Template, typename... Args >
359 struct is_specialisation_of< Template, Template<Args...> > : std::true_type {};
360
361 template< template <typename...> class Template, typename... Args >
362 inline constexpr bool is_specialisation_of_v = is_specialisation_of<Template, Args...>::value;
363 }
375 template<class... Ts>
376 struct Overloaded : Ts... { using Ts::operator()...; };
377}
378
379//END knowCore Utils and C++ extensions
380
381//BEGIN knowCore D-Pointer Utilities
382
383namespace knowCore::Private
384{
385 template<typename _TD_, typename _TS_, class Enable = void>
386 struct CastD
387 {
388 typedef _TD_* ReturnT;
389 static ReturnT get(_TS_ _t)
390 {
391 return static_cast<_TD_*>(_t);
392 }
393 };
394 template<typename _TD_, typename _TS_>
395 struct CastD<_TD_, const _TS_, std::enable_if_t<not std::is_const_v<_TD_>>>
396 {
397 typedef _TD_* ReturnT;
398 static ReturnT get(_TS_ _t)
399 {
400 return const_cast<_TD_*>(static_cast<const _TD_*>(_t));
401 }
402 };
403 template<typename _TD_, typename _TS_>
404 struct CastD<_TD_, QSharedPointer<_TS_>>
405 {
406 typedef std::remove_const_t<_TD_> TD;
408 static ReturnT get(const QSharedPointer<_TS_> _t)
409 {
410 return _t.template staticCast<TD>();
411 }
412 };
413 template<typename _TD_, typename _TS_>
414 struct CastD<_TD_, QExplicitlySharedDataPointer<_TS_>>
415 {
416 typedef std::remove_const_t<_TD_> TD;
417 typedef QExplicitlySharedDataPointer<TD> ReturnT;
418 static ReturnT get(const QExplicitlySharedDataPointer<_TS_> _t)
419 {
420 return ReturnT(const_cast<TD*>(static_cast<_TD_*>(_t.data())));
421 }
422 };
423 template<typename _TD_, typename _TS_>
424 typename CastD<_TD_, _TS_>::ReturnT castD(const _TS_& _t)
425 {
426 return CastD<_TD_, _TS_>::get(_t);
427 };
428}
429
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
439
440#define KNOWCORE_D_DECL() \
441 struct Private; \
442 __KNOWCORE_D_FUNC_DECL()
443
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); }
453
454//END knowCore D-Pointer Utilities
455
456//BEGIN function forward
457
458#define KNOWCORE_FORWARD_INTERFACE_DEFAULT interface()
459
463#define KNOWCORE_FORWARD_INTERFACE KNOWCORE_FORWARD_INTERFACE_DEFAULT
464
465#define __KNOWCORE_FORWARD_CONST_FUNCTION_ACTION(__NAME__, __I__) \
466 auto __NAME__() const \
467 -> decltype(this->KNOWCORE_FORWARD_INTERFACE->__NAME__()) override \
468 { \
469 return this->KNOWCORE_FORWARD_INTERFACE->__NAME__(); \
470 }
471
472#define __KNOWCORE_FORWARD_FUNCTION_ACTION(__NAME__, __I__) \
473 auto __NAME__() -> decltype(this->KNOWCORE_FORWARD_INTERFACE->__NAME__()) override \
474 { \
475 return this->KNOWCORE_FORWARD_INTERFACE->__NAME__(); \
476 }
477
478#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_ACTION(__TYPE__, __I__) \
479 __TYPE__ _arg ## __I__
480
481#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS(...) \
482 KNOWCORE_FOREACH_SEP(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_ACTION, KNOWCORE_COMMA, __VA_ARGS__)
483
484#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES_ACTION(__TYPE__, __I__) \
485 _arg ## __I__
486
487#define __KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES(...) \
488 KNOWCORE_FOREACH_SEP(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES_ACTION, KNOWCORE_COMMA, __VA_ARGS__)
489
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 \
493 { \
494 return this->KNOWCORE_FORWARD_INTERFACE->__NAME__(__KNOWCORE_FORWARD_FUNCTION_ARGUMENTS_NAMES(__VA_ARGS__)); \
495 }
496
511#define KNOWCORE_FORWARD_FUNCTION(__NAME__, ...) \
512 ___KNOWCORE_FORWARD_FUNCTION_IMPLEMENTATION(__NAME__,, __VA_ARGS__)
513
528#define KNOWCORE_FORWARD_CONST_FUNCTION(__NAME__, ...) \
529 ___KNOWCORE_FORWARD_FUNCTION_IMPLEMENTATION(__NAME__, const, __VA_ARGS__)
530
531
551#define KNOWCORE_FORWARD_FUNCTIONS(...) \
552 public: \
553 KNOWCORE_FOREACH(__KNOWCORE_FORWARD_FUNCTION_ACTION, __VA_ARGS__)
554
574#define KNOWCORE_FORWARD_CONST_FUNCTIONS(...) \
575 public: \
576 KNOWCORE_FOREACH(__KNOWCORE_FORWARD_CONST_FUNCTION_ACTION, __VA_ARGS__)
577
578//END function forward
579
580//BEGIN concepts
581
582namespace knowCore::details
583{
584 template<class Base, class Derived>
585 concept base_of = std::is_base_of_v<Base, Derived>;
586}
587
588//END concepts
589
Definition Forward.h:12
Definition Forward.h:4
Definition Global.h:585
Definition Global.h:376
Definition Global.h:387
Definition Global.h:270
Definition Global.h:310
Definition Global.h:308
Definition Global.h:304
Definition Global.h:322
Definition Global.h:330