4#include <QCryptographicHash>
6#include <QJsonDocument>
19 template<
typename _T_,
typename _TC_>
22 KNOWCORE_RETURN_VALUE_TRY(context, _contexts->getContext(_uri));
23 _T_* casted =
dynamic_cast<_T_*
>(context);
26 return kCrvSuccess(casted);
28 return kCrvError(
"Cannot cast context to '{}'", knowCore::prettyTypename<_T_>());
33 template<
typename _T_>
36 return details::SeDeContexts_getContext<_T_>(
this, _uri);
39 template<
typename _T_>
42 return details::SeDeContexts_getContext<_T_>(
this, _uri);
49 template<
typename _TFrom_,
typename _TTo_, TypeCheckingMode _TypeCheckingMode_,
typename _Enable_ =
void>
51 template<ComparisonOperator _operator_,
typename _TLeft_,
typename _TRight_,
typename _Enable_ =
void>
53 template<ArithmeticOperator _operator_,
typename _TLeft_,
typename _TRight_,
typename _Enable_ =
void>
56 template<
typename _TFrom_,
typename _TTo_ >
57 struct Converter<_TFrom_, _TTo_, TypeCheckingMode::Safe, std::enable_if_t<std::is_convertible_v<_TFrom_, _TTo_> and not std::is_arithmetic_v<_TFrom_>>>
59 static inline ReturnVoid convert(
const _TFrom_* _from, _TTo_* _to)
65 template<
typename _TFrom_,
typename _TTo_, TypeCheckingMode _TypeCheckingMode_ = TypeCheckingMode::Safe>
66 inline ReturnVoid convert(
const _TFrom_* _from, _TTo_* _to)
71 template<ComparisonOperator _operator_,
typename _TFrom_,
typename _TTo_>
72 inline ReturnValue<bool> compare(
const _TFrom_& _from, _TTo_& _to)
74 return Comparator<_operator_, _TFrom_, _TTo_>::compare(_from, _to);
79 template<
typename _TLeft_,
typename _TRight_>
81 requires(_TLeft_ a, _TRight_ b) {
82 { a == b } -> std::convertible_to<bool>;
84 template<
typename _TLeft_,
typename _TRight_>
86 requires(_TLeft_ a, _TRight_ b) {
87 { a < b } -> std::convertible_to<bool>;
89 template<
typename _Tp>
92 template<
typename _TLeft_,
typename _TRight_>
94 template<
typename _TLeft_,
typename _TRight_>
98 template<
typename _TLeft_,
typename _TRight_>
102 struct Comparator<ComparisonOperator::Inferior, _TLeft_, _TRight_>
106 return kCrvSuccess(_left < _right);
114 template<ArithmeticOperator _operator_,
typename _TLeft_,
typename _TRight_>
117 template<
typename _TLeft_,
typename _TRight_>
118 struct op_trait<ArithmeticOperator::Addition, _TLeft_, _TRight_>
120 static auto compute(_TLeft_ _x, _TRight_ _y) {
return _x + _y; }
122 template<
typename _TLeft_,
typename _TRight_>
123 struct op_trait<ArithmeticOperator::Substraction, _TLeft_, _TRight_>
125 static auto compute(_TLeft_ _x, _TRight_ _y) {
return _x - _y; }
127 template<
typename _TLeft_,
typename _TRight_>
128 struct op_trait<ArithmeticOperator::Division, _TLeft_, _TRight_>
130 static auto compute(_TLeft_ _x, _TRight_ _y) {
return _x / _y; }
132 template<
typename _TLeft_,
typename _TRight_>
133 struct op_trait<ArithmeticOperator::Multiplication, _TLeft_, _TRight_>
135 static auto compute(_TLeft_ _x, _TRight_ _y) {
return _x * _y; }
138 template <
typename T>
concept arithmetic = std::is_arithmetic_v<T>;
155 template<
typename _TFrom_,
typename _TTo_>
160 ReturnVoid convert(
const void* _from,
void* _to)
const override
162 return convert(
reinterpret_cast<const _TFrom_*
>(_from),
reinterpret_cast<_TTo_*
>(_to));
164 virtual ReturnVoid convert(
const _TFrom_* _from, _TTo_* _to)
const = 0;
166 template<
typename _TFrom_,
typename _TTo_, TypeCheckingMode _TypeCheckingMode_>
169 ReturnVoid convert(
const _TFrom_* _from, _TTo_* _to)
const override
174 template<ComparisonOperator _operator_,
typename _TLeft_,
typename _TRight_>
177 ComparisonOperator comparisonOperator()
const override {
return _operator_; }
182 return compare(*
reinterpret_cast<const _TLeft_*
>(_left), *
reinterpret_cast<const _TRight_*
>(_right));
184 virtual ReturnValue<bool> compare(
const _TLeft_& _left,
const _TRight_& _right)
const = 0;
187 template<ComparisonOperator _operator_,
typename _TLeft_,
typename _TRight_>
190 ReturnValue<bool> compare(
const _TLeft_& _left,
const _TRight_& _right)
const override
198 template<ArithmeticOperator _operator_,
typename _TLeft_,
typename _TRight_>
201 ArithmeticOperator arithmeticOperator()
const override {
return _operator_; }
206 return compute(*
reinterpret_cast<const _TLeft_*
>(_left), *
reinterpret_cast<const _TRight_*
>(_right));
208 virtual ReturnValue<Value> compute(
const _TLeft_& _left,
const _TRight_& _right)
const = 0;
211 template<ArithmeticOperator _operator_,
typename _TLeft_,
typename _TRight_>
214 ReturnValue<Value> compute(
const _TLeft_& _left,
const _TRight_& _right)
const override
235#define KNOWCORE_DEFINE_GENERIC_CONVERT(_TFrom_, _From_Arg_, _TTo_, _To_Arg_, _TypeCheckingMode_) \
237 struct knowCore::Converter<_TFrom_, _TTo_, knowCore::TypeCheckingMode::_TypeCheckingMode_> \
239 static inline ReturnVoid convert(const _TFrom_* _From_Arg_, _TTo_* _To_Arg_); \
241 inline knowCore::ReturnVoid \
242 knowCore::Converter<_TFrom_, _TTo_, \
243 knowCore::TypeCheckingMode::_TypeCheckingMode_>::convert(const _TFrom_* _from, _TTo_* _to)
258#define KNOWCORE_DEFINE_CONVERT(_TFrom_, _From_Arg_, _TTo_, _To_Arg_, _TypeCheckingMode_) \
260 struct knowCore::Converter<_TFrom_, _TTo_, knowCore::TypeCheckingMode::_TypeCheckingMode_> \
262 static inline ReturnVoid convert(const _TFrom_* _From_Arg_, _TTo_* _To_Arg_); \
264 inline knowCore::ReturnVoid \
265 knowCore::Converter<_TFrom_, _TTo_, \
266 knowCore::TypeCheckingMode::_TypeCheckingMode_>::convert(const _TFrom_* _from, _TTo_* _to)
273 virtual QVariant toQVariant(
const void* _data) = 0;
278 template <
typename T,
typename =
int>
282 template <
typename T>
283 struct HasToVariant <T, enable_if_exists_t<decltype(std::declval<T>().toVariant()), int>> : std::true_type { };
285 template<
typename _T_>
289 QVariant toQVariant(
const void* _data)
override
291 return reinterpret_cast<const _T_*
>(_data)->toVariant();
297 template<
typename _T_>
298 void registerMetaType()
307 template<
typename _TFrom_,
typename _TTo_>
308 void registerConverter(TypeCheckingMode _mode,
const std::function<ReturnVoid(
const _TFrom_*, _TTo_*)>& _converter)
310 struct ConversionImplementation :
public details::TypeConversionImplementation<_TFrom_, _TTo_>
312 ConversionImplementation(
const std::function<ReturnVoid(
const _TFrom_*, _TTo_*)>& _converter) : m_converter(_converter) {}
313 ReturnVoid convert(
const _TFrom_* _from,
const _TTo_* _to)
const override
315 return m_converter(_from, _to);
317 std::function<ReturnVoid(
const _TFrom_*, _TTo_*)> m_converter;
319 MetaTypeRegistry::registerConverter(
new ConversionImplementation(_converter));
324 template <
typename _TFrom_,
typename T, TypeCheckingMode,
typename =
int>
328 template <
typename _TFrom_,
typename _TTo_, TypeCheckingMode _TypeCheckingMode_>
330 enable_if_exists_t< decltype(
Converter<_TFrom_, _TTo_, _TypeCheckingMode_>::convert(
331 std::declval<_TFrom_*>(), std::declval<_TTo_*>())),
332 int>> : std::true_type { };
335 template<
typename _TFrom_,
typename _TTo_>
336 void registerConverter()
340 static_assert(has_safe or has_force,
"No converter was defined.");
341 if constexpr (has_safe)
345 if constexpr (has_force)
347 MetaTypeRegistry::registerConverter(TypeCheckingMode::Force,
new details::ConvertConversionImplementation<_TFrom_, _TTo_, TypeCheckingMode::Force>());
351 template<ComparisonOperator _operator_,
typename _TLeft_,
typename _TRight_>
352 void registerComparator(
const std::function<ReturnValue<bool>(
const _TLeft_&, _TRight_&)>& _comparator)
354 struct ComparatorImplementation :
public details::TypeComparatorImplementation<_operator_, _TLeft_, _TRight_>
356 ComparatorImplementation(
const std::function<ReturnValue<bool>(
const _TLeft_&, _TRight_&)>& _comparator) : m_comparator(_comparator) {}
357 ReturnValue<bool> compare(
const _TLeft_& _from,
const _TRight_& _to)
const override
359 return m_comparator(_from, _to);
361 std::function<ReturnValue<bool>(
const _TLeft_&,
const _TRight_&)> m_comparator;
363 MetaTypeRegistry::registerComparator(
new ComparatorImplementation(_comparator));
366 template<ComparisonOperator _operator_,
typename _TLeft_,
typename _TRight_>
367 void registerComparator()
369 MetaTypeRegistry::registerComparator(
new details::ComparatorComparatorImplementation<_operator_, _TLeft_, _TRight_>());
371 template<ArithmeticOperator _operator_,
typename _TLeft_,
typename _TRight_>
372 void registerArithmeticOperator()
374 MetaTypeRegistry::registerArithmeticOperator(
new details::ArithmeticOperationArtithmeticOperatorImplementation<_operator_, _TLeft_, _TRight_>());
377 template<
typename _TLeft_,
typename _TRight_>
378 void registerArithmeticOperators()
382 template<
typename _TLeft_,
typename _TRight_, ArithmeticOperator _operator_, ArithmeticOperator... _operator_others_>
383 void registerArithmeticOperators()
385 registerArithmeticOperator<_operator_, _TLeft_, _TRight_>();
386 registerArithmeticOperators<_TLeft_, _TRight_, _operator_others_...>();
389 template<
typename _T_>
390 void registerNumericType()
392 MetaTypeRegistry::registerNumericType(MetaTypeInformation<_T_>::uri());
393 if constexpr (not std::is_same_v<_T_, BigNumber>)
395 registerConverter<_T_, BigNumber>();
396 registerConverter<BigNumber, _T_>();
403 template<
typename _T_>
410 template<
typename _Q_ = MetaTypeInformation<_T_>>
416 template<
typename _Q_ = MetaTypeInformation<_T_>>
417 std::enable_if_t<not details::is_complete_v<_Q_>,
knowCore::Uri>
420 KNOWCORE_LOG_FATAL(
"No metatype information!");
422 template<
typename _Q_ = MetaTypeInformation<_T_>>
423 std::enable_if_t<details::is_complete_v<_Q_>,
int>
424 get_qMetaTypeId()
const
428 template<
typename _Q_ = MetaTypeInformation<_T_>>
429 std::enable_if_t<not details::is_complete_v<_Q_>,
int>
430 get_qMetaTypeId()
const
432 KNOWCORE_LOG_FATAL(
"No metatype information!");
441 return get_qMetaTypeId();
455 const auto [success, value, errorMessage] = toJsonValue(_value, _contexts);
460 doc.setArray(value.toArray());
461 }
else if(value.isObject())
463 doc.setObject(value.toObject());
465 KNOWCORE_LOG_FATAL(
"toJsonString/fromJsonString only works on object or array");
466 return expectedError(
"object or array", doc);
468 return kCrvSuccess(QString::fromUtf8(doc.toJson(QJsonDocument::Compact)));
470 return kCrvError(errorMessage);
473 ReturnVoid fromJsonString(_T_* _value,
const QString& _json_value,
const DeserialisationContexts& _contexts)
const
475 QJsonParseError error;
476 QJsonDocument doc = QJsonDocument::fromJson(_json_value.toUtf8(), &error);
479 return kCrvError(error.errorString());
483 return fromJsonValue(_value, doc.array(), _contexts);
484 }
else if(doc.isObject())
486 return fromJsonValue(_value, doc.object(), _contexts);
488 return expectedError(
"object or array", doc);
494 void* allocate()
const override
498 void* duplicate(
const void* _value)
const override
500 return new _T_(*
reinterpret_cast<const _T_*
>(_value));
502 void release(
void* _value)
const override
504 delete(
reinterpret_cast<_T_*
>(_value));
506 bool compareEquals(
const void* _lhs,
const void* _rhs)
const override
508 return *
reinterpret_cast<const _T_*
>(_lhs) == *
reinterpret_cast<const _T_*
>(_rhs);
512 return md5(*
reinterpret_cast<const _T_*
>(_value));
516 return toJsonValue(*
reinterpret_cast<const _T_*
>(_value), _contexts);
520 return fromJsonValue(
reinterpret_cast<_T_*
>(_value), _json_value, _contexts);
524 return toCborValue(*
reinterpret_cast<const _T_*
>(_value), _contexts);
528 return fromCborValue(
reinterpret_cast<_T_*
>(_value), _cbor_value, _contexts);
532 return printable(*
reinterpret_cast<const _T_ *
>(_value));
536 return toRdfLiteral(*
reinterpret_cast<const _T_*
>(_value), _contexts);
540 return fromRdfLiteral(
reinterpret_cast<_T_*
>(_value), _serialised, _contexts);
543 template<
typename _TCoJ_>
546 return kCrvError(
"Expected '{}' got '{}'", _what, _got);
548 template<
typename _TCoJ_>
549 ReturnValueError expectedArrayError(
const _TCoJ_& _coj)
const
551 return expectedError(
"array", _coj);
553 template<
typename _TCoJ_>
554 ReturnValueError expectedObjectError(
const _TCoJ_& _coj)
const
556 return expectedError(
"object", _coj);
562 template<
typename _T_>
571 QCryptographicHash hash(QCryptographicHash::Md5);
572 for(
const _T_& v : _value)
574 const auto [success, value, errorMessage] = m_nested.md5(v);
579 return kCrvError(errorMessage);
582 return kCrvSuccess(hash.result());
587 for(
const _T_& v : _value)
589 const auto [success, value, errorMessage] = m_nested.toJsonValue(v, _contexts);
594 return kCrvError(errorMessage);
597 return kCrvSuccess(array);
601 if(_json_value.isArray())
605 for(
const QJsonValue& value : _json_value.toArray())
608 const auto [success, errorMessage] = m_nested.fromJsonValue(&v, value, _contexts);
613 return kCrvError(errorMessage);
616 return kCrvSuccess();
618 return expectedArrayError(_json_value);
624 for(
const _T_& v : _value)
626 const auto [success, value, errorMessage] = m_nested.toCborValue(v, _contexts);
631 return kCrvError(errorMessage);
634 return kCrvSuccess(array);
638 if(_cbor_value.isArray())
642 for(
const QCborValue& value : _cbor_value.toArray())
645 const auto [success, errorMessage] = m_nested.fromCborValue(&v, value, _contexts);
650 return kCrvError(errorMessage);
653 return kCrvSuccess();
655 return expectedArrayError(_cbor_value);
661 for(
const _T_& v : _value)
663 KNOWCORE_RETURN_VALUE_TRY(value, m_nested.printable(v));
664 strings.append(value);
666 return kCrvSuccess(clog_qt::qformat(
"[{}]", strings));
670 return toJsonString(_value, _contexts);
674 return fromJsonString(_value, _serialised, _contexts);
683 template<
typename _TFrom_,
typename _TTo_>
684 inline _TTo_ qt_convert(
const _TFrom_& _from)
687 convert(&_from, &to).expectSuccess();
690 inline constexpr bool valid(
const char* _t)
698#define KNOWCORE_METATYPE_REGISTER(_TYPE_, _FUNC_) \
699 template<typename _T_, bool _has> \
701 template<typename _T_> \
702 struct _TYPE_<_T_, true> \
704 static void _FUNC_() \
706 QMetaType::_FUNC_<_T_>(); \
709 template<typename _T_> \
710 struct _TYPE_<_T_, false> \
712 static void _FUNC_() \
716 KNOWCORE_METATYPE_REGISTER(RegisterComparator, registerComparators)
717 KNOWCORE_METATYPE_REGISTER(RegisterEqualsComparator, registerEqualsComparator)
718 KNOWCORE_METATYPE_REGISTER(RegisterDebugStreamOperator, registerDebugStreamOperator)
719 template<
typename _T_,
typename _T2_,
bool _hasComparator>
721 template<
typename _T_,
typename _T2_>
724 static void registerConverter()
726 QMetaType::registerConverter<_T_, _T2_>(qt_convert<_T_, _T2_>);
727 knowCore::registerConverter<_T_, _T2_>();
730 template<
typename _T_,
typename _T2_>
733 static void registerConverter()
737 template<
typename _T_,
bool _is_numeric>
739 template<
typename _T_>
742 static void registerNumericDataType()
744 registerNumericType<_T_>();
747 template<
typename _T_>
750 static void registerNumericDataType()
756 KNOWCORE_LOG_FATAL(
"no uri defined for type!");
758 template<
typename _T_>
767#define __KNOWCORE_DEFINE_METATYPE__INTERNAL__(_TYPE_, _URI_, _TRAITS_) \
768 knowCore::MetaTypeInformation<_TYPE_> \
769 knowCore::MetaTypeInformation<_TYPE_>::s_instance; \
770 knowCore::MetaTypeInformation<_TYPE_>::MetaTypeInformation() \
772 m_id = qRegisterMetaType<_TYPE_>(# _TYPE_); \
773 knowCore::Details::RegisterComparator<_TYPE_, \
774 bool((_TRAITS_) & knowCore::MetaTypeTraits::Comparable)>::registerComparators(); \
775 knowCore::Details::RegisterEqualsComparator<_TYPE_, \
776 bool((_TRAITS_) & knowCore::MetaTypeTraits::OnlyEqualComparable)>::registerEqualsComparator(); \
777 knowCore::Details::RegisterConverter<_TYPE_, QString, \
778 bool((_TRAITS_) & knowCore::MetaTypeTraits::ToString)>::registerConverter(); \
779 knowCore::Details::RegisterConverter<QString, _TYPE_, \
780 bool((_TRAITS_) & knowCore::MetaTypeTraits::FromString)>::registerConverter(); \
781 knowCore::Details::RegisterConverter<_TYPE_, QByteArray, \
782 bool((_TRAITS_) & knowCore::MetaTypeTraits::ToByteArray)>::registerConverter(); \
783 knowCore::Details::RegisterConverter<QByteArray, _TYPE_, \
784 bool((_TRAITS_) & knowCore::MetaTypeTraits::FromByteArray)>::registerConverter(); \
785 knowCore::Details::RegisterDebugStreamOperator<_TYPE_, \
786 bool((_TRAITS_) & knowCore::MetaTypeTraits::DebugStreamOperator)>::registerDebugStreamOperator(); \
787 knowCore::Details::RegisterNumericDataType<_TYPE_, \
789 knowCore::MetaTypeTraits::NumericType)>::registerNumericDataType(); \
790 init_knowCoreMetaType(); \
793#define KNOWCORE_DEFINE_QT_METATYPE(_TYPE_, _TRAITS_) \
794 void knowCore::MetaTypeInformation<_TYPE_>::init_knowCoreMetaType() {} \
795 __KNOWCORE_DEFINE_METATYPE__INTERNAL__(_TYPE_, nullptr, _TRAITS_)
800#define KNOWCORE_DEFINE_METATYPE_URI(_TYPE_, _URI_) \
801 knowCore::Uri knowCore::MetaTypeInformation<_TYPE_>::uri() \
803 return knowCore::Details::makeUri(_URI_); \
812#define KNOWCORE_DEFINE_METATYPE(_TYPE_, _URI_, _TRAITS_) \
813 KNOWCORE_DEFINE_METATYPE_URI(_TYPE_, _URI_) \
814 knowCore::AbstractMetaTypeDefinition* knowCore::MetaTypeInformation<_TYPE_>::definition() \
816 static knowCore::AbstractMetaTypeDefinition* definition = new knowCore::MetaTypeDefinition<_TYPE_>(); \
819 void knowCore::MetaTypeInformation<_TYPE_>::init_knowCoreMetaType() \
821 registerMetaType<_TYPE_>(); \
823 __KNOWCORE_DEFINE_METATYPE__INTERNAL__(_TYPE_, _URI_, _TRAITS_)
826#define __KNOWCORE_REGISTER_CONVERSION_FROM_ONE(_TYPE_, I) \
827 if constexpr(not std::is_same_v<TypeFrom, _TYPE_>) { \
828 knowCore::registerConverter<TypeFrom, _TYPE_>(); \
831#define __KNOWCORE_REGISTER_CONVERSION_FROM(_FACTORY_NAME_, _TYPE_FROM_, ...) \
834 class _FACTORY_NAME_\
839 typedef _TYPE_FROM_ TypeFrom; \
840 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_CONVERSION_FROM_ONE, __VA_ARGS__) \
842 static _FACTORY_NAME_ s_instance; \
844 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
855#define KNOWCORE_REGISTER_CONVERSION_FROM(_TYPE_FROM_, ...) \
856 __KNOWCORE_REGISTER_CONVERSION_FROM(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeRegisterConversion), _TYPE_FROM_, __VA_ARGS__)
858#define __KNOWCORE_REGISTER_CONVERSION_TO_ONE(_TYPE_, I) \
859 if constexpr(not std::is_same_v<_TYPE_, TypeTo>) { \
860 knowCore::registerConverter<_TYPE_, TypeTo>(); \
863#define __KNOWCORE_REGISTER_CONVERSION_TO(_FACTORY_NAME_, _TYPE_TO_, ...) \
866 class _FACTORY_NAME_ \
871 typedef _TYPE_TO_ TypeTo; \
872 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_CONVERSION_TO_ONE, __VA_ARGS__) \
874 static _FACTORY_NAME_ s_instance; \
876 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
887#define KNOWCORE_REGISTER_CONVERSION_TO(_TYPE_TO_, ...) \
888 __KNOWCORE_REGISTER_CONVERSION_TO(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeRegisterConversion), _TYPE_TO_, __VA_ARGS__)
890#define __KNOWCORE_REGISTER_COMPARATOR_FROM_ONE(_TYPE_, I) \
891 if constexpr(not std::is_same_v<TypeFrom, _TYPE_> \
892 or comparatorOperator != knowCore::ComparisonOperator::Equal) { \
893 knowCore::registerComparator<comparatorOperator, TypeFrom, _TYPE_>(); \
896#define __KNOWCORE_REGISTER_COMPARATOR_FROM(_FACTORY_NAME_, _COMPARATOR_, _TYPE_FROM_, ...) \
899 class _FACTORY_NAME_ \
901 static constexpr knowCore::ComparisonOperator comparatorOperator = _COMPARATOR_; \
905 typedef _TYPE_FROM_ TypeFrom; \
906 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_COMPARATOR_FROM_ONE, __VA_ARGS__) \
908 static _FACTORY_NAME_ s_instance; \
910 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
914#define KNOWCORE_REGISTER_COMPARATOR_FROM(_COMPARATOR_, _TYPE_FROM_, ...) \
915 __KNOWCORE_REGISTER_COMPARATOR_FROM(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeRegisterComparator), _COMPARATOR_, _TYPE_FROM_, __VA_ARGS__)
920#define KNOWCORE_REGISTER_COMPARATOR(_COMPARATOR_, _TYPE_) \
921 KNOWCORE_REGISTER_COMPARATOR_FROM(_COMPARATOR_, _TYPE_, _TYPE_)
925#define __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_FROM_ONE(_TYPE_, I) \
926 knowCore::registerArithmeticOperators<_LeftType_, _TYPE_, _operators_...>();
928#define __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_MAKE_OPERATORS_ONE(_OPERATOR_, I) \
929 , knowCore::ArithmeticOperator::_OPERATOR_
930#define __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_MAKE_OPERATORS(...) \
931 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_MAKE_OPERATORS_ONE, __VA_ARGS__)
934#define __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR(_FACTORY_NAME_, _OPERATORS_, _LEFT_, ...) \
937 class _FACTORY_NAME_ \
942 registerArithmeticOperators<_LEFT_ __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_MAKE_OPERATORS _OPERATORS_>(); \
944 static _FACTORY_NAME_ s_instance; \
946 template<typename _LeftType_, ArithmeticOperator... _operators_> \
947 void registerArithmeticOperators() \
949 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_FROM_ONE, __VA_ARGS__) \
952 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
955#define KNOWCORE_REGISTER_ARITHMETIC_OPERATORS(_OPERATORS_, _LEFT_TYPE_, ...) \
956 __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeRegisterArithmeticOperator), _OPERATORS_, _LEFT_TYPE_, __VA_ARGS__)
960#define KNOWCORE_DEFINE_METATYPE_START_IMPLEMENTATION_TEMPLATE(_TYPE_, _ENABLE_) \
961 class knowCore::MetaTypeDefinition<_TYPE_, _ENABLE_> : \
962 public knowCore::MetaTypeDefinitionImplementation<_TYPE_> \
964 template<typename _TT_, typename _ENABLED_> \
965 friend class knowCore::MetaTypeDefinition; \
966 using knowCore::MetaTypeDefinitionImplementation<_TYPE_>::expectedError; \
967 using knowCore::MetaTypeDefinitionImplementation<_TYPE_>::expectedObjectError; \
968 using knowCore::MetaTypeDefinitionImplementation<_TYPE_>::expectedArrayError; \
969 using knowCore::MetaTypeDefinitionImplementation<_TYPE_>::toJsonString; \
970 using knowCore::MetaTypeDefinitionImplementation<_TYPE_>::fromJsonString; \
973#define KNOWCORE_DEFINE_METATYPE_FINISH_IMPLEMENTATION(_TYPE_) \
976#define KNOWCORE_DEFINE_METATYPE_START_IMPLEMENTATION(_TYPE_) \
978 KNOWCORE_DEFINE_METATYPE_START_IMPLEMENTATION_TEMPLATE(_TYPE_, void)
980#define KNOWCORE_DEFINE_METATYPE_IMPLEMENTATION_ALIAS(_TYPE_1_, _TYPE_2_) \
982 class knowCore::MetaTypeDefinition<_TYPE_1_> : \
983 public knowCore::MetaTypeDefinition<_TYPE_2_> \
986 knowCore::Uri uri() const override \
988 return MetaTypeInformation<_TYPE_1_>::uri(); \
990 int qMetaTypeId() const override \
992 return MetaTypeInformation<_TYPE_1_>::id(); \
996#define __KNOWCORE_URIFY(_URI_, I) knowCore::Details::makeUri(_URI_),
998#define __KNOWCORE_URIFY_LIST(...) KNOWCORE_FOREACH(__KNOWCORE_URIFY, __VA_ARGS__)
1000#define __KNOWCORE_DEFINE_METATYPE_ALIASES__INTERNAL__(_FACTORY_NAME_, ...) \
1003 class _FACTORY_NAME_ \
1008 QList<knowCore::Uri> uris = { __KNOWCORE_URIFY_LIST(__VA_ARGS__) }; \
1009 KNOWCORE_ASSERT(uris.size() > 0); \
1010 knowCore::Uri to = uris.takeLast(); \
1011 knowCore::registerMetaTypeAliases(uris, to); \
1013 static _FACTORY_NAME_ s_instance; \
1015 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
1027#define KNOWCORE_DEFINE_METATYPE_ALIASES(...) \
1028 __KNOWCORE_DEFINE_METATYPE_ALIASES__INTERNAL__(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeAlias), __VA_ARGS__)
Definition MetaType.h:253
Definition MetaTypeImplementation.h:271
Definition MetaType.h:244
Definition MetaType.h:236
Class that can contains large numeric value.
Definition BigNumber.h:46
Definition MetaType.h:114
knowCore::ReturnValue< AbstractDeserialisationContext * > getContext(const knowCore::Uri &_uri) const
Definition MetaType.cpp:90
Definition MetaTypeImplementation.h:720
Definition NamedType.h:40
Definition ReturnValue.h:85
Definition ReturnValue.h:29
Definition MetaType.h:145
knowCore::ReturnValue< AbstractSerialisationContext * > getContext(const knowCore::Uri &_uri) const
Definition MetaType.cpp:132
static Value fromValue(const _T_ &_value)
Definition Value.h:184
Definition MetaTypeImplementation.h:287
Definition MetaTypeImplementation.h:80
Definition MetaTypeImplementation.h:85
Definition MetaTypeImplementation.h:138
Definition MetaTypeImplementation.h:90
Definition MetaTypeImplementation.h:95
Definition MetaTypeImplementation.h:93
Definition MetaTypeImplementation.h:54
Definition MetaTypeImplementation.h:52
Definition MetaTypeImplementation.h:50
Definition MetaTypeImplementation.h:738
Definition MetaTypeImplementation.h:213
Definition MetaTypeImplementation.h:200
Definition MetaTypeImplementation.h:189
Definition MetaTypeImplementation.h:168
Definition MetaTypeImplementation.h:325
Definition MetaTypeImplementation.h:279
Definition MetaTypeImplementation.h:176
Definition MetaTypeImplementation.h:157
Definition MetaTypeImplementation.h:115