4#include <QCryptographicHash>
6#include <QJsonDocument>
11#include "Uris/askcore_datatype.h"
21 template<
typename _T_,
typename _TC_>
22 cres_qresult<_T_*> SeDeContexts_getContext(_TC_* _contexts,
const knowCore::Uri& _uri)
24 cres_try(
auto context, _contexts->getContext(_uri));
25 _T_* casted =
dynamic_cast<_T_*
>(context);
28 return cres_success(casted);
32 return cres_failure(
"Cannot cast context to '{}'", knowCore::prettyTypename<_T_>());
37 template<
typename _T_>
40 return details::SeDeContexts_getContext<_T_>(
this, _uri);
43 template<
typename _T_>
46 return details::SeDeContexts_getContext<_T_>(
this, _uri);
53 template<
typename _TFrom_,
typename _TTo_, TypeCheckingMode _TypeCheckingMode_>
55 template<ComparisonOperator _operator_,
typename _TLeft_,
typename _TRight_>
57 template<ArithmeticOperator _operator_,
typename _TLeft_,
typename _TRight_>
60 template<
typename _TFrom_,
typename _TTo_>
61 requires(std::is_convertible_v<_TFrom_, _TTo_> and not std::is_arithmetic_v<_TFrom_>)
64 static inline cres_qresult<void> convert(
const _TFrom_* _from, _TTo_* _to)
67 return cres_success();
70 template<
typename _TFrom_,
typename _TTo_,
71 TypeCheckingMode _TypeCheckingMode_ = TypeCheckingMode::Safe>
72 inline cres_qresult<void> convert(
const _TFrom_* _from, _TTo_* _to)
74 return Converter<_TFrom_, _TTo_, _TypeCheckingMode_>::convert(_from, _to);
77 template<ComparisonOperator _operator_,
typename _TFrom_,
typename _TTo_>
78 inline cres_qresult<bool> compare(
const _TFrom_& _from, _TTo_& _to)
80 return Comparator<_operator_, _TFrom_, _TTo_>::compare(_from, _to);
85 template<
typename _TLeft_,
typename _TRight_>
87 { a == b } -> std::convertible_to<bool>;
89 template<
typename _TLeft_,
typename _TRight_>
91 { a < b } -> std::convertible_to<bool>;
93 template<
typename _TLeft_,
typename _TRight_>
95 { a == b } -> std::convertible_to<cres_qresult<bool>>;
97 template<
typename _TLeft_,
typename _TRight_>
99 { a < b } -> std::convertible_to<cres_qresult<bool>>;
101 template<
typename _Tp>
104 template<
typename _TLeft_,
typename _TRight_>
106 = std::unsigned_integral<_TLeft_> and std::signed_integral<_TRight_>
107 and std::integral<_TRight_>;
108 template<
typename _TLeft_,
typename _TRight_>
110 = std::signed_integral<_TLeft_> and std::unsigned_integral<_TRight_>
111 and std::integral<_TLeft_>;
114 template<
typename _TLeft_,
typename _TRight_>
118 struct Comparator<ComparisonOperator::Inferior, _TLeft_, _TRight_>
120 static cres_qresult<bool> compare(
const _TLeft_& _left,
const _TRight_& _right)
122 return cres_success(_left < _right);
125 template<
typename _TLeft_,
typename _TRight_>
126 requires details::EqualComparable<_TLeft_, _TRight_>
127 and (not details::left_unsigned_right_signed<_TLeft_, _TRight_>)
128 and (not details::left_signed_right_unsigned<_TLeft_, _TRight_>)
129 struct Comparator<ComparisonOperator::Equal, _TLeft_, _TRight_>
131 static inline cres_qresult<bool> compare(
const _TLeft_& _left,
const _TRight_& _right)
133 return cres_success(_left == _right);
137 template<
typename _TLeft_,
typename _TRight_>
138 requires details::InferiorComparableRV<_TLeft_, _TRight_>
139 struct Comparator<ComparisonOperator::Inferior, _TLeft_, _TRight_>
141 static cres_qresult<bool> compare(
const _TLeft_& _left,
const _TRight_& _right)
143 return _left < _right;
146 template<
typename _TLeft_,
typename _TRight_>
147 requires details::EqualComparableRV<_TLeft_, _TRight_>
148 struct Comparator<ComparisonOperator::Equal, _TLeft_, _TRight_>
150 static inline cres_qresult<bool> compare(
const _TLeft_& _left,
const _TRight_& _right)
152 return _left == _right;
160 template<ArithmeticOperator _operator_,
typename _TLeft_,
typename _TRight_>
163 template<
typename _TLeft_,
typename _TRight_>
164 struct op_trait<ArithmeticOperator::Addition, _TLeft_, _TRight_>
166 static auto compute(_TLeft_ _x, _TRight_ _y) {
return _x + _y; }
168 template<
typename _TLeft_,
typename _TRight_>
169 struct op_trait<ArithmeticOperator::Substraction, _TLeft_, _TRight_>
171 static auto compute(_TLeft_ _x, _TRight_ _y) {
return _x - _y; }
173 template<
typename _TLeft_,
typename _TRight_>
174 struct op_trait<ArithmeticOperator::Division, _TLeft_, _TRight_>
176 static auto compute(_TLeft_ _x, _TRight_ _y) {
return _x / _y; }
178 template<
typename _TLeft_,
typename _TRight_>
179 struct op_trait<ArithmeticOperator::Multiplication, _TLeft_, _TRight_>
181 static auto compute(_TLeft_ _x, _TRight_ _y) {
return _x * _y; }
187 template<ArithmeticOperator _operator_,
typename _TLeft_,
typename _TRight_>
192 static cres_qresult<knowCore::Value> compute(
const _TLeft_& _left,
const _TRight_& _right)
204 template<
typename _TTo_>
206 template<
typename _TTo_>
211 template<
typename _TFrom_,
typename _TTo_>
216 cres_qresult<void> convert(
const void* _from,
void* _to)
const override
218 return convert(
reinterpret_cast<const _TFrom_*
>(_from),
reinterpret_cast<_TTo_*
>(_to));
220 virtual cres_qresult<void> convert(
const _TFrom_* _from, _TTo_* _to)
const = 0;
227 template<
typename _TTo_>
230 knowCore::Uri from()
const override {
return Uris::askcore_datatype::valuelist; }
232 cres_qresult<void> convert(
const void* _from,
void* _to)
const override
234 return convert(MoreDetails::values(_from),
reinterpret_cast<_TTo_*
>(_to));
238 clog_debug_vn(_from, _from.size());
242 cres_try(
typename _TTo_::Type t, val.value<
typename _TTo_::Type>());
246 clog_debug_vn(_to->size());
247 return cres_success();
250 template<
typename _TFrom_>
254 knowCore::Uri to()
const override {
return Uris::askcore_datatype::valuelist; }
255 cres_qresult<void> convert(
const void* _from,
void* _to)
const override
257 MoreDetails::assign(convert(
reinterpret_cast<const _TFrom_*
>(_from)), _to);
258 return cres_success();
262 clog_debug_vn(_from->size());
264 for(
const typename _TFrom_::Type& val : *_from)
272 template<
typename _TFrom_,
typename _TTo_, TypeCheckingMode _TypeCheckingMode_>
275 cres_qresult<void> convert(
const _TFrom_* _from, _TTo_* _to)
const override
280 template<ComparisonOperator _operator_,
typename _TLeft_,
typename _TRight_>
283 ComparisonOperator comparisonOperator()
const override {
return _operator_; }
286 cres_qresult<bool> compare(
const void* _left,
const void* _right)
const override
288 return compare(*
reinterpret_cast<const _TLeft_*
>(_left),
289 *
reinterpret_cast<const _TRight_*
>(_right));
291 virtual cres_qresult<bool> compare(
const _TLeft_& _left,
const _TRight_& _right)
const = 0;
294 template<ComparisonOperator _operator_,
typename _TLeft_,
typename _TRight_>
298 cres_qresult<bool> compare(
const _TLeft_& _left,
const _TRight_& _right)
const override
306 template<ArithmeticOperator _operator_,
typename _TLeft_,
typename _TRight_>
309 ArithmeticOperator arithmeticOperator()
const override {
return _operator_; }
312 cres_qresult<Value> compute(
const void* _left,
const void* _right)
const override
314 return compute(*
reinterpret_cast<const _TLeft_*
>(_left),
315 *
reinterpret_cast<const _TRight_*
>(_right));
317 virtual cres_qresult<Value> compute(
const _TLeft_& _left,
const _TRight_& _right)
const = 0;
320 template<ArithmeticOperator _operator_,
typename _TLeft_,
typename _TRight_>
324 cres_qresult<Value> compute(
const _TLeft_& _left,
const _TRight_& _right)
const override
344#define KNOWCORE_DEFINE_GENERIC_CONVERT(_TFrom_, _From_Arg_, _TTo_, _To_Arg_, _TypeCheckingMode_) \
346 struct knowCore::Converter<_TFrom_, _TTo_, knowCore::TypeCheckingMode::_TypeCheckingMode_> \
348 static inline cres_qresult<void> convert(const _TFrom_* _From_Arg_, _TTo_* _To_Arg_); \
350 inline cres_qresult<void> \
351 knowCore::Converter<_TFrom_, _TTo_, knowCore::TypeCheckingMode::_TypeCheckingMode_>::convert( \
352 const _TFrom_* _from, _TTo_* _to)
367#define KNOWCORE_DEFINE_CONVERT(_TFrom_, _From_Arg_, _TTo_, _To_Arg_, _TypeCheckingMode_) \
369 struct knowCore::Converter<_TFrom_, _TTo_, knowCore::TypeCheckingMode::_TypeCheckingMode_> \
371 static inline cres_qresult<void> convert(const _TFrom_* _From_Arg_, _TTo_* _To_Arg_); \
373 inline cres_qresult<void> \
374 knowCore::Converter<_TFrom_, _TTo_, knowCore::TypeCheckingMode::_TypeCheckingMode_>::convert( \
375 const _TFrom_* _from, _TTo_* _to)
382 virtual QVariant toQVariant(
const void* _data) = 0;
389 { QVariant(a.toVariant()) };
392 template<
typename _T_>
396 QVariant toQVariant(
const void* _data)
override
398 return reinterpret_cast<const _T_*
>(_data)->toVariant();
404 template<
typename _T_>
405 void registerMetaType()
415 template<
typename _TFrom_,
typename _TTo_>
417 registerConverter(TypeCheckingMode _mode,
418 const std::function<cres_qresult<void>(
const _TFrom_*, _TTo_*)>& _converter)
420 struct ConversionImplementation :
public details::TypeConversionImplementation<_TFrom_, _TTo_>
422 ConversionImplementation(
423 const std::function<cres_qresult<void>(
const _TFrom_*, _TTo_*)>& _converter)
424 : m_converter(_converter)
427 cres_qresult<void> convert(
const _TFrom_* _from,
const _TTo_* _to)
const override
429 return m_converter(_from, _to);
431 std::function<cres_qresult<void>(
const _TFrom_*, _TTo_*)> m_converter;
433 MetaTypeRegistry::registerConverter(
new ConversionImplementation(_converter));
439 template<
typename _TFrom_,
typename _TTo_, TypeCheckingMode _TypeCheckingMode_>
441 { Converter<_TFrom_, _TTo_, _TypeCheckingMode_>::convert(a, b) };
446 template<
typename _TFrom_,
typename _TTo_>
447 void registerConverter()
451 static_assert(has_safe or has_force,
"No converter was defined.");
452 if constexpr(has_safe)
454 MetaTypeRegistry::registerConverter(
455 TypeCheckingMode::Safe,
458 else if constexpr(has_force)
460 MetaTypeRegistry::registerConverter(
461 TypeCheckingMode::Force,
462 new details::ConvertConversionImplementation<_TFrom_, _TTo_, TypeCheckingMode::Force>());
465 template<ComparisonOperator _operator_,
typename _TLeft_,
typename _TRight_>
466 void registerComparator(
467 const std::function<cres_qresult<bool>(
const _TLeft_&,
const _TRight_&)>& _comparator)
469 struct ComparatorImplementation
470 :
public details::TypeComparatorImplementation<_operator_, _TLeft_, _TRight_>
472 ComparatorImplementation(
473 const std::function<cres_qresult<bool>(
const _TLeft_&, _TRight_&)>& _comparator)
474 : m_comparator(_comparator)
477 cres_qresult<bool> compare(
const _TLeft_& _from,
const _TRight_& _to)
const override
479 return m_comparator(_from, _to);
481 std::function<cres_qresult<bool>(
const _TLeft_&,
const _TRight_&)> m_comparator;
483 MetaTypeRegistry::registerComparator(
new ComparatorImplementation(_comparator));
486 template<ComparisonOperator _operator_,
typename _TLeft_,
typename _TRight_>
487 void registerComparator()
489 MetaTypeRegistry::registerComparator(
490 new details::ComparatorComparatorImplementation<_operator_, _TLeft_, _TRight_>());
492 template<
typename _TLeft_,
typename _TRight_>
493 void registerComparators()
497 template<
typename _TLeft_,
typename _TRight_, ComparisonOperator _comparator_,
498 ComparisonOperator... _comparator_others_>
499 void registerComparators()
501 registerComparator<_comparator_, _TLeft_, _TRight_>();
502 registerComparators<_TLeft_, _TRight_, _comparator_others_...>();
505 template<ArithmeticOperator _operator_,
typename _TLeft_,
typename _TRight_>
506 void registerArithmeticOperator()
508 MetaTypeRegistry::registerArithmeticOperator(
509 new details::ArithmeticOperationArtithmeticOperatorImplementation<_operator_, _TLeft_,
513 template<
typename _TLeft_,
typename _TRight_>
514 void registerArithmeticOperators()
518 template<
typename _TLeft_,
typename _TRight_, ArithmeticOperator _operator_,
519 ArithmeticOperator... _operator_others_>
520 void registerArithmeticOperators()
522 registerArithmeticOperator<_operator_, _TLeft_, _TRight_>();
523 registerArithmeticOperators<_TLeft_, _TRight_, _operator_others_...>();
526 template<
typename _T_>
527 void registerNumericType()
529 MetaTypeRegistry::registerNumericType(MetaTypeInformation<_T_>::uri());
530 if constexpr(not std::is_same_v<_T_, BigNumber>)
532 registerConverter<_T_, BigNumber>();
533 registerConverter<BigNumber, _T_>();
540 template<
typename _T_>
546 template<
typename _Q_ = MetaTypeInformation<_T_>>
547 requires(details::is_complete_v<_Q_>)
552 template<
typename _Q_ = MetaTypeInformation<_T_>>
553 requires(not details::is_complete_v<_Q_>)
556 clog_fatal(
"No metatype information!");
558 template<
typename _Q_ = MetaTypeInformation<_T_>>
559 requires(details::is_complete_v<_Q_>)
560 int get_qMetaTypeId()
const
564 template<
typename _Q_ = MetaTypeInformation<_T_>>
565 requires(not details::is_complete_v<_Q_>)
566 int get_qMetaTypeId()
const
568 clog_fatal(
"No metatype information!");
573 virtual cres_qresult<QByteArray> md5(
const _T_& _value)
const = 0;
574 virtual cres_qresult<QJsonValue> toJsonValue(
const _T_& _value,
577 virtual cres_qresult<void>
578 fromJsonValue(_T_* _value,
const QJsonValue& _json_value,
581 virtual cres_qresult<QCborValue> toCborValue(
const _T_& _value,
584 virtual cres_qresult<void>
585 fromCborValue(_T_* _value,
const QCborValue& _cbor_value,
588 virtual cres_qresult<QString> printable(
const _T_& _value)
const = 0;
589 virtual cres_qresult<QString> toRdfLiteral(
const _T_& _value,
592 virtual cres_qresult<void> fromRdfLiteral(_T_* _value,
const QString& _serialised,
596 cres_qresult<QString> toJsonString(
const _T_& _value,
600 cres_try(QJsonValue value, toJsonValue(_value, _contexts));
603 doc.setArray(value.toArray());
605 else if(value.isObject())
607 doc.setObject(value.toObject());
611 clog_fatal(
"toJsonString/fromJsonString only works on object or array");
612 return expectedError(
"object or array", doc);
614 return cres_success(QString::fromUtf8(doc.toJson(QJsonDocument::Compact)));
616 cres_qresult<void> fromJsonString(_T_* _value,
const QString& _json_value,
617 const DeserialisationContexts& _contexts)
const
619 QJsonParseError error;
620 QJsonDocument doc = QJsonDocument::fromJson(_json_value.toUtf8(), &error);
623 return cres_failure(error.errorString());
629 return fromJsonValue(_value, doc.array(), _contexts);
631 else if(doc.isObject())
633 return fromJsonValue(_value, doc.object(), _contexts);
637 return expectedError(
"object or array", doc);
642 void* allocate()
const override {
return new _T_; }
643 void* duplicate(
const void* _value)
const override
645 return new _T_(*
reinterpret_cast<const _T_*
>(_value));
647 void release(
void* _value)
const override {
delete(
reinterpret_cast<_T_*
>(_value)); }
648 bool compareEquals(
const void* _lhs,
const void* _rhs)
const override
650 return *
reinterpret_cast<const _T_*
>(_lhs) == *
reinterpret_cast<const _T_*
>(_rhs);
652 cres_qresult<QByteArray>
md5(
const void* _value)
const override
654 return md5(*
reinterpret_cast<const _T_*
>(_value));
659 return toJsonValue(*
reinterpret_cast<const _T_*
>(_value), _contexts);
661 cres_qresult<void>
fromJsonValue(
void* _value,
const QJsonValue& _json_value,
664 return fromJsonValue(
reinterpret_cast<_T_*
>(_value), _json_value, _contexts);
669 return toCborValue(*
reinterpret_cast<const _T_*
>(_value), _contexts);
671 cres_qresult<void>
fromCborValue(
void* _value,
const QCborValue& _cbor_value,
674 return fromCborValue(
reinterpret_cast<_T_*
>(_value), _cbor_value, _contexts);
676 cres_qresult<QString>
printable(
const void* _value)
const override
678 return printable(*
reinterpret_cast<const _T_*
>(_value));
683 return toRdfLiteral(*
reinterpret_cast<const _T_*
>(_value), _contexts);
688 return fromRdfLiteral(
reinterpret_cast<_T_*
>(_value), _serialised, _contexts);
691 template<
typename _TCoJ_>
692 cres_qerror expectedError(
const char* _what,
const _TCoJ_& _got)
const
694 return cres_failure(
"Expected '{}' got '{}'", _what, _got);
696 template<
typename _TCoJ_>
697 cres_qerror expectedArrayError(
const _TCoJ_& _coj)
const
699 return expectedError(
"array", _coj);
701 template<
typename _TCoJ_>
702 cres_qerror expectedObjectError(
const _TCoJ_& _coj)
const
704 return expectedError(
"object", _coj);
710 template<
typename _T_>
717 cres_qresult<QByteArray> md5(
const QList<_T_>& _value)
const override
719 QCryptographicHash hash(QCryptographicHash::Md5);
720 for(
const _T_& v : _value)
722 cres_try(QByteArray value, m_nested.md5(v));
725 return cres_success(hash.result());
727 cres_qresult<QJsonValue> toJsonValue(
const QList<_T_>& _value,
731 for(
const _T_& v : _value)
733 cres_try(QJsonValue value, m_nested.toJsonValue(v, _contexts));
736 return cres_success(array);
739 fromJsonValue(
QList<_T_>* _value,
const QJsonValue& _json_value,
742 if(_json_value.isArray())
746 for(
const QJsonValue& value : _json_value.toArray())
749 cres_try(cres_ignore, m_nested.fromJsonValue(&v, value, _contexts));
752 return cres_success();
756 return expectedArrayError(_json_value);
759 cres_qresult<QCborValue> toCborValue(
const QList<_T_>& _value,
763 for(
const _T_& v : _value)
765 cres_try(QCborValue value, m_nested.toCborValue(v, _contexts));
768 return cres_success(array);
771 fromCborValue(
QList<_T_>* _value,
const QCborValue& _cbor_value,
774 if(_cbor_value.isArray())
778 for(
const QCborValue& value : _cbor_value.toArray())
781 cres_try(cres_ignore, m_nested.fromCborValue(&v, value, _contexts));
784 return cres_success();
788 return expectedArrayError(_cbor_value);
791 cres_qresult<QString> printable(
const QList<_T_>& _value)
const override
794 for(
const _T_& v : _value)
796 cres_try(QString value, m_nested.printable(v));
797 strings.append(value);
799 return cres_success(clog_qt::qformat(
"[{}]", strings));
801 cres_qresult<QString> toRdfLiteral(
const QList<_T_>& _value,
804 return toJsonString(_value, _contexts);
806 cres_qresult<void> fromRdfLiteral(
QList<_T_>* _value,
const QString& _serialised,
809 return fromJsonString(_value, _serialised, _contexts);
818 template<
typename _TFrom_,
typename _TTo_>
819 inline _TTo_ qt_convert(
const _TFrom_& _from)
822 convert(&_from, &to).expect_success();
825 inline constexpr bool valid(
const char* _t) {
return _t; }
826 inline constexpr bool valid(
const knowCore::Uri&) {
return true; }
827 template<
typename _T_,
typename _T2_,
bool _has_converter_>
829 template<
typename _T_,
typename _T2_>
832 static void registerConverter()
834 QMetaType::registerConverter<_T_, _T2_>(qt_convert<_T_, _T2_>);
835 knowCore::registerConverter<_T_, _T2_>();
838 template<
typename _T_,
typename _T2_>
841 static void registerConverter() {}
843 template<
typename _T_,
bool _has_converter_>
845 template<
typename _T_>
848 static void registerConverter()
850 MetaTypeRegistry::registerConverter(
854 template<
typename _T_>
857 static void registerConverter() {}
859 template<
typename _T_,
bool _has_converter_>
861 template<
typename _T_>
864 static void registerConverter()
866 MetaTypeRegistry::registerConverter(
870 template<
typename _T_>
873 static void registerConverter() {}
876 template<
typename _T_,
bool _is_numeric>
878 template<
typename _T_>
881 static void registerNumericDataType() { registerNumericType<_T_>(); }
883 template<
typename _T_>
886 static void registerNumericDataType() {}
888 inline knowCore::Uri makeUri(std::nullptr_t) { clog_fatal(
"no uri defined for type!"); }
889 template<
typename _T_>
897#define __KNOWCORE_DEFINE_METATYPE__INTERNAL__(_TYPE_, _URI_, _TRAITS_) \
898 knowCore::MetaTypeInformation<_TYPE_> knowCore::MetaTypeInformation<_TYPE_>::s_instance; \
899 knowCore::MetaTypeInformation<_TYPE_>::MetaTypeInformation() \
901 m_id = qRegisterMetaType<_TYPE_>(#_TYPE_); \
902 knowCore::Details::RegisterFromListConverter< \
903 _TYPE_, bool((_TRAITS_) & knowCore::MetaTypeTraits::FromValueList)>::registerConverter(); \
904 knowCore::Details::RegisterToListConverter< \
905 _TYPE_, bool((_TRAITS_) & knowCore::MetaTypeTraits::ToValueList)>::registerConverter(); \
906 knowCore::Details::RegisterConverter< \
908 bool((_TRAITS_) & knowCore::MetaTypeTraits::ToString)>::registerConverter(); \
909 knowCore::Details::RegisterConverter< \
911 bool((_TRAITS_) & knowCore::MetaTypeTraits::FromString)>::registerConverter(); \
912 knowCore::Details::RegisterConverter< \
913 _TYPE_, QByteArray, \
914 bool((_TRAITS_) & knowCore::MetaTypeTraits::ToByteArray)>::registerConverter(); \
915 knowCore::Details::RegisterConverter< \
916 QByteArray, _TYPE_, \
917 bool((_TRAITS_) & knowCore::MetaTypeTraits::FromByteArray)>::registerConverter(); \
918 knowCore::Details::RegisterNumericDataType< \
920 bool((_TRAITS_) & knowCore::MetaTypeTraits::NumericType)>::registerNumericDataType(); \
921 init_knowCoreMetaType(); \
924#define KNOWCORE_DEFINE_QT_METATYPE(_TYPE_, _TRAITS_) \
925 void knowCore::MetaTypeInformation<_TYPE_>::init_knowCoreMetaType() {} \
926 __KNOWCORE_DEFINE_METATYPE__INTERNAL__(_TYPE_, nullptr, _TRAITS_)
931#define KNOWCORE_DEFINE_METATYPE_URI(_TYPE_, _URI_) \
932 knowCore::Uri knowCore::MetaTypeInformation<_TYPE_>::uri() \
934 return knowCore::Details::makeUri(_URI_); \
943#define KNOWCORE_DEFINE_METATYPE(_TYPE_, _URI_, _TRAITS_) \
944 KNOWCORE_DEFINE_METATYPE_URI(_TYPE_, _URI_) \
945 knowCore::AbstractMetaTypeDefinition* knowCore::MetaTypeInformation<_TYPE_>::definition() \
947 static knowCore::AbstractMetaTypeDefinition* definition \
948 = new knowCore::MetaTypeDefinition<_TYPE_>(); \
951 void knowCore::MetaTypeInformation<_TYPE_>::init_knowCoreMetaType() \
953 registerMetaType<_TYPE_>(); \
955 __KNOWCORE_DEFINE_METATYPE__INTERNAL__(_TYPE_, _URI_, _TRAITS_)
957#define __KNOWCORE_REGISTER_CONVERSION_FROM_ONE(_TYPE_, I) \
958 if constexpr(not std::is_same_v<TypeFrom, _TYPE_>) \
960 knowCore::registerConverter<TypeFrom, _TYPE_>(); \
963#define __KNOWCORE_REGISTER_CONVERSION_FROM(_FACTORY_NAME_, _TYPE_FROM_, ...) \
966 class _FACTORY_NAME_ \
971 typedef _TYPE_FROM_ TypeFrom; \
972 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_CONVERSION_FROM_ONE, __VA_ARGS__) \
974 static _FACTORY_NAME_ s_instance; \
976 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
987#define KNOWCORE_REGISTER_CONVERSION_FROM(_TYPE_FROM_, ...) \
988 __KNOWCORE_REGISTER_CONVERSION_FROM(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeRegisterConversion), \
989 _TYPE_FROM_, __VA_ARGS__)
991#define __KNOWCORE_REGISTER_CONVERSION_TO_ONE(_TYPE_, I) \
992 if constexpr(not std::is_same_v<_TYPE_, TypeTo>) \
994 knowCore::registerConverter<_TYPE_, TypeTo>(); \
997#define __KNOWCORE_REGISTER_CONVERSION_TO(_FACTORY_NAME_, _TYPE_TO_, ...) \
1000 class _FACTORY_NAME_ \
1005 typedef _TYPE_TO_ TypeTo; \
1006 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_CONVERSION_TO_ONE, __VA_ARGS__) \
1008 static _FACTORY_NAME_ s_instance; \
1010 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
1021#define KNOWCORE_REGISTER_CONVERSION_TO(_TYPE_TO_, ...) \
1022 __KNOWCORE_REGISTER_CONVERSION_TO(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeRegisterConversion), \
1023 _TYPE_TO_, __VA_ARGS__)
1027#define __KNOWCORE_REGISTER_COMPARATORS_FROM_ONE(_TYPE_, I) \
1028 knowCore::registerComparators<_LeftType_, _TYPE_, _comparators_...>();
1030#define __KNOWCORE_REGISTER_COMPARATORS_MAKE_COMPARATOR_ONE(_COMPARATOR_, I) \
1031 , knowCore::ComparisonOperator::_COMPARATOR_
1032#define __KNOWCORE_REGISTER_COMPARATOR_MAKE_COMPARATORS(...) \
1033 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_COMPARATORS_MAKE_COMPARATOR_ONE, __VA_ARGS__)
1035#define __KNOWCORE_REGISTER_COMPARATORS(_FACTORY_NAME_, _COMPARATORS_, _LEFT_, ...) \
1038 class _FACTORY_NAME_ \
1043 registerComparators< \
1044 _LEFT_ __KNOWCORE_REGISTER_COMPARATOR_MAKE_COMPARATORS _COMPARATORS_>(); \
1046 static _FACTORY_NAME_ s_instance; \
1048 template<typename _LeftType_, knowCore::ComparisonOperator... _comparators_> \
1049 void registerComparators() \
1051 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_COMPARATORS_FROM_ONE, __VA_ARGS__) \
1054 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
1057#define KNOWCORE_REGISTER_COMPARATORS_FROM(_OPERATORS_, _LEFT_TYPE_, ...) \
1058 __KNOWCORE_REGISTER_COMPARATORS(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeRegisterComparators), \
1059 _OPERATORS_, _LEFT_TYPE_, __VA_ARGS__)
1066#define KNOWCORE_REGISTER_COMPARATORS(_COMPARATORS_, _TYPE_) \
1067 KNOWCORE_REGISTER_COMPARATORS_FROM(_COMPARATORS_, _TYPE_, _TYPE_)
1071#define __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_FROM_ONE(_TYPE_, I) \
1072 knowCore::registerArithmeticOperators<_LeftType_, _TYPE_, _operators_...>();
1074#define __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_MAKE_OPERATORS_ONE(_OPERATOR_, I) \
1075 , knowCore::ArithmeticOperator::_OPERATOR_
1076#define __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_MAKE_OPERATORS(...) \
1077 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_MAKE_OPERATORS_ONE, __VA_ARGS__)
1079#define __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR(_FACTORY_NAME_, _OPERATORS_, _LEFT_, ...) \
1082 class _FACTORY_NAME_ \
1087 registerArithmeticOperators< \
1088 _LEFT_ __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_MAKE_OPERATORS _OPERATORS_>(); \
1090 static _FACTORY_NAME_ s_instance; \
1092 template<typename _LeftType_, ArithmeticOperator... _operators_> \
1093 void registerArithmeticOperators() \
1095 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_FROM_ONE, __VA_ARGS__) \
1098 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
1101#define KNOWCORE_REGISTER_ARITHMETIC_OPERATORS(_OPERATORS_, _LEFT_TYPE_, ...) \
1102 __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR( \
1103 __KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeRegisterArithmeticOperator), _OPERATORS_, _LEFT_TYPE_, \
1108#define KNOWCORE_DEFINE_METATYPE_START_IMPLEMENTATION_TEMPLATE(_TYPE_) \
1109 class knowCore::MetaTypeDefinition<_TYPE_> \
1110 : public knowCore::MetaTypeDefinitionImplementation<_TYPE_> \
1112 template<typename _TT_, typename _ENABLED_> \
1113 friend class knowCore::MetaTypeDefinition; \
1114 using knowCore::MetaTypeDefinitionImplementation<_TYPE_>::expectedError; \
1115 using knowCore::MetaTypeDefinitionImplementation<_TYPE_>::expectedObjectError; \
1116 using knowCore::MetaTypeDefinitionImplementation<_TYPE_>::expectedArrayError; \
1117 using knowCore::MetaTypeDefinitionImplementation<_TYPE_>::toJsonString; \
1118 using knowCore::MetaTypeDefinitionImplementation<_TYPE_>::fromJsonString; \
1121#define KNOWCORE_DEFINE_METATYPE_FINISH_IMPLEMENTATION(_TYPE_) \
1125#define KNOWCORE_DEFINE_METATYPE_START_IMPLEMENTATION(_TYPE_) \
1127 KNOWCORE_DEFINE_METATYPE_START_IMPLEMENTATION_TEMPLATE(_TYPE_)
1129#define __KNOWCORE_URIFY(_URI_, I) knowCore::Details::makeUri(_URI_),
1131#define __KNOWCORE_URIFY_LIST(...) KNOWCORE_FOREACH(__KNOWCORE_URIFY, __VA_ARGS__)
1133#define __KNOWCORE_DEFINE_METATYPE_ALIASES__INTERNAL__(_FACTORY_NAME_, ...) \
1136 class _FACTORY_NAME_ \
1141 QList<knowCore::Uri> uris = {__KNOWCORE_URIFY_LIST(__VA_ARGS__)}; \
1142 clog_assert(uris.size() > 0); \
1143 knowCore::Uri to = uris.takeLast(); \
1144 knowCore::registerMetaTypeAliases(uris, to); \
1146 static _FACTORY_NAME_ s_instance; \
1148 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
1160#define KNOWCORE_DEFINE_METATYPE_ALIASES(...) \
1161 __KNOWCORE_DEFINE_METATYPE_ALIASES__INTERNAL__(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeAlias), \
Definition MetaType.h:281
Definition MetaTypeImplementation.h:380
Definition MetaType.h:272
Definition MetaType.h:264
Class that can contains large numeric value.
Definition BigNumber.h:51
Definition MetaType.h:126
cres_qresult< AbstractDeserialisationContext * > getContext(const knowCore::Uri &_uri) const
Definition MetaType.cpp:74
Definition MetaTypeImplementation.h:828
Definition MetaType.h:159
cres_qresult< AbstractSerialisationContext * > getContext(const knowCore::Uri &_uri) const
Definition MetaType.cpp:111
static Value fromValue(const _T_ &_value)
Definition Value.h:241
Definition MetaTypeImplementation.h:203
Definition MetaTypeImplementation.h:394
Definition MetaTypeImplementation.h:94
Definition MetaTypeImplementation.h:86
Definition MetaTypeImplementation.h:440
Definition MetaTypeImplementation.h:388
Definition MetaTypeImplementation.h:98
Definition MetaTypeImplementation.h:90
Definition MetaTypeImplementation.h:185
Definition MetaTypeImplementation.h:102
Definition MetaTypeImplementation.h:110
Definition MetaTypeImplementation.h:106
Definition MetaTypeImplementation.h:58
Definition MetaTypeImplementation.h:56
Definition MetaTypeImplementation.h:54
Definition MetaTypeImplementation.h:844
Definition MetaTypeImplementation.h:877
Definition MetaTypeImplementation.h:860
Definition MetaTypeImplementation.h:323
Definition MetaTypeImplementation.h:308
Definition MetaTypeImplementation.h:297
Definition MetaTypeImplementation.h:274
Definition MetaTypeImplementation.h:229
Definition MetaTypeImplementation.h:252
Definition MetaTypeImplementation.h:282
Definition MetaTypeImplementation.h:213
Definition MetaTypeImplementation.h:161