3#include <QSharedDataPointer>
5#include <knowCore/Forward.h>
8#include "ReturnValue.h"
29 template<
typename _T_>
40 template<
typename _T_>
87 ReturnValue<Value> convert(
const Uri& _uri, TypeCheckingMode _conversion = TypeCheckingMode::Safe)
const;
97 template<
typename _T_>
104 template<
typename _T_>
105 inline _T_
value(
const _T_& _default, TypeCheckingMode _conversion = TypeCheckingMode::Safe)
const;
109 template<
typename _T_>
110 inline bool canConvert(TypeCheckingMode _conversion = TypeCheckingMode::Safe)
const;
114 bool canConvert(
const Uri& _uri, TypeCheckingMode _conversion = TypeCheckingMode::Safe)
const;
115 template<
typename _T_>
116 inline bool is()
const;
120 template<
typename _T_>
157 template<
typename _T_>
160 static const AbstractMetaTypeDefinition* getDefinition(
const Uri& _datatype);
161 static const AbstractMetaTypeDefinition* getDefinition(
int _id);
162 const void* data()
const;
163 template<
typename _T_>
164 const AbstractTypeConversion* converterTo(TypeCheckingMode _conversion)
const
165 {
return converterTo(MetaTypeInformation<_T_>::uri(), _conversion); }
166 const AbstractTypeConversion* converterTo(
const Uri& _datatype, TypeCheckingMode _conversion)
const;
167 template<
typename _T_>
168 const AbstractTypeConversion* converterFrom(TypeCheckingMode _conversion)
const
169 {
return converterFrom(MetaTypeInformation<_T_>::uri()); }
170 const AbstractTypeConversion* converterFrom(
const Uri& _datatype, TypeCheckingMode _conversion)
const;
171 template<
typename _TFrom_,
typename _TTo_>
172 static const AbstractTypeConversion *converterBetween(TypeCheckingMode _conversion)
173 {
return converterBetween(MetaTypeInformation<_TFrom_>::uri(), MetaTypeInformation<_TTo_>::uri(), _conversion);}
174 static const AbstractTypeConversion* converterBetween(
const Uri& _from,
const Uri& _to, TypeCheckingMode _conversion);
176 static const AbstractTypeConversion* converter(
const Uri& _from,
const Uri& _to, TypeCheckingMode _conversion);
179 QSharedDataPointer<Private> d;
181 uint qHash(
const Value& key, uint seed = 0);
183 template<
typename _T_>
187 KNOWCORE_ASSERT(def);
188 return Value(def->uri(), def, def->duplicate(&_value));
190 template<
typename _T_>
200 void* data = def_2->allocate();
201 KNOWCORE_RETURN_VALUE_TRY_VOID(converter->convert(&_value, data));
202 return kCrvSuccess(
Value(_datatype, def_2, data));
204 return kCrvError(
"{0} is not alias of type '{1}' with uri '{2}' and no conversion from '{2}' to '{0}'.", _datatype, prettyTypename<_T_>(),
MetaTypeInformation<_T_>::uri());
208 return kCrvSuccess(
Value(_datatype, def_1, def_1->duplicate(&_value)));
210 return kCrvError(
"Type '{}' with datatype '{}' is not defined!", prettyTypename<_T_>(), _datatype);
216 return _value.convert(_datatype, _conversion);
225 return fromVariant(_datatype, _value, _conversion);
228 template<
typename _T_>
233 return kCrvSuccess(_T_(*
reinterpret_cast<const _T_*
>(data())));
239 converter->convert(data(), &r);
240 return kCrvSuccess(r);
245 KNOWCORE_RETURN_VALUE_TRY_VOID(converter->convert(data(), &val));
246 return val.
value<_T_>();
252 KNOWCORE_RETURN_VALUE_TRY_VOID(converter->convert(
this, &val));
253 return kCrvSuccess(val);
257 template<
typename _T_>
258 inline _T_
Value::value(
const _T_& _default, TypeCheckingMode _conversion)
const
260 auto const& [s, v, m] =
value<_T_>(_conversion);
261 return s ? v : _default;
263 template<
typename _T_>
268 template<
typename _T_>
269 inline bool Value::is()
const
273 template<
typename _T_>
274 inline ReturnValue<_T_> Value::fromJsonValue(
const QJsonValue& _value,
const DeserialisationContexts& _context)
276 KNOWCORE_RETURN_VALUE_TRY(val, fromJsonValue(MetaTypeInformation<_T_>::uri(), _value, _context));
294 template<
typename _T_>
300 auto const& [s, t, m] = _val.
value<_T_>(_conversion);
304 operator bool() {
return m_success; }
305 const _T_& value()
const {
306 KNOWCORE_ASSERT(m_success);
310 KNOWCORE_ASSERT(m_success);
313 operator const _T_&()
const {
316 _T_* operator->() {
return &value(); }
317 _T_* operator->()
const {
return &value(); }
337 template<
typename _T_>
346 m_t = _val.
value<_T_>().expectSuccess();
351 operator bool() {
return m_success; }
352 const _T_& value()
const {
353 KNOWCORE_ASSERT(m_success);
357 KNOWCORE_ASSERT(m_success);
360 operator const _T_&()
const {
363 _T_* operator->() {
return &value(); }
364 _T_* operator->()
const {
return &value(); }
373 auto const [success, value, message] = p.printable();
376 return format_to(ctx.out(),
381 return format_to(ctx.out(),
382 "{}(error: '{}')", p.datatype(), message);
386#include <knowCore/MetaType.h>
387KNOWCORE_DECLARE_FULL_METATYPE_NO_DEFINITION(knowCore, Value)
Definition MetaType.h:236
Definition MetaType.h:114
Definition ReturnValue.h:29
Definition MetaType.h:145
static ReturnValue< Value > fromCborMap(const QCborMap &_value, const DeserialisationContexts &_context=defaultDeserialisationContext())
Definition Value.cpp:580
ReturnValue< QCborMap > toCborMap(const SerialisationContexts &_contexts=defaultSerialisationContext()) const
Definition Value.cpp:572
bool isEmpty() const
Definition Value.cpp:209
static ReturnValue< Value > fromJsonObject(const QJsonObject &_value, const DeserialisationContexts &_context=defaultDeserialisationContext())
Definition Value.cpp:567
Uri datatype() const
Definition Value.cpp:199
ReturnValue< Value > compute(const Value &_value, ArithmeticOperator _operator) const
Definition Value.cpp:368
static Value fromValue(const _T_ &_value)
Definition Value.h:184
ReturnValue< bool > compare(const Value &_value, ComparisonOperators _operators) const
Definition Value.cpp:299
static ReturnValue< Value > fromVariant(const Uri &_datatype, const QVariant &_value, TypeCheckingMode _conversion=TypeCheckingMode::Safe)
Definition Value.cpp:140
ReturnValue< _T_ > value(TypeCheckingMode _conversion=TypeCheckingMode::Safe) const
Definition Value.h:229
bool operator!=(const Value &_rhs) const
Definition Value.h:82
ReturnValue< QJsonObject > toJsonObject(const SerialisationContexts &_contexts=defaultSerialisationContext()) const
Definition Value.cpp:559
Value()
Definition Value.cpp:112
bool operator<(const Value &_rhs) const
Definition Value.cpp:381
ReturnValue< ValueHash > toHash() const
Definition Value.cpp:237
QVariant toVariant() const
Definition Value.cpp:219
bool operator==(const Value &_rhs) const
Definition Value.cpp:393
ReturnValue< ValueList > toList() const
Definition Value.cpp:232
bool canConvert(TypeCheckingMode _conversion=TypeCheckingMode::Safe) const
Definition Value.h:264