kDB: Knowledge DataBase
Loading...
Searching...
No Matches
MetaType.h
1#pragma once
2
3#include <clog_qt>
4#include <cres_qt>
5
6#include <QCborValue>
7#include <QJsonValue>
8
9#include "Formatter.h"
10#include "Uri.h"
11#include <clog_qt>
12
13namespace knowCore
14{
16 {
17 enum
18 {
19 None = 0,
20 Comparable = 1 << 1,
22 ToString = 1 << 3,
23 FromString = 1 << 4,
24 ToByteArray = 1 << 5,
25 FromByteArray = 1 << 6,
26 ToValueList = 1 << 7,
27 FromValueList = 1 << 8,
28 DebugStreamOperator = 1 << 9,
29 NumericType = 1 << 10
30 };
31 };
32
33 enum class ComparisonOperator
34 {
35 Equal = 1 << 1,
36 AlmostEqual = 1 << 2,
37 Inferior = 1 << 3,
38 GeoOverlaps = 1 << 4,
39 GeoWithin = 1 << 5,
40 GeoIntersects = 1 << 6,
41 GeoContains = 1 << 7,
42 GeoTouches = 1 << 8,
43 In = 1 << 9,
44 };
45 enum class ArithmeticOperator
46 {
47 Addition,
48 Substraction,
49 Division,
50 Multiplication
51 };
52 Q_DECLARE_FLAGS(ComparisonOperators, ComparisonOperator)
53 enum class TypeCheckingMode
54 {
55 Safe,
56 Force
57 };
58
65 template<typename _T_>
67 class MetaTypeRegistry;
68 class Value;
69 template<typename _T_>
70 class HasMetaTypeInformation : public std::false_type
71 {
72 };
73 template<typename _T_>
74 inline constexpr bool HasMetaTypeInformationV = HasMetaTypeInformation<_T_>::value;
75
77 {
78 public:
79 static Uri uri(int _type);
80 static int type(const Uri& _uri);
81 static bool isNumericType(const Uri& _uri);
86 static bool isDefined(const Uri& _uri);
90 static bool canConvert(const Uri& _from, const Uri& _to,
91 TypeCheckingMode _checking = TypeCheckingMode::Safe);
95 static QList<Uri> aliases(const knowCore::Uri& _uri);
96 };
97
107
117
126 {
127 public:
130 DeserialisationContexts& operator=(const DeserialisationContexts& _rhs);
135 cres_qresult<AbstractDeserialisationContext*> getContext(const knowCore::Uri& _uri) const;
139 template<typename _T_>
140 cres_qresult<_T_*> getContext(const knowCore::Uri& _uri) const;
145 void addContext(const knowCore::Uri& _uri, AbstractDeserialisationContext* _context);
146 private:
147 struct Private;
148 QExplicitlySharedDataPointer<Private> d;
149 };
150
159 {
160 public:
163 SerialisationContexts& operator=(const SerialisationContexts& _rhs);
168 cres_qresult<AbstractSerialisationContext*> getContext(const knowCore::Uri& _uri) const;
172 template<typename _T_>
173 cres_qresult<_T_*> getContext(const knowCore::Uri& _uri) const;
178 void addContext(const knowCore::Uri& _uri, AbstractSerialisationContext* _context);
179 private:
180 struct Private;
181 QExplicitlySharedDataPointer<Private> d;
182 };
183
184 inline static const DeserialisationContexts& defaultDeserialisationContext()
185 {
186 static DeserialisationContexts contexts;
187 return contexts;
188 }
189 inline static const SerialisationContexts& defaultSerialisationContext()
190 {
191 static SerialisationContexts contexts;
192 return contexts;
193 }
194
200 {
201 friend class MetaTypeRegistry;
202 friend class MetaTypes;
203 friend class Value;
204 template<typename>
205 friend class MetaTypeInformation;
206 protected:
208 virtual knowCore::Uri uri() const = 0;
212 virtual int qMetaTypeId() const = 0;
213 virtual void* allocate() const = 0;
214 virtual void* duplicate(const void*) const = 0;
215 virtual void release(void* _value) const = 0;
216 virtual bool compareEquals(const void* _lhs, const void* _rhs) const = 0;
220 virtual cres_qresult<QByteArray> md5(const void* _value) const = 0;
224 virtual cres_qresult<QJsonValue> toJsonValue(const void* _value,
225 const SerialisationContexts& _contexts) const
226 = 0;
230 virtual cres_qresult<void> fromJsonValue(void* _value, const QJsonValue& _json_value,
231 const DeserialisationContexts& _contexts) const
232 = 0;
236 virtual cres_qresult<QCborValue> toCborValue(const void* _value,
237 const SerialisationContexts& _contexts) const
238 = 0;
242 virtual cres_qresult<void> fromCborValue(void* _value, const QCborValue& _cbor_value,
243 const DeserialisationContexts& _contexts) const
244 = 0;
248 virtual cres_qresult<QString> printable(const void* _value) const = 0;
252 virtual cres_qresult<QString> toRdfLiteral(const void* _value,
253 const SerialisationContexts& _contexts) const
254 = 0;
258 virtual cres_qresult<void> fromRdfLiteral(void* _value, const QString& _serialised,
259 const DeserialisationContexts& _contexts) const
260 = 0;
261 };
262
264 {
265 public:
266 virtual ~AbstractTypeConversion();
267 virtual knowCore::Uri from() const = 0;
268 virtual knowCore::Uri to() const = 0;
269 virtual cres_qresult<void> convert(const void* _from, void* _to) const = 0;
270 };
272 {
273 public:
274 virtual ~AbstractTypeComparator();
275 virtual ComparisonOperator comparisonOperator() const = 0;
276 virtual knowCore::Uri left() const = 0;
277 virtual knowCore::Uri right() const = 0;
278 virtual cres_qresult<bool> compare(const void* _left, const void* _right) const = 0;
279 };
281 {
282 public:
283 virtual ~AbstractArithmeticOperator() = 0;
284 virtual ArithmeticOperator arithmeticOperator() const = 0;
285 virtual knowCore::Uri left() const = 0;
286 virtual knowCore::Uri right() const = 0;
287 virtual cres_qresult<knowCore::Value> compute(const void* _left, const void* _right) const = 0;
288 };
289
291
292 template<typename _T_>
293 void registerMetaType();
294
295 void registerMetaTypeAliases(const QList<Uri>& _aliases, const Uri& _to);
296
297 template<typename _TFrom_, typename _TTo_>
298 void
299 registerConverter(TypeCheckingMode _conversionMode,
300 const std::function<cres_qresult<void>(const _TFrom_*, _TTo_*)>& _converter);
301 template<typename _TFrom_, typename _TTo_>
302 void registerConverter();
303 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_>
304 void registerComparator(
305 const std::function<cres_qresult<bool>(const _TLeft_&, const _TRight_&)>& _comparator);
306 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_>
307 void registerComparator();
308 template<ArithmeticOperator _operator_, typename _TLeft_, typename _TRight_>
309 void registerArithmeticOperator();
310
311 template<typename _T_>
312 void registerNumericType();
313
314 namespace Details
315 {
316 template<typename _T_, bool _has_converter_>
317 struct RegisterFromListConverter;
318 template<typename _T_, bool _has_converter_>
319 struct RegisterToListConverter;
320 } // namespace Details
321
323 {
324 template<typename _T_>
325 friend class MetaTypeInformation;
326 template<typename _T_>
327 friend void registerMetaType();
328 template<typename _TTo_, typename _TFrom_>
329 friend void registerConverter(TypeCheckingMode _mode,
330 const std::function<_TTo_(const _TFrom_&)>& _converter);
331 template<typename _TFrom_, typename _TTo_>
332 friend void registerConverter();
333 template<typename _T_, bool _has_converter_>
335 template<typename _T_, bool _has_converter_>
337 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_>
338 friend void registerComparator(
339 const std::function<cres_qresult<bool>(const _TLeft_&, const _TRight_&)>& _comparator);
340 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_>
341 void friend registerComparator();
342 friend void registerMetaTypeAliases(const QList<Uri>& _aliases, const Uri& _to);
343 template<typename _T_>
344 friend void registerNumericType();
345 template<ArithmeticOperator _operator_, typename _TLeft_, typename _TRight_>
346 friend void registerArithmeticOperator();
347 private:
348 static void registerType(AbstractMetaTypeDefinition* _definition);
349 static void registerConverter(TypeCheckingMode _conversionMode,
350 AbstractTypeConversion* _conversion);
351 static void registerComparator(AbstractTypeComparator* _conversion);
352 static void registerArithmeticOperator(AbstractArithmeticOperator* _operator);
353 static bool canConvert(const knowCore::Uri& _from, const knowCore::Uri& _to,
354 TypeCheckingMode _conversion = TypeCheckingMode::Safe);
355 static void registerMetaTypeAliases(const QList<Uri>& _aliases, const Uri& _to);
356 static void registerNumericType(const knowCore::Uri& _uri);
357 static void registerToVariant(const knowCore::Uri& _uri, AbstractToVariantMarshal* _marshal);
358 };
359
360 template<typename _T_, class _Enabled_>
362
363} // namespace knowCore
364
365#define __KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(__TYPE__, __DEFINITION__) \
366 namespace knowCore \
367 { \
368 template<> \
369 class HasMetaTypeInformation<__TYPE__> : public std::true_type \
370 { \
371 }; \
372 template<> \
373 class MetaTypeInformation<__TYPE__> \
374 { \
375 public: \
376 MetaTypeInformation(); \
377 static knowCore::Uri uri(); \
378 __DEFINITION__ \
379 static QList<knowCore::Uri> aliases() { return knowCore::MetaTypes::aliases(uri()); } \
380 static bool isNumericType() { return MetaTypes::isNumericType(uri()); } \
381 template<typename _TOther_> \
382 static bool canConvertTo() \
383 { \
384 return knowCore::MetaTypeRegistry::canConvert(uri(), \
385 MetaTypeInformation<_TOther_>::uri()); \
386 } \
387 template<typename _TOther_> \
388 static bool canConvertFrom() \
389 { \
390 return knowCore::MetaTypeRegistry::canConvert(MetaTypeInformation<_TOther_>::uri(), \
391 uri()); \
392 } \
393 inline static int id() { return s_instance.m_id; } \
394 private: \
395 void init_knowCoreMetaType(); \
396 int m_id; \
397 static MetaTypeInformation<__TYPE__> s_instance; \
398 }; \
399 }
400
401#define __KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS_DEFINITION(__TYPE__) \
402 static AbstractMetaTypeDefinition* definition(); \
403 inline static cres_qresult<QByteArray> md5(const __TYPE__& _value) \
404 { \
405 return definition()->md5(&_value); \
406 } \
407 inline static cres_qresult<QJsonValue> toJsonValue(const __TYPE__& _value, \
408 const SerialisationContexts& _contexts \
409 = defaultSerialisationContext()) \
410 { \
411 return definition()->toJsonValue(&_value, _contexts); \
412 } \
413 inline static cres_qresult<__TYPE__> fromJsonValue(const QJsonValue& _json_value, \
414 const DeserialisationContexts& _contexts \
415 = defaultDeserialisationContext()) \
416 { \
417 __TYPE__ r; \
418 cres_try(cres_ignore, definition()->fromJsonValue(&r, _json_value, _contexts)); \
419 return cres_success(r); \
420 } \
421 inline static cres_qresult<QCborValue> toCborValue(const __TYPE__& _value, \
422 const SerialisationContexts& _contexts \
423 = defaultSerialisationContext()) \
424 { \
425 return definition()->toCborValue(&_value, _contexts); \
426 } \
427 inline static cres_qresult<__TYPE__> fromCborValue(const QCborValue& _cbor_value, \
428 const DeserialisationContexts& _contexts \
429 = defaultDeserialisationContext()) \
430 { \
431 __TYPE__ r; \
432 cres_try(cres_ignore, definition()->fromCborValue(&r, _cbor_value, _contexts)); \
433 return cres_success(r); \
434 } \
435 inline static cres_qresult<QString> printable(const __TYPE__& _value) \
436 { \
437 return definition()->printable(&_value); \
438 } \
439 inline static cres_qresult<QString> toRdfLiteral(const __TYPE__& _value, \
440 const SerialisationContexts& _contexts \
441 = defaultSerialisationContext()) \
442 { \
443 return definition()->toRdfLiteral(&_value, _contexts); \
444 } \
445 inline static cres_qresult<__TYPE__> fromRdfLiteral(const QString& _serialised, \
446 const DeserialisationContexts& _contexts \
447 = defaultDeserialisationContext()) \
448 { \
449 __TYPE__ r; \
450 cres_try(cres_ignore, definition()->fromRdfLiteral(&r, _serialised, _contexts)); \
451 return cres_success(r); \
452 }
453
454#define KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(__TYPE__) \
455 __KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS( \
456 __TYPE__, __KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS_DEFINITION(__TYPE__))
457
458#define KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS_NO_DEFINITION(__TYPE__) \
459 __KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(__TYPE__, )
460
461#define KNOWCORE_DECLARE_KNOWCORE_METATYPE_NO_DEFINITION(_NS_, _TYPE_) \
462 KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS_NO_DEFINITION(_NS_::_TYPE_) \
463 namespace _NS_ \
464 { \
465 using _TYPE_##MetaTypeInformation = knowCore::MetaTypeInformation<_TYPE_>; \
466 }
467
468#define KNOWCORE_DECLARE_KNOWCORE_METATYPE(_NS_, _TYPE_) \
469 KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(_NS_::_TYPE_) \
470 namespace _NS_ \
471 { \
472 using _TYPE_##MetaTypeInformation = knowCore::MetaTypeInformation<_TYPE_>; \
473 }
474
475#define KNOWCORE_DECLARE_FULL_METATYPE(_NS_, _TYPE_) \
476 Q_DECLARE_METATYPE(_NS_::_TYPE_) \
477 KNOWCORE_DECLARE_KNOWCORE_METATYPE(_NS_, _TYPE_)
478
479#define KNOWCORE_DECLARE_FULL_METATYPE_NO_DEFINITION(_NS_, _TYPE_) \
480 Q_DECLARE_METATYPE(_NS_::_TYPE_) \
481 KNOWCORE_DECLARE_KNOWCORE_METATYPE_NO_DEFINITION(_NS_, _TYPE_)
482
483KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(QString)
484KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(QStringList)
485KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(QByteArray)
486KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(QList<QByteArray>)
487KNOWCORE_DECLARE_KNOWCORE_METATYPE(knowCore,
488 Uri) // <- this has to be here and not Uri.h, because of circular
489 // dependenct between Uri.h and MetaType.h
490clog_format_declare_enum_formatter(knowCore::ComparisonOperator, AlmostEqual, Equal, Inferior,
491 GeoOverlaps, GeoIntersects, GeoWithin, GeoContains, GeoTouches,
492 In);
493clog_format_declare_enum_formatter(knowCore::ArithmeticOperator, Addition, Substraction,
494 Multiplication, Division);
Definition Revision.h:9
Definition MetaType.h:281
Definition MetaType.h:200
virtual int qMetaTypeId() const =0
virtual cres_qresult< QByteArray > md5(const void *_value) const =0
virtual cres_qresult< QJsonValue > toJsonValue(const void *_value, const SerialisationContexts &_contexts) const =0
virtual cres_qresult< void > fromJsonValue(void *_value, const QJsonValue &_json_value, const DeserialisationContexts &_contexts) const =0
virtual cres_qresult< QString > toRdfLiteral(const void *_value, const SerialisationContexts &_contexts) const =0
virtual cres_qresult< QString > printable(const void *_value) const =0
virtual cres_qresult< void > fromRdfLiteral(void *_value, const QString &_serialised, const DeserialisationContexts &_contexts) const =0
virtual cres_qresult< void > fromCborValue(void *_value, const QCborValue &_cbor_value, const DeserialisationContexts &_contexts) const =0
virtual cres_qresult< QCborValue > toCborValue(const void *_value, const SerialisationContexts &_contexts) const =0
Definition MetaTypeImplementation.h:380
Definition MetaType.h:272
Definition MetaType.h:264
Definition MetaType.h:126
void addContext(const knowCore::Uri &_uri, AbstractDeserialisationContext *_context)
Definition MetaType.cpp:86
cres_qresult< AbstractDeserialisationContext * > getContext(const knowCore::Uri &_uri) const
Definition MetaType.cpp:74
Definition MetaType.h:71
Definition MetaType.h:361
Definition MetaType.h:66
Definition MetaType.h:323
Definition MetaType.h:77
static bool isDefined(const Uri &_uri)
Definition MetaType.cpp:23
static QList< Uri > aliases(const knowCore::Uri &_uri)
Definition MetaType.cpp:33
static bool canConvert(const Uri &_from, const Uri &_to, TypeCheckingMode _checking=TypeCheckingMode::Safe)
Definition MetaType.cpp:28
Definition MetaType.h:159
cres_qresult< AbstractSerialisationContext * > getContext(const knowCore::Uri &_uri) const
Definition MetaType.cpp:111
void addContext(const knowCore::Uri &_uri, AbstractSerialisationContext *_context)
Definition MetaType.cpp:123
Definition Uri.h:15
Definition Value.h:21
Definition MetaTypeImplementation.h:844
Definition MetaTypeImplementation.h:860
Definition MetaType.h:16
@ NumericType
indicates that the type is for a numeric value
Definition MetaType.h:29
@ Comparable
Has < and == operator.
Definition MetaType.h:20
@ OnlyEqualComparable
Has == operator.
Definition MetaType.h:21