knowL: Knowledge Libraries
Loading...
Searching...
No Matches
MetaTypeImplementation.h
1#pragma once
2
3#include <QCborArray>
4#include <QCryptographicHash>
5#include <QJsonArray>
6#include <QJsonDocument>
7#include <QJsonObject>
8
9#include "Value.h"
10
11namespace knowCore
12{
13 class BigNumber;
14
15 //BEGIN Serialisation/Deserialisation Contexts
16
17 namespace details
18 {
19 template<typename _T_, typename _TC_>
20 knowCore::ReturnValue<_T_*> SeDeContexts_getContext(_TC_* _contexts, const knowCore::Uri& _uri)
21 {
22 KNOWCORE_RETURN_VALUE_TRY(context, _contexts->getContext(_uri));
23 _T_* casted = dynamic_cast<_T_*>(context);
24 if(casted)
25 {
26 return kCrvSuccess(casted);
27 } else {
28 return kCrvError("Cannot cast context to '{}'", knowCore::prettyTypename<_T_>());
29 }
30 }
31 }
32
33 template<typename _T_>
35 {
36 return details::SeDeContexts_getContext<_T_>(this, _uri);
37 }
38
39 template<typename _T_>
41 {
42 return details::SeDeContexts_getContext<_T_>(this, _uri);
43 }
44
45 //END Serialisation/Deserialisation Contexts
46
47 //BEGIN Converter API
48 class Uri;
49 template<typename _TFrom_, typename _TTo_, TypeCheckingMode _TypeCheckingMode_, typename _Enable_ = void>
50 struct Converter;
51 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_, typename _Enable_ = void>
52 struct Comparator;
53 template<ArithmeticOperator _operator_, typename _TLeft_, typename _TRight_, typename _Enable_ = void>
55
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_>>>
58 {
59 static inline ReturnVoid convert(const _TFrom_* _from, _TTo_* _to)
60 {
61 *_to = *_from;
62 return kCrvSuccess();
63 }
64 };
65 template<typename _TFrom_, typename _TTo_, TypeCheckingMode _TypeCheckingMode_ = TypeCheckingMode::Safe>
66 inline ReturnVoid convert(const _TFrom_* _from, _TTo_* _to)
67 {
69 }
70
71 template<ComparisonOperator _operator_, typename _TFrom_, typename _TTo_>
72 inline ReturnValue<bool> compare(const _TFrom_& _from, _TTo_& _to)
73 {
74 return Comparator<_operator_, _TFrom_, _TTo_>::compare(_from, _to);
75 }
76 //BEGIN Comparator
77 namespace details
78 {
79 template<typename _TLeft_, typename _TRight_>
81 requires(_TLeft_ a, _TRight_ b) {
82 { a == b } -> std::convertible_to<bool>;
83 };
84 template<typename _TLeft_, typename _TRight_>
86 requires(_TLeft_ a, _TRight_ b) {
87 { a < b } -> std::convertible_to<bool>;
88 };
89 template<typename _Tp>
90 concept is_integral = std::is_integral_v<_Tp>;
91
92 template<typename _TLeft_, typename _TRight_>
93 concept left_unsigned_right_signed = std::unsigned_integral<_TLeft_> and std::signed_integral<_TRight_> and std::integral<_TRight_>;
94 template<typename _TLeft_, typename _TRight_>
95 concept left_signed_right_unsigned = std::signed_integral<_TLeft_> and std::unsigned_integral<_TRight_> and std::integral<_TLeft_>;
96 }
97
98 template<typename _TLeft_, typename _TRight_>
102 struct Comparator<ComparisonOperator::Inferior, _TLeft_, _TRight_>
103 {
104 static knowCore::ReturnValue<bool> compare(const _TLeft_& _left, const _TRight_& _right)
105 {
106 return kCrvSuccess(_left < _right);
107 }
108 };
109 //END Comparator
110
111 //BEGIN ArithmeticOperation
112 namespace details
113 {
114 template<ArithmeticOperator _operator_, typename _TLeft_, typename _TRight_>
115 struct op_trait;
116
117 template<typename _TLeft_, typename _TRight_>
118 struct op_trait<ArithmeticOperator::Addition, _TLeft_, _TRight_>
119 {
120 static auto compute(_TLeft_ _x, _TRight_ _y) { return _x + _y; }
121 };
122 template<typename _TLeft_, typename _TRight_>
123 struct op_trait<ArithmeticOperator::Substraction, _TLeft_, _TRight_>
124 {
125 static auto compute(_TLeft_ _x, _TRight_ _y) { return _x - _y; }
126 };
127 template<typename _TLeft_, typename _TRight_>
128 struct op_trait<ArithmeticOperator::Division, _TLeft_, _TRight_>
129 {
130 static auto compute(_TLeft_ _x, _TRight_ _y) { return _x / _y; }
131 };
132 template<typename _TLeft_, typename _TRight_>
133 struct op_trait<ArithmeticOperator::Multiplication, _TLeft_, _TRight_>
134 {
135 static auto compute(_TLeft_ _x, _TRight_ _y) { return _x * _y; }
136 };
137
138 template <typename T> concept arithmetic = std::is_arithmetic_v<T>;
139 }
140 template<ArithmeticOperator _operator_, typename _TLeft_, typename _TRight_> requires details::arithmetic<_TLeft_> and details::arithmetic<_TRight_>
141 struct ArithmeticOperation<_operator_, _TLeft_, _TRight_>
142 {
144 static ReturnValue<knowCore::Value> compute(const _TLeft_& _left, const _TRight_& _right)
145 {
146 return kCrvSuccess(Value::fromValue(op_trait::compute(_left, _right)));
147 }
148 };
149
150 //END ArithmeticOperation
151
152
153 namespace details
154 {
155 template<typename _TFrom_, typename _TTo_>
157 {
158 knowCore::Uri from() const override { return MetaTypeInformation<_TFrom_>::uri(); }
159 knowCore::Uri to() const override { return MetaTypeInformation<_TTo_>::uri(); }
160 ReturnVoid convert(const void* _from, void* _to) const override
161 {
162 return convert(reinterpret_cast<const _TFrom_*>(_from), reinterpret_cast<_TTo_*>(_to));
163 }
164 virtual ReturnVoid convert(const _TFrom_* _from, _TTo_* _to) const = 0;
165 };
166 template<typename _TFrom_, typename _TTo_, TypeCheckingMode _TypeCheckingMode_>
168 {
169 ReturnVoid convert(const _TFrom_* _from, _TTo_* _to) const override
170 {
172 }
173 };
174 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_>
176 {
177 ComparisonOperator comparisonOperator() const override { return _operator_; }
178 knowCore::Uri left() const override { return MetaTypeInformation<_TLeft_>::uri(); }
179 knowCore::Uri right() const override { return MetaTypeInformation<_TRight_>::uri(); }
180 ReturnValue<bool> compare(const void* _left, const void* _right) const override
181 {
182 return compare(*reinterpret_cast<const _TLeft_*>(_left), *reinterpret_cast<const _TRight_*>(_right));
183 }
184 virtual ReturnValue<bool> compare(const _TLeft_& _left, const _TRight_& _right) const = 0;
185 };
186
187 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_>
188 struct ComparatorComparatorImplementation : public TypeComparatorImplementation<_operator_, _TLeft_, _TRight_>
189 {
190 ReturnValue<bool> compare(const _TLeft_& _left, const _TRight_& _right) const override
191 {
193 }
194 };
195 /*************************
196 * Artithmetic Operators *
197 *************************/
198 template<ArithmeticOperator _operator_, typename _TLeft_, typename _TRight_>
200 {
201 ArithmeticOperator arithmeticOperator() const override { return _operator_; }
202 knowCore::Uri left() const override { return MetaTypeInformation<_TLeft_>::uri(); }
203 knowCore::Uri right() const override { return MetaTypeInformation<_TRight_>::uri(); }
204 ReturnValue<Value> compute(const void* _left, const void* _right) const override
205 {
206 return compute(*reinterpret_cast<const _TLeft_*>(_left), *reinterpret_cast<const _TRight_*>(_right));
207 }
208 virtual ReturnValue<Value> compute(const _TLeft_& _left, const _TRight_& _right) const = 0;
209 };
210
211 template<ArithmeticOperator _operator_, typename _TLeft_, typename _TRight_>
213 {
214 ReturnValue<Value> compute(const _TLeft_& _left, const _TRight_& _right) const override
215 {
217 }
218 };
219 }
220
221
235#define KNOWCORE_DEFINE_GENERIC_CONVERT(_TFrom_, _From_Arg_, _TTo_, _To_Arg_, _TypeCheckingMode_) \
236 template<> \
237 struct knowCore::Converter<_TFrom_, _TTo_, knowCore::TypeCheckingMode::_TypeCheckingMode_> \
238 { \
239 static inline ReturnVoid convert(const _TFrom_* _From_Arg_, _TTo_* _To_Arg_); \
240 }; \
241 inline knowCore::ReturnVoid \
242 knowCore::Converter<_TFrom_, _TTo_, \
243 knowCore::TypeCheckingMode::_TypeCheckingMode_>::convert(const _TFrom_* _from, _TTo_* _to)
244
258#define KNOWCORE_DEFINE_CONVERT(_TFrom_, _From_Arg_, _TTo_, _To_Arg_, _TypeCheckingMode_) \
259 template<> \
260 struct knowCore::Converter<_TFrom_, _TTo_, knowCore::TypeCheckingMode::_TypeCheckingMode_> \
261 { \
262 static inline ReturnVoid convert(const _TFrom_* _From_Arg_, _TTo_* _To_Arg_); \
263 }; \
264 inline knowCore::ReturnVoid \
265 knowCore::Converter<_TFrom_, _TTo_, \
266 knowCore::TypeCheckingMode::_TypeCheckingMode_>::convert(const _TFrom_* _from, _TTo_* _to)
267 //END Converter API
268
269 //BEGIN Variant Marshal API
271 {
272 public:
273 virtual QVariant toQVariant(const void* _data) = 0;
274 };
275
276 namespace details
277 {
278 template <typename T, typename = int>
279 struct HasToVariant : std::false_type { };
280
281
282 template <typename T>
283 struct HasToVariant <T, enable_if_exists_t<decltype(std::declval<T>().toVariant()), int>> : std::true_type { };
284
285 template<typename _T_>
287 {
288 public:
289 QVariant toQVariant(const void* _data) override
290 {
291 return reinterpret_cast<const _T_*>(_data)->toVariant();
292 }
293 };
294 }
295
296 //BEGIN register functions
297 template<typename _T_>
298 void registerMetaType()
299 {
300 MetaTypeRegistry::registerType(MetaTypeInformation<_T_>::definition());
302 {
303 MetaTypeRegistry::registerToVariant(MetaTypeInformation<_T_>::uri(), new details::ToVariantMarshalImplementation<_T_>());
304 }
305 }
306
307 template<typename _TFrom_, typename _TTo_>
308 void registerConverter(TypeCheckingMode _mode, const std::function<ReturnVoid(const _TFrom_*, _TTo_*)>& _converter)
309 {
310 struct ConversionImplementation : public details::TypeConversionImplementation<_TFrom_, _TTo_>
311 {
312 ConversionImplementation(const std::function<ReturnVoid(const _TFrom_*, _TTo_*)>& _converter) : m_converter(_converter) {}
313 ReturnVoid convert(const _TFrom_* _from, const _TTo_* _to) const override
314 {
315 return m_converter(_from, _to);
316 }
317 std::function<ReturnVoid(const _TFrom_*, _TTo_*)> m_converter;
318 };
319 MetaTypeRegistry::registerConverter(new ConversionImplementation(_converter));
320 }
321
322 namespace details
323 {
324 template <typename _TFrom_, typename T, TypeCheckingMode, typename = int>
325 struct HasConversionMode : std::false_type { };
326
327
328 template <typename _TFrom_, typename _TTo_, TypeCheckingMode _TypeCheckingMode_>
329 struct HasConversionMode <_TFrom_, _TTo_, _TypeCheckingMode_,
330 enable_if_exists_t< decltype(Converter<_TFrom_, _TTo_, _TypeCheckingMode_>::convert(
331 std::declval<_TFrom_*>(), std::declval<_TTo_*>())),
332 int>> : std::true_type { };
333 }
334
335 template<typename _TFrom_, typename _TTo_>
336 void registerConverter()
337 {
340 static_assert(has_safe or has_force, "No converter was defined.");
341 if constexpr (has_safe)
342 {
343 MetaTypeRegistry::registerConverter(TypeCheckingMode::Safe, new details::ConvertConversionImplementation<_TFrom_, _TTo_, TypeCheckingMode::Safe>());
344 }
345 if constexpr (has_force)
346 {
347 MetaTypeRegistry::registerConverter(TypeCheckingMode::Force, new details::ConvertConversionImplementation<_TFrom_, _TTo_, TypeCheckingMode::Force>());
348 }
349 }
350
351 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_>
352 void registerComparator(const std::function<ReturnValue<bool>(const _TLeft_&, _TRight_&)>& _comparator)
353 {
354 struct ComparatorImplementation : public details::TypeComparatorImplementation<_operator_, _TLeft_, _TRight_>
355 {
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
358 {
359 return m_comparator(_from, _to);
360 }
361 std::function<ReturnValue<bool>(const _TLeft_&, const _TRight_&)> m_comparator;
362 };
363 MetaTypeRegistry::registerComparator(new ComparatorImplementation(_comparator));
364 }
365
366 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_>
367 void registerComparator()
368 {
369 MetaTypeRegistry::registerComparator(new details::ComparatorComparatorImplementation<_operator_, _TLeft_, _TRight_>());
370 }
371 template<ArithmeticOperator _operator_, typename _TLeft_, typename _TRight_>
372 void registerArithmeticOperator()
373 {
374 MetaTypeRegistry::registerArithmeticOperator(new details::ArithmeticOperationArtithmeticOperatorImplementation<_operator_, _TLeft_, _TRight_>());
375 }
376
377 template<typename _TLeft_, typename _TRight_>
378 void registerArithmeticOperators()
379 {
380 }
381
382 template<typename _TLeft_, typename _TRight_, ArithmeticOperator _operator_, ArithmeticOperator... _operator_others_>
383 void registerArithmeticOperators()
384 {
385 registerArithmeticOperator<_operator_, _TLeft_, _TRight_>();
386 registerArithmeticOperators<_TLeft_, _TRight_, _operator_others_...>();
387 }
388
389 template<typename _T_>
390 void registerNumericType()
391 {
392 MetaTypeRegistry::registerNumericType(MetaTypeInformation<_T_>::uri());
393 if constexpr (not std::is_same_v<_T_, BigNumber>)
394 {
395 registerConverter<_T_, BigNumber>();
396 registerConverter<BigNumber, _T_>();
397 }
398 }
399
400 //END register functions
401
402 //BEGIN MetaTypeDefinitionImplementation
403 template<typename _T_>
405 {
406 public:
408 {}
409 private:
410 template<typename _Q_ = MetaTypeInformation<_T_>>
411 std::enable_if_t<details::is_complete_v<_Q_>, knowCore::Uri>
412 get_uri() const
413 {
415 }
416 template<typename _Q_ = MetaTypeInformation<_T_>>
417 std::enable_if_t<not details::is_complete_v<_Q_>, knowCore::Uri>
418 get_uri() const
419 {
420 KNOWCORE_LOG_FATAL("No metatype information!");
421 }
422 template<typename _Q_ = MetaTypeInformation<_T_>>
423 std::enable_if_t<details::is_complete_v<_Q_>, int>
424 get_qMetaTypeId() const
425 {
427 }
428 template<typename _Q_ = MetaTypeInformation<_T_>>
429 std::enable_if_t<not details::is_complete_v<_Q_>, int>
430 get_qMetaTypeId() const
431 {
432 KNOWCORE_LOG_FATAL("No metatype information!");
433 }
434 protected:
435 knowCore::Uri uri() const override
436 {
437 return get_uri();
438 }
439 int qMetaTypeId() const override
440 {
441 return get_qMetaTypeId();
442 }
443 virtual ReturnValue<QByteArray> md5(const _T_& _value) const = 0;
444 virtual ReturnValue<QJsonValue> toJsonValue(const _T_& _value, const SerialisationContexts& _contexts) const = 0;
445 virtual ReturnVoid fromJsonValue(_T_* _value, const QJsonValue& _json_value, const knowCore::DeserialisationContexts& _contexts) const = 0;
446 virtual ReturnValue<QCborValue> toCborValue(const _T_& _value, const SerialisationContexts& _contexts) const = 0;
447 virtual ReturnVoid fromCborValue(_T_* _value, const QCborValue& _cbor_value, const knowCore::DeserialisationContexts& _contexts) const = 0;
448 virtual ReturnValue<QString> printable(const _T_& _value) const = 0;
449 virtual ReturnValue<QString> toRdfLiteral(const _T_& _value, const SerialisationContexts& _contexts) const = 0;
450 virtual ReturnVoid fromRdfLiteral(_T_* _value, const QString& _serialised, const DeserialisationContexts& _contexts) const = 0;
451 protected:
452 ReturnValue<QString> toJsonString(const _T_& _value, const SerialisationContexts& _contexts) const
453 {
454 QJsonDocument doc;
455 const auto [success, value, errorMessage] = toJsonValue(_value, _contexts);
456 if(success)
457 {
458 if(value.isArray())
459 {
460 doc.setArray(value.toArray());
461 } else if(value.isObject())
462 {
463 doc.setObject(value.toObject());
464 } else {
465 KNOWCORE_LOG_FATAL("toJsonString/fromJsonString only works on object or array");
466 return expectedError("object or array", doc);
467 }
468 return kCrvSuccess(QString::fromUtf8(doc.toJson(QJsonDocument::Compact)));
469 } else {
470 return kCrvError(errorMessage);
471 }
472 }
473 ReturnVoid fromJsonString(_T_* _value, const QString& _json_value, const DeserialisationContexts& _contexts) const
474 {
475 QJsonParseError error;
476 QJsonDocument doc = QJsonDocument::fromJson(_json_value.toUtf8(), &error);
477 if(doc.isNull())
478 {
479 return kCrvError(error.errorString());
480 } else {
481 if(doc.isArray())
482 {
483 return fromJsonValue(_value, doc.array(), _contexts);
484 } else if(doc.isObject())
485 {
486 return fromJsonValue(_value, doc.object(), _contexts);
487 } else {
488 return expectedError("object or array", doc);
489 }
490 }
491 }
492
493 protected:
494 void* allocate() const override
495 {
496 return new _T_;
497 }
498 void* duplicate(const void* _value) const override
499 {
500 return new _T_(*reinterpret_cast<const _T_*>(_value));
501 }
502 void release(void* _value) const override
503 {
504 delete(reinterpret_cast<_T_*>(_value));
505 }
506 bool compareEquals(const void* _lhs, const void* _rhs) const override
507 {
508 return *reinterpret_cast<const _T_*>(_lhs) == *reinterpret_cast<const _T_*>(_rhs);
509 }
510 ReturnValue<QByteArray> md5(const void* _value) const override
511 {
512 return md5(*reinterpret_cast<const _T_*>(_value));
513 }
514 ReturnValue<QJsonValue> toJsonValue(const void* _value, const SerialisationContexts& _contexts) const override
515 {
516 return toJsonValue(*reinterpret_cast<const _T_*>(_value), _contexts);
517 }
518 ReturnVoid fromJsonValue(void* _value, const QJsonValue& _json_value, const DeserialisationContexts& _contexts) const override
519 {
520 return fromJsonValue(reinterpret_cast<_T_*>(_value), _json_value, _contexts);
521 }
522 ReturnValue<QCborValue> toCborValue(const void* _value, const SerialisationContexts& _contexts) const override
523 {
524 return toCborValue(*reinterpret_cast<const _T_*>(_value), _contexts);
525 }
526 ReturnVoid fromCborValue(void* _value, const QCborValue& _cbor_value, const DeserialisationContexts& _contexts) const override
527 {
528 return fromCborValue(reinterpret_cast<_T_*>(_value), _cbor_value, _contexts);
529 }
530 ReturnValue<QString> printable(const void* _value) const override
531 {
532 return printable(*reinterpret_cast<const _T_ *>(_value));
533 }
534 ReturnValue<QString> toRdfLiteral(const void* _value, const SerialisationContexts& _contexts) const override
535 {
536 return toRdfLiteral(*reinterpret_cast<const _T_*>(_value), _contexts);
537 }
538 ReturnVoid fromRdfLiteral(void* _value, const QString& _serialised, const DeserialisationContexts& _contexts) const override
539 {
540 return fromRdfLiteral(reinterpret_cast<_T_*>(_value), _serialised, _contexts);
541 }
542 protected:
543 template<typename _TCoJ_>
544 ReturnValueError expectedError(const char* _what, const _TCoJ_& _got) const
545 {
546 return kCrvError("Expected '{}' got '{}'", _what, _got);
547 }
548 template<typename _TCoJ_>
549 ReturnValueError expectedArrayError(const _TCoJ_& _coj) const
550 {
551 return expectedError("array", _coj);
552 }
553 template<typename _TCoJ_>
554 ReturnValueError expectedObjectError(const _TCoJ_& _coj) const
555 {
556 return expectedError("object", _coj);
557 }
558 };
559 //END MetaTypeDefinitionImplementation
560
561 //BEGIN MetaTypeDefinition for QList
562 template<typename _T_>
564 {
568 protected:
569 ReturnValue<QByteArray> md5(const QList<_T_>& _value) const override
570 {
571 QCryptographicHash hash(QCryptographicHash::Md5);
572 for(const _T_& v : _value)
573 {
574 const auto [success, value, errorMessage] = m_nested.md5(v);
575 if(success)
576 {
577 hash.addData(value);
578 } else {
579 return kCrvError(errorMessage);
580 }
581 }
582 return kCrvSuccess(hash.result());
583 }
584 ReturnValue<QJsonValue> toJsonValue(const QList<_T_>& _value, const SerialisationContexts& _contexts) const override
585 {
586 QJsonArray array;
587 for(const _T_& v : _value)
588 {
589 const auto [success, value, errorMessage] = m_nested.toJsonValue(v, _contexts);
590 if(success)
591 {
592 array.append(value);
593 } else {
594 return kCrvError(errorMessage);
595 }
596 }
597 return kCrvSuccess(array);
598 }
599 ReturnVoid fromJsonValue(QList<_T_>* _value, const QJsonValue& _json_value, const knowCore::DeserialisationContexts& _contexts) const override
600 {
601 if(_json_value.isArray())
602 {
603 deleteAll(*_value);
604 _value->clear();
605 for(const QJsonValue& value : _json_value.toArray())
606 {
607 _T_ v;
608 const auto [success, errorMessage] = m_nested.fromJsonValue(&v, value, _contexts);
609 if(success)
610 {
611 _value->append(v);
612 } else {
613 return kCrvError(errorMessage);
614 }
615 }
616 return kCrvSuccess();
617 } else {
618 return expectedArrayError(_json_value);
619 }
620 }
621 ReturnValue<QCborValue> toCborValue(const QList<_T_>& _value, const SerialisationContexts& _contexts) const override
622 {
623 QCborArray array;
624 for(const _T_& v : _value)
625 {
626 const auto [success, value, errorMessage] = m_nested.toCborValue(v, _contexts);
627 if(success)
628 {
629 array.append(value);
630 } else {
631 return kCrvError(errorMessage);
632 }
633 }
634 return kCrvSuccess(array);
635 }
636 ReturnVoid fromCborValue(QList<_T_>* _value, const QCborValue& _cbor_value, const knowCore::DeserialisationContexts& _contexts) const override
637 {
638 if(_cbor_value.isArray())
639 {
640 deleteAll(*_value);
641 _value->clear();
642 for(const QCborValue& value : _cbor_value.toArray())
643 {
644 _T_ v;
645 const auto [success, errorMessage] = m_nested.fromCborValue(&v, value, _contexts);
646 if(success)
647 {
648 _value->append(v);
649 } else {
650 return kCrvError(errorMessage);
651 }
652 }
653 return kCrvSuccess();
654 } else {
655 return expectedArrayError(_cbor_value);
656 }
657 }
658 ReturnValue<QString> printable(const QList<_T_>& _value) const override
659 {
660 QStringList strings;
661 for(const _T_& v : _value)
662 {
663 KNOWCORE_RETURN_VALUE_TRY(value, m_nested.printable(v));
664 strings.append(value);
665 }
666 return kCrvSuccess(clog_qt::qformat("[{}]", strings));
667 }
668 ReturnValue<QString> toRdfLiteral(const QList<_T_>& _value, const SerialisationContexts& _contexts) const override
669 {
670 return toJsonString(_value, _contexts);
671 }
672 ReturnVoid fromRdfLiteral(QList<_T_>* _value, const QString& _serialised, const DeserialisationContexts& _contexts) const override
673 {
674 return fromJsonString(_value, _serialised, _contexts);
675 }
676 private:
678 };
679 //END MetaTypeDefinition for QList
680
681 namespace Details
682 {
683 template<typename _TFrom_, typename _TTo_>
684 inline _TTo_ qt_convert(const _TFrom_& _from)
685 {
686 _TTo_ to;
687 convert(&_from, &to).expectSuccess();
688 return to;
689 }
690 inline constexpr bool valid(const char* _t)
691 {
692 return _t;
693 }
694 inline constexpr bool valid(const knowCore::Uri&)
695 {
696 return true;
697 }
698#define KNOWCORE_METATYPE_REGISTER(_TYPE_, _FUNC_) \
699 template<typename _T_, bool _has> \
700 class _TYPE_; \
701 template<typename _T_> \
702 struct _TYPE_<_T_, true> \
703 { \
704 static void _FUNC_() \
705 { \
706 QMetaType::_FUNC_<_T_>(); \
707 } \
708 }; \
709 template<typename _T_> \
710 struct _TYPE_<_T_, false> \
711 { \
712 static void _FUNC_() \
713 { \
714 } \
715 };
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_>
722 struct RegisterConverter<_T_, _T2_, true>
723 {
724 static void registerConverter()
725 {
726 QMetaType::registerConverter<_T_, _T2_>(qt_convert<_T_, _T2_>);
727 knowCore::registerConverter<_T_, _T2_>();
728 }
729 };
730 template<typename _T_, typename _T2_>
731 struct RegisterConverter<_T_, _T2_, false>
732 {
733 static void registerConverter()
734 {
735 }
736 };
737 template<typename _T_, bool _is_numeric>
739 template<typename _T_>
740 struct RegisterNumericDataType<_T_, true>
741 {
742 static void registerNumericDataType()
743 {
744 registerNumericType<_T_>();
745 }
746 };
747 template<typename _T_>
748 struct RegisterNumericDataType<_T_, false>
749 {
750 static void registerNumericDataType()
751 {
752 }
753 };
754 inline knowCore::Uri makeUri(std::nullptr_t)
755 {
756 KNOWCORE_LOG_FATAL("no uri defined for type!");
757 }
758 template<typename _T_>
759 knowCore::Uri makeUri(const _T_& _uri)
760 {
761 return knowCore::Uri(_uri);
762 }
763 }
764}
765
766
767#define __KNOWCORE_DEFINE_METATYPE__INTERNAL__(_TYPE_, _URI_, _TRAITS_) \
768 knowCore::MetaTypeInformation<_TYPE_> \
769 knowCore::MetaTypeInformation<_TYPE_>::s_instance; \
770 knowCore::MetaTypeInformation<_TYPE_>::MetaTypeInformation() \
771 { \
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_, \
788 bool((_TRAITS_) & \
789 knowCore::MetaTypeTraits::NumericType)>::registerNumericDataType(); \
790 init_knowCoreMetaType(); \
791 }
792
793#define KNOWCORE_DEFINE_QT_METATYPE(_TYPE_, _TRAITS_) \
794 void knowCore::MetaTypeInformation<_TYPE_>::init_knowCoreMetaType() {} \
795 __KNOWCORE_DEFINE_METATYPE__INTERNAL__(_TYPE_, nullptr, _TRAITS_)
796
800#define KNOWCORE_DEFINE_METATYPE_URI(_TYPE_, _URI_) \
801 knowCore::Uri knowCore::MetaTypeInformation<_TYPE_>::uri() \
802 { \
803 return knowCore::Details::makeUri(_URI_); \
804 } \
805
812#define KNOWCORE_DEFINE_METATYPE(_TYPE_, _URI_, _TRAITS_) \
813 KNOWCORE_DEFINE_METATYPE_URI(_TYPE_, _URI_) \
814 knowCore::AbstractMetaTypeDefinition* knowCore::MetaTypeInformation<_TYPE_>::definition() \
815 { \
816 static knowCore::AbstractMetaTypeDefinition* definition = new knowCore::MetaTypeDefinition<_TYPE_>(); \
817 return definition; \
818 } \
819 void knowCore::MetaTypeInformation<_TYPE_>::init_knowCoreMetaType() \
820 { \
821 registerMetaType<_TYPE_>(); \
822 } \
823 __KNOWCORE_DEFINE_METATYPE__INTERNAL__(_TYPE_, _URI_, _TRAITS_)
824
825
826#define __KNOWCORE_REGISTER_CONVERSION_FROM_ONE(_TYPE_, I) \
827 if constexpr(not std::is_same_v<TypeFrom, _TYPE_>) { \
828 knowCore::registerConverter<TypeFrom, _TYPE_>(); \
829 }
830
831#define __KNOWCORE_REGISTER_CONVERSION_FROM(_FACTORY_NAME_, _TYPE_FROM_, ...) \
832 namespace\
833 {\
834 class _FACTORY_NAME_\
835 {\
836 public:\
837 _FACTORY_NAME_()\
838 {\
839 typedef _TYPE_FROM_ TypeFrom; \
840 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_CONVERSION_FROM_ONE, __VA_ARGS__) \
841 } \
842 static _FACTORY_NAME_ s_instance; \
843 }; \
844 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
845 }
846
855#define KNOWCORE_REGISTER_CONVERSION_FROM(_TYPE_FROM_, ...) \
856 __KNOWCORE_REGISTER_CONVERSION_FROM(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeRegisterConversion), _TYPE_FROM_, __VA_ARGS__)
857
858#define __KNOWCORE_REGISTER_CONVERSION_TO_ONE(_TYPE_, I) \
859 if constexpr(not std::is_same_v<_TYPE_, TypeTo>) { \
860 knowCore::registerConverter<_TYPE_, TypeTo>(); \
861 }
862
863#define __KNOWCORE_REGISTER_CONVERSION_TO(_FACTORY_NAME_, _TYPE_TO_, ...) \
864 namespace \
865 { \
866 class _FACTORY_NAME_ \
867 { \
868 public: \
869 _FACTORY_NAME_() \
870 { \
871 typedef _TYPE_TO_ TypeTo; \
872 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_CONVERSION_TO_ONE, __VA_ARGS__) \
873 } \
874 static _FACTORY_NAME_ s_instance; \
875 }; \
876 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
877 }
878
887#define KNOWCORE_REGISTER_CONVERSION_TO(_TYPE_TO_, ...) \
888 __KNOWCORE_REGISTER_CONVERSION_TO(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeRegisterConversion), _TYPE_TO_, __VA_ARGS__)
889
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_>(); \
894 }
895
896#define __KNOWCORE_REGISTER_COMPARATOR_FROM(_FACTORY_NAME_, _COMPARATOR_, _TYPE_FROM_, ...) \
897 namespace \
898 { \
899 class _FACTORY_NAME_ \
900 { \
901 static constexpr knowCore::ComparisonOperator comparatorOperator = _COMPARATOR_; \
902 public: \
903 _FACTORY_NAME_() \
904 { \
905 typedef _TYPE_FROM_ TypeFrom; \
906 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_COMPARATOR_FROM_ONE, __VA_ARGS__) \
907 } \
908 static _FACTORY_NAME_ s_instance; \
909 }; \
910 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
911 }
912
913// TODO knowL 3.0 make _COMPARATOR_ take a list, i.e. like arithmetic
914#define KNOWCORE_REGISTER_COMPARATOR_FROM(_COMPARATOR_, _TYPE_FROM_, ...) \
915 __KNOWCORE_REGISTER_COMPARATOR_FROM(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeRegisterComparator), _COMPARATOR_, _TYPE_FROM_, __VA_ARGS__)
916
920#define KNOWCORE_REGISTER_COMPARATOR(_COMPARATOR_, _TYPE_) \
921 KNOWCORE_REGISTER_COMPARATOR_FROM(_COMPARATOR_, _TYPE_, _TYPE_)
922
923//BEGIN KNOWCORE_REGISTER_ARITHMETIC_OPERATOR
924
925#define __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_FROM_ONE(_TYPE_, I) \
926 knowCore::registerArithmeticOperators<_LeftType_, _TYPE_, _operators_...>();
927
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__)
932
933
934#define __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR(_FACTORY_NAME_, _OPERATORS_, _LEFT_, ...) \
935 namespace \
936 { \
937 class _FACTORY_NAME_ \
938 { \
939 public: \
940 _FACTORY_NAME_() \
941 { \
942 registerArithmeticOperators<_LEFT_ __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_MAKE_OPERATORS _OPERATORS_>(); \
943 } \
944 static _FACTORY_NAME_ s_instance; \
945 private: \
946 template<typename _LeftType_, ArithmeticOperator... _operators_> \
947 void registerArithmeticOperators() \
948 { \
949 KNOWCORE_FOREACH(__KNOWCORE_REGISTER_ARITHMETIC_OPERATOR_FROM_ONE, __VA_ARGS__) \
950 } \
951 }; \
952 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
953 }
954
955#define KNOWCORE_REGISTER_ARITHMETIC_OPERATORS(_OPERATORS_, _LEFT_TYPE_, ...) \
956 __KNOWCORE_REGISTER_ARITHMETIC_OPERATOR(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeRegisterArithmeticOperator), _OPERATORS_, _LEFT_TYPE_, __VA_ARGS__)
957
958//END KNOWCORE_REGISTER_ARITHMETIC_OPERATOR
959
960#define KNOWCORE_DEFINE_METATYPE_START_IMPLEMENTATION_TEMPLATE(_TYPE_, _ENABLE_) \
961 class knowCore::MetaTypeDefinition<_TYPE_, _ENABLE_> : \
962 public knowCore::MetaTypeDefinitionImplementation<_TYPE_> \
963 { \
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; \
971 protected:
972
973#define KNOWCORE_DEFINE_METATYPE_FINISH_IMPLEMENTATION(_TYPE_) \
974 };
975
976#define KNOWCORE_DEFINE_METATYPE_START_IMPLEMENTATION(_TYPE_) \
977 template<> \
978 KNOWCORE_DEFINE_METATYPE_START_IMPLEMENTATION_TEMPLATE(_TYPE_, void)
979
980#define KNOWCORE_DEFINE_METATYPE_IMPLEMENTATION_ALIAS(_TYPE_1_, _TYPE_2_) \
981 template<> \
982 class knowCore::MetaTypeDefinition<_TYPE_1_> : \
983 public knowCore::MetaTypeDefinition<_TYPE_2_> \
984 { \
985 protected: \
986 knowCore::Uri uri() const override \
987 { \
988 return MetaTypeInformation<_TYPE_1_>::uri(); \
989 } \
990 int qMetaTypeId() const override \
991 { \
992 return MetaTypeInformation<_TYPE_1_>::id(); \
993 } \
994 };
995
996#define __KNOWCORE_URIFY(_URI_, I) knowCore::Details::makeUri(_URI_),
997
998#define __KNOWCORE_URIFY_LIST(...) KNOWCORE_FOREACH(__KNOWCORE_URIFY, __VA_ARGS__)
999
1000#define __KNOWCORE_DEFINE_METATYPE_ALIASES__INTERNAL__(_FACTORY_NAME_, ...) \
1001 namespace \
1002 { \
1003 class _FACTORY_NAME_ \
1004 { \
1005 public: \
1006 _FACTORY_NAME_() \
1007 { \
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); \
1012 } \
1013 static _FACTORY_NAME_ s_instance; \
1014 }; \
1015 _FACTORY_NAME_ _FACTORY_NAME_::s_instance; \
1016 }
1017
1027#define KNOWCORE_DEFINE_METATYPE_ALIASES(...) \
1028 __KNOWCORE_DEFINE_METATYPE_ALIASES__INTERNAL__(__KNOWCORE_UNIQUE_STATIC_NAME(MetaTypeAlias), __VA_ARGS__)
1029
Definition Forward.h:12
Definition MetaType.h:253
Definition MetaType.h:184
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 MetaTypeImplementation.h:405
ReturnValue< QString > printable(const void *_value) const override
Definition MetaTypeImplementation.h:530
ReturnValue< QByteArray > md5(const void *_value) const override
Definition MetaTypeImplementation.h:510
ReturnValue< QJsonValue > toJsonValue(const void *_value, const SerialisationContexts &_contexts) const override
Definition MetaTypeImplementation.h:514
ReturnValue< QCborValue > toCborValue(const void *_value, const SerialisationContexts &_contexts) const override
Definition MetaTypeImplementation.h:522
int qMetaTypeId() const override
Definition MetaTypeImplementation.h:439
ReturnVoid fromRdfLiteral(void *_value, const QString &_serialised, const DeserialisationContexts &_contexts) const override
Definition MetaTypeImplementation.h:538
ReturnVoid fromJsonValue(void *_value, const QJsonValue &_json_value, const DeserialisationContexts &_contexts) const override
Definition MetaTypeImplementation.h:518
ReturnVoid fromCborValue(void *_value, const QCborValue &_cbor_value, const DeserialisationContexts &_contexts) const override
Definition MetaTypeImplementation.h:526
ReturnValue< QString > toRdfLiteral(const void *_value, const SerialisationContexts &_contexts) const override
Definition MetaTypeImplementation.h:534
Definition MetaType.h:314
Definition MetaType.h:58
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
Definition Uri.h:14
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: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