knowL: Knowledge Libraries
Loading...
Searching...
No Matches
MetaType.h
1#pragma once
2
3#include <QCborValue>
4#include <QJsonValue>
5
6#include "Formatter.h"
7#include "Logging.h"
8#include "Uri.h"
9#include "ReturnValue.h"
10
11namespace knowCore
12{
14 {
15 enum {
16 None = 0,
17 Comparable = 1 << 1,
19 ToString = 1 << 3,
20 FromString = 1 << 4,
21 ToByteArray = 1 << 5,
22 FromByteArray = 1 << 6,
23 DebugStreamOperator = 1 << 7,
24 NumericType = 1 << 8
25 };
26 };
27
28 enum class ComparisonOperator
29 {
30 Equal = 1 << 1,
31 AlmostEqual = 1 << 2,
32 Inferior = 1 << 3,
33 GeoOverlaps = 1 << 4,
34 GeoWithin = 1 << 5,
35 GeoIntersects = 1 << 6,
36 GeoContains = 1 << 7,
37 GeoTouches = 1 << 8,
38 In = 1 << 9,
39 };
40 enum class ArithmeticOperator
41 {
42 Addition, Substraction, Division, Multiplication
43 };
44 Q_DECLARE_FLAGS(ComparisonOperators, ComparisonOperator)
45 enum class TypeCheckingMode
46 {
47 Safe,
48 Force
49 };
50
57 template<typename _T_>
59 class MetaTypeRegistry;
60 class Value;
61 template<typename _T_>
62 class HasMetaTypeInformation : public std::false_type {};
63 template<typename _T_>
64 inline constexpr bool HasMetaTypeInformationV = HasMetaTypeInformation<_T_>::value;
65
67 {
68 public:
69 static Uri uri(int _type);
70 static int type(const Uri& _uri);
71 static bool isNumericType(const Uri& _uri);
76 static bool isDefined(const Uri& _uri);
80 static bool canConvert(const Uri& _from, const Uri& _to, TypeCheckingMode _checking = TypeCheckingMode::Safe);
84 static QList<Uri> aliases(const knowCore::Uri& _uri);
85 };
86
96
106
114 {
115 public:
118 DeserialisationContexts& operator=(const DeserialisationContexts& _rhs);
127 template<typename _T_>
132 void addContext(const knowCore::Uri& _uri, AbstractDeserialisationContext* _context);
133 private:
134 struct Private;
135 QExplicitlySharedDataPointer<Private> d;
136 };
137
145 {
146 public:
149 SerialisationContexts& operator=(const SerialisationContexts& _rhs);
158 template<typename _T_>
163 void addContext(const knowCore::Uri& _uri, AbstractSerialisationContext* _context);
164 private:
165 struct Private;
166 QExplicitlySharedDataPointer<Private> d;
167 };
168
169 inline static const DeserialisationContexts& defaultDeserialisationContext()
170 {
171 static DeserialisationContexts contexts;
172 return contexts;
173 }
174 inline static const SerialisationContexts& defaultSerialisationContext()
175 {
176 static SerialisationContexts contexts;
177 return contexts;
178 }
179
184 {
185 friend class MetaTypeRegistry;
186 friend class MetaTypes;
187 friend class Value;
188 template<typename>
189 friend class MetaTypeInformation;
190 protected:
192 virtual knowCore::Uri uri() const = 0;
196 virtual int qMetaTypeId() const = 0;
197 virtual void* allocate() const = 0;
198 virtual void* duplicate(const void*) const = 0;
199 virtual void release(void* _value) const = 0;
200 virtual bool compareEquals(const void* _lhs, const void* _rhs) const = 0;
204 virtual ReturnValue<QByteArray> md5(const void* _value) const = 0;
208 virtual ReturnValue<QJsonValue> toJsonValue(const void* _value, const SerialisationContexts& _contexts) const = 0;
212 virtual ReturnVoid fromJsonValue(void* _value, const QJsonValue& _json_value, const DeserialisationContexts& _contexts) const = 0;
216 virtual ReturnValue<QCborValue> toCborValue(const void* _value, const SerialisationContexts& _contexts) const = 0;
220 virtual ReturnVoid fromCborValue(void* _value, const QCborValue& _cbor_value, const DeserialisationContexts& _contexts) const = 0;
224 virtual ReturnValue<QString> printable(const void* _value) const = 0;
228 virtual ReturnValue<QString> toRdfLiteral(const void* _value, const SerialisationContexts& _contexts) const = 0;
232 virtual ReturnVoid fromRdfLiteral(void* _value, const QString& _serialised, const DeserialisationContexts& _contexts) const = 0;
233 };
234
236 {
237 public:
238 virtual ~AbstractTypeConversion();
239 virtual knowCore::Uri from() const = 0;
240 virtual knowCore::Uri to() const = 0;
241 virtual ReturnVoid convert(const void* _from, void* _to) const = 0;
242 };
244 {
245 public:
246 virtual ~AbstractTypeComparator();
247 virtual ComparisonOperator comparisonOperator() const = 0;
248 virtual knowCore::Uri left() const = 0;
249 virtual knowCore::Uri right() const = 0;
250 virtual ReturnValue<bool> compare(const void* _left, const void* _right) const = 0;
251 };
253 {
254 public:
255 virtual ~AbstractArithmeticOperator() = 0;
256 virtual ArithmeticOperator arithmeticOperator() const = 0;
257 virtual knowCore::Uri left() const = 0;
258 virtual knowCore::Uri right() const = 0;
259 virtual ReturnValue<knowCore::Value> compute(const void* _left, const void* _right) const = 0;
260 };
261
263
264 template<typename _T_>
265 void registerMetaType();
266
267 void registerMetaTypeAliases(const QList<Uri>& _aliases, const Uri& _to);
268
269 template<typename _TFrom_, typename _TTo_>
270 void registerConverter(TypeCheckingMode _conversionMode, const std::function<ReturnVoid(const _TFrom_*, _TTo_*)>& _converter);
271 template<typename _TFrom_, typename _TTo_>
272 void registerConverter();
273 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_>
274 void registerComparator(const std::function<ReturnValue<bool>(const _TLeft_&, const _TRight_&)>& _comparator);
275 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_>
276 void registerComparator();
277 template<ArithmeticOperator _operator_, typename _TLeft_, typename _TRight_>
278 void registerArithmeticOperator();
279
280 template<typename _T_>
281 void registerNumericType();
282
284 {
285 template<typename _T_>
286 friend class MetaTypeInformation;
287 template<typename _T_>
288 friend void registerMetaType();
289 template<typename _TTo_, typename _TFrom_>
290 friend void registerConverter(TypeCheckingMode _mode, const std::function<_TTo_(const _TFrom_&)>& _converter);
291 template<typename _TFrom_, typename _TTo_>
292 friend void registerConverter();
293 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_>
294 friend void registerComparator(const std::function<ReturnValue<bool>(const _TLeft_&, const _TRight_&)>& _comparator);
295 template<ComparisonOperator _operator_, typename _TLeft_, typename _TRight_>
296 void friend registerComparator();
297 friend void registerMetaTypeAliases(const QList<Uri>& _aliases, const Uri& _to);
298 template<typename _T_>
299 friend void registerNumericType();
300 template<ArithmeticOperator _operator_, typename _TLeft_, typename _TRight_>
301 friend void registerArithmeticOperator();
302 private:
303 static void registerType(AbstractMetaTypeDefinition* _definition);
304 static void registerConverter(TypeCheckingMode _conversionMode, AbstractTypeConversion* _conversion);
305 static void registerComparator(AbstractTypeComparator* _conversion);
306 static void registerArithmeticOperator(AbstractArithmeticOperator* _operator);
307 static bool canConvert(const knowCore::Uri& _from, const knowCore::Uri& _to, TypeCheckingMode _conversion = TypeCheckingMode::Safe);
308 static void registerMetaTypeAliases(const QList<Uri>& _aliases, const Uri& _to);
309 static void registerNumericType(const knowCore::Uri& _uri);
310 static void registerToVariant(const knowCore::Uri& _uri, AbstractToVariantMarshal* _marshal);
311 };
312
313 template<typename _T_, class _Enabled_>
315
316
317}
318
319#define __KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(__TYPE__, __DEFINITION__) \
320 namespace knowCore \
321 { \
322 template<> \
323 class HasMetaTypeInformation<__TYPE__> : public std::true_type {}; \
324 template<> \
325 class MetaTypeInformation<__TYPE__> { \
326 public: \
327 MetaTypeInformation(); \
328 static knowCore::Uri uri(); \
329 __DEFINITION__ \
330 static QList<knowCore::Uri> aliases() \
331 { \
332 return knowCore::MetaTypes::aliases(uri()); \
333 } \
334 static bool isNumericType() \
335 { \
336 return MetaTypes::isNumericType(uri()); \
337 } \
338 template<typename _TOther_> \
339 static bool canConvertTo() \
340 { \
341 return knowCore::MetaTypeRegistry::canConvert(uri(), \
342 MetaTypeInformation<_TOther_>::uri()); \
343 } \
344 template<typename _TOther_> \
345 static bool canConvertFrom() \
346 { \
347 return knowCore::MetaTypeRegistry::canConvert( \
348 MetaTypeInformation<_TOther_>::uri(), \
349 uri()); \
350 } \
351 inline static int id() { return s_instance.m_id; } \
352 private: \
353 void init_knowCoreMetaType(); \
354 int m_id; \
355 static MetaTypeInformation<__TYPE__> s_instance; \
356 }; \
357 }
358
359#define __KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS_DEFINITION(__TYPE__) \
360 static AbstractMetaTypeDefinition* definition(); \
361 inline static ReturnValue<QByteArray> md5(const __TYPE__& _value) \
362 { return definition()->md5(&_value); } \
363 inline static ReturnValue<QJsonValue> toJsonValue(const __TYPE__& _value, const SerialisationContexts& _contexts = defaultSerialisationContext()) \
364 { return definition()->toJsonValue(&_value, _contexts); } \
365 inline static ReturnValue<__TYPE__> fromJsonValue(const QJsonValue& _json_value, const DeserialisationContexts& _contexts = defaultDeserialisationContext()) \
366 { \
367 __TYPE__ r; \
368 KNOWCORE_RETURN_VALUE_TRY_VOID(definition()->fromJsonValue(&r, _json_value, _contexts)); \
369 return kCrvSuccess(r); \
370 } \
371 inline static ReturnValue<QCborValue> toCborValue(const __TYPE__& _value, const SerialisationContexts& _contexts = defaultSerialisationContext()) \
372 { return definition()->toCborValue(&_value, _contexts); } \
373 inline static ReturnValue<__TYPE__> fromCborValue(const QCborValue& _cbor_value, const DeserialisationContexts& _contexts = defaultDeserialisationContext()) \
374 { \
375 __TYPE__ r; \
376 KNOWCORE_RETURN_VALUE_TRY_VOID(definition()->fromCborValue(&r, _cbor_value, _contexts)); \
377 return kCrvSuccess(r); \
378 } \
379 inline static ReturnValue<QString> printable(const __TYPE__& _value) \
380 { return definition()->printable(&_value); } \
381 inline static ReturnValue<QString> toRdfLiteral(const __TYPE__& _value, const SerialisationContexts& _contexts = defaultSerialisationContext()) \
382 { return definition()->toRdfLiteral(&_value, _contexts); } \
383 inline static ReturnValue<__TYPE__> fromRdfLiteral(const QString& _serialised, const DeserialisationContexts& _contexts = defaultDeserialisationContext()) \
384 { \
385 __TYPE__ r; \
386 KNOWCORE_RETURN_VALUE_TRY_VOID(definition()->fromRdfLiteral(&r, _serialised, _contexts)); \
387 return kCrvSuccess(r); \
388 }
389
390#define KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(__TYPE__) \
391 __KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(__TYPE__, __KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS_DEFINITION(__TYPE__))
392
393#define KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS_NO_DEFINITION(__TYPE__) \
394 __KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(__TYPE__, )
395
396#define KNOWCORE_DECLARE_KNOWCORE_METATYPE_NO_DEFINITION(_NS_, _TYPE_) \
397 KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS_NO_DEFINITION(_NS_::_TYPE_) \
398 namespace _NS_ \
399 { \
400 using _TYPE_ ## MetaTypeInformation = knowCore::MetaTypeInformation<_TYPE_>; \
401 }
402
403#define KNOWCORE_DECLARE_KNOWCORE_METATYPE(_NS_, _TYPE_) \
404 KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(_NS_::_TYPE_) \
405 namespace _NS_ \
406 { \
407 using _TYPE_ ## MetaTypeInformation = knowCore::MetaTypeInformation<_TYPE_>; \
408 }
409
410#define KNOWCORE_DECLARE_FULL_METATYPE(_NS_, _TYPE_) \
411 Q_DECLARE_METATYPE(_NS_::_TYPE_) \
412 KNOWCORE_DECLARE_KNOWCORE_METATYPE(_NS_, _TYPE_)
413
414#define KNOWCORE_DECLARE_FULL_METATYPE_NO_DEFINITION(_NS_, _TYPE_) \
415 Q_DECLARE_METATYPE(_NS_::_TYPE_) \
416 KNOWCORE_DECLARE_KNOWCORE_METATYPE_NO_DEFINITION(_NS_, _TYPE_)
417
418KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(QString)
419KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(QStringList)
420KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(QByteArray)
421KNOWCORE_DECLARE_KNOWCORE_METATYPE_KLASS(QList<QByteArray>)
422KNOWCORE_DECLARE_KNOWCORE_METATYPE(knowCore, Uri) // <- this has to be here and not Uri.h, because of circular dependenct between Uri.h and MetaType.h
423KNOWCORE_CORE_DECLARE_FORMATTER_ENUM(knowCore::ComparisonOperator, Equal, Inferior, GeoOverlaps, GeoIntersects, GeoWithin, GeoContains, GeoTouches, In)
424KNOWCORE_CORE_DECLARE_FORMATTER_ENUM(knowCore::ArithmeticOperator, Addition, Substraction, Multiplication, Division)
Definition Forward.h:12
Definition MetaType.h:253
Definition MetaType.h:184
virtual ReturnValue< QString > printable(const void *_value) const =0
virtual int qMetaTypeId() const =0
virtual ReturnValue< QCborValue > toCborValue(const void *_value, const SerialisationContexts &_contexts) const =0
virtual ReturnValue< QByteArray > md5(const void *_value) const =0
virtual ReturnVoid fromRdfLiteral(void *_value, const QString &_serialised, const DeserialisationContexts &_contexts) const =0
virtual ReturnVoid fromCborValue(void *_value, const QCborValue &_cbor_value, const DeserialisationContexts &_contexts) const =0
virtual ReturnValue< QJsonValue > toJsonValue(const void *_value, const SerialisationContexts &_contexts) const =0
virtual ReturnVoid fromJsonValue(void *_value, const QJsonValue &_json_value, const DeserialisationContexts &_contexts) const =0
virtual ReturnValue< QString > toRdfLiteral(const void *_value, const SerialisationContexts &_contexts) const =0
Definition MetaTypeImplementation.h:271
Definition MetaType.h:244
Definition MetaType.h:236
Definition MetaType.h:114
void addContext(const knowCore::Uri &_uri, AbstractDeserialisationContext *_context)
Definition MetaType.cpp:100
knowCore::ReturnValue< AbstractDeserialisationContext * > getContext(const knowCore::Uri &_uri) const
Definition MetaType.cpp:90
Definition MetaType.h:62
Definition MetaType.h:314
Definition MetaType.h:58
Definition MetaType.h:284
Definition MetaType.h:67
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 ReturnValue.h:85
Definition ReturnValue.h:29
Definition MetaType.h:145
knowCore::ReturnValue< AbstractSerialisationContext * > getContext(const knowCore::Uri &_uri) const
Definition MetaType.cpp:132
void addContext(const knowCore::Uri &_uri, AbstractSerialisationContext *_context)
Definition MetaType.cpp:142
Definition Uri.h:14
Definition Value.h:13
Definition MetaType.cpp:106
Definition MetaType.h:14
@ NumericType
indicates that the type is for a numeric value
Definition MetaType.h:24
@ Comparable
Has < and == operator.
Definition MetaType.h:17
@ OnlyEqualComparable
Has == operator.
Definition MetaType.h:18