3#include <Cyqlops/Crypto/Hash.h>
5#include "QuantityValue.h"
9 enum class RangeBoundType
17 template<
typename _T_>
25 return _lhs.
compare(_rhs, knowCore::ComparisonOperator::Equal);
29 return _lhs.
compare(_rhs, knowCore::ComparisonOperator::Inferior);
32 template<
typename _T_>
48 using ReturnType = bool;
63 template<
typename _T_>
67 Range() : m_lowerType(RangeBoundType::Unset), m_upperType(RangeBoundType::Unset) {}
68 Range(RangeBoundType _lower_type,
const _T_& _lower,
const _T_& _upper, RangeBoundType _upper_type) : m_lower(_lower), m_lowerType(_lower_type), m_upper(_upper), m_upperType(_upper_type) {}
71 bool operator==(
const Range& _rhs)
const;
72 _T_ lower()
const {
return m_lower; }
73 RangeBoundType lowerBoundType()
const {
return m_lowerType; }
74 _T_ upper()
const {
return m_upper; }
75 RangeBoundType upperBoundType()
const {
return m_upperType; }
120 RangeBoundType m_lowerType;
122 RangeBoundType m_upperType;
125 template<
typename _T_>
128 return m_lowerType == _rhs.m_lowerType and m_upperType == _rhs.m_upperType and m_lower == _rhs.m_lower and m_upper == _rhs.m_upper;
131#define __KNOWCORE_DATATYPE_KEY QString("datatype")
132#define __KNOWCORE_VALUE_KEY QString("value")
136 template<
typename _T_>
143 static auto md5(
const Value& _value)
150 obj[__KNOWCORE_DATATYPE_KEY] = QString(_value.
datatype());
151 KNOWCORE_RETURN_VALUE_TRY(value, _value.toJsonValue(_contexts));
152 obj[__KNOWCORE_VALUE_KEY] = value;
153 return kCrvSuccess(obj);
157 QJsonObject obj = _value.toObject();
158 KNOWCORE_RETURN_VALUE_TRY(value, Value::fromJsonValue(obj[__KNOWCORE_DATATYPE_KEY].toString(), obj[__KNOWCORE_VALUE_KEY], _contexts));
159 return kCrvSuccess(value);
164 obj[__KNOWCORE_DATATYPE_KEY] = QString(_value.
datatype());
165 KNOWCORE_RETURN_VALUE_TRY(value, _value.toCborValue(_contexts));
166 obj[__KNOWCORE_VALUE_KEY] = value;
167 return kCrvSuccess(obj);
171 QCborMap obj = _value.toMap();
172 KNOWCORE_RETURN_VALUE_TRY(value, Value::fromCborValue(obj[__KNOWCORE_DATATYPE_KEY].toString(), obj[__KNOWCORE_VALUE_KEY], _contexts));
173 return kCrvSuccess(value);
177 KNOWCORE_RETURN_VALUE_TRY(lit, _value.toRdfLiteral(_contexts));
178 return kCrvSuccess(clog_qt::qformat(
"<{}>({})", _value.
datatype(), lit));
182 QRegularExpressionMatch match = QRegularExpression(
"<(.*)>(.*)").match(_value);
185 return Value::fromRdfLiteral(match.captured(0), match.captured(1), _contexts);
187 return kCrvError(
"Invalid range value literal.");
193 template<
typename _T_>
196 QCryptographicHash hash(QCryptographicHash::Md5);
199 hash.addData(value_lower);
200 Cyqlops::Crypto::Hash::compute(hash, lowerBoundType());
201 hash.addData(value_upper);
202 Cyqlops::Crypto::Hash::compute(hash, upperBoundType());
204 return kCrvSuccess(hash.result());
207 template<
typename _T_>
209 requires (std::is_same_v<typename details::RangeComparator<_T_>::ReturnType,
ReturnValue<bool>>)
211 switch(lowerBoundType())
213 case RangeBoundType::Inclusive:
222 case RangeBoundType::Exclusive:
227 return kCrvSuccess(
false);
230 case RangeBoundType::Unset:
233 switch(upperBoundType())
235 case RangeBoundType::Inclusive:
244 case RangeBoundType::Exclusive:
249 return kCrvSuccess(
false);
252 case RangeBoundType::Unset:
255 return kCrvSuccess(
true);
258 template<
typename _T_>
260 requires (std::is_same_v<typename details::RangeComparator<_T_>::ReturnType,
bool>)
262 switch(lowerBoundType())
264 case RangeBoundType::Inclusive:
272 case RangeBoundType::Exclusive:
274 if(details::RangeComparator<_T_>::isStrictlyInferior(_v, lower()))
276 return kCrvSuccess(
false);
279 case RangeBoundType::Unset:
282 switch(upperBoundType())
284 case RangeBoundType::Inclusive:
286 if(details::RangeComparator<_T_>::isEqual(_v, upper()))
292 case RangeBoundType::Exclusive:
294 if(details::RangeComparator<_T_>::isStrictlyInferior(upper(), _v))
296 return kCrvSuccess(
false);
299 case RangeBoundType::Unset:
305#define __KNOWCORE_LOWER_VALUE_KEY QString("lower_value")
306#define __KNOWCORE_LOWER_TYPE_KEY QString("lower_type")
307#define __KNOWCORE_UPPER_VALUE_KEY QString("upper_value")
308#define __KNOWCORE_UPPER_TYPE_KEY QString("upper_value")
310 template<
typename _T_>
316 object[__KNOWCORE_LOWER_TYPE_KEY] = (int)lowerBoundType();
317 object[__KNOWCORE_UPPER_TYPE_KEY] = (int)upperBoundType();
318 return kCrvSuccess(
object);
321 template<
typename _T_>
324 if(_value.isObject())
326 QJsonObject
object = _value.toObject();
329 RangeBoundType lowerType = RangeBoundType(
object.value(__KNOWCORE_LOWER_TYPE_KEY).toInt());
330 RangeBoundType upperType = RangeBoundType(
object.value(__KNOWCORE_UPPER_TYPE_KEY).toInt());
331 return kCrvSuccess<Range<_T_>>({lowerType, lower, upper, upperType});
333 return kCrvError(
"Expected object got {}", _value);
337 template<
typename _T_>
343 object[__KNOWCORE_LOWER_TYPE_KEY] = (int)lowerBoundType();
344 object[__KNOWCORE_UPPER_TYPE_KEY] = (int)upperBoundType();
345 return kCrvSuccess(
object);
348 template<
typename _T_>
353 QCborMap
object = _value.toMap();
356 RangeBoundType lowerType = RangeBoundType(
object.value(__KNOWCORE_LOWER_TYPE_KEY).toInteger());
357 RangeBoundType upperType = RangeBoundType(
object.value(__KNOWCORE_UPPER_TYPE_KEY).toInteger());
358 return kCrvSuccess<Range<_T_>>({lowerType, lower, upper, upperType});
360 return kCrvError(
"Expected object got {}", _value);
364 template<
typename _T_>
368 switch(lowerBoundType())
370 case RangeBoundType::Exclusive:
371 case RangeBoundType::Unset:
374 case RangeBoundType::Inclusive:
378 QString str_lower, str_upper;
379 if(lowerBoundType() == RangeBoundType::Unset)
385 if(upperBoundType() == RangeBoundType::Unset)
392 v += str_lower +
", " + str_upper;
394 switch(upperBoundType())
396 case RangeBoundType::Exclusive:
397 case RangeBoundType::Unset:
400 case RangeBoundType::Inclusive:
405 return kCrvSuccess(v);
408 template<
typename _T_>
411 if(_value.size() < 5)
return kCrvError(
"Invalid range RDF Literal: '{}'", _value);
413 QString lowerBoundString = _value.left(2);
414 QString upperBoundString = _value.right(2);
415 QStringList values = _value.mid(2, _value.size() - 4).split(
",", KNOWCORE_QT_SKIP_EMPTY_PART);
417 RangeBoundType lowerBoundType;
418 if(lowerBoundString ==
"]]") lowerBoundType = RangeBoundType::Exclusive;
419 else if(lowerBoundString ==
"[[") lowerBoundType = RangeBoundType::Inclusive;
420 else return kCrvError(
"Invalid lower bound symbol: '{}'", lowerBoundString);
422 RangeBoundType upperBoundType;
423 if(upperBoundString ==
"[[") upperBoundType = RangeBoundType::Exclusive;
424 else if(upperBoundString ==
"]]") upperBoundType = RangeBoundType::Inclusive;
425 else return kCrvError(
"Invalid lower bound symbol: '{}'", lowerBoundString);
427 if(values.size() != 2)
return kCrvError(
"Got wrong amount of values in: '{}' got {} expected 2", _value, values.size());
430 if(values[0] ==
"inf")
432 lowerBoundType = RangeBoundType::Unset;
436 if(values[1] ==
"inf")
438 upperBoundType = RangeBoundType::Unset;
443 return kCrvSuccess<Range<_T_>>({lowerBoundType, lower, upper, upperBoundType});
446 template<
typename _T_>
449 return toRdfLiteral();
452#undef __KNOWCORE_LOWER_VALUE_KEY
453#undef __KNOWCORE_LOWER_TYPE_KEY
454#undef __KNOWCORE_UPPER_VALUE_KEY
455#undef __KNOWCORE_UPPER_TYPE_KEY
460KNOWCORE_DECLARE_FULL_METATYPE(knowCore, QuantityNumberRange)
461KNOWCORE_DECLARE_FULL_METATYPE(knowCore, NumberRange)
462KNOWCORE_DECLARE_FULL_METATYPE(knowCore, ValueRange)
464#include "Formatter.h"
465KNOWCORE_CORE_DECLARE_FORMATTER_ENUM(knowCore::RangeBoundType, Exclusive, Inclusive, Unset)
467template<
typename _T_>
Class that can contains large numeric value.
Definition BigNumber.h:46
Definition MetaType.h:114
Definition QuantityValue.h:21
ReturnValue< QByteArray > md5() const
Definition Range.h:194
details::RangeComparator< _T_ >::ReturnType contains(const _T_ &_v) const
Definition Range.h:208
ReturnValue< QString > printable() const
Definition Range.h:447
ReturnValue< QJsonValue > toJsonValue(const SerialisationContexts &_contexts=defaultSerialisationContext()) const
Definition Range.h:311
static ReturnValue< Range > fromRdfLiteral(const QString &_value, const DeserialisationContexts &_context=defaultDeserialisationContext())
Definition Range.h:409
details::RangeComparator< _T_ >::ReturnType contains(const _T_ &_v) const
static ReturnValue< Range > fromJsonValue(const QJsonValue &_value, const DeserialisationContexts &_context=defaultDeserialisationContext())
Definition Range.h:322
ReturnValue< QCborValue > toCborValue(const SerialisationContexts &_contexts=defaultSerialisationContext()) const
Definition Range.h:338
static ReturnValue< Range > fromCborValue(const QCborValue &_value, const DeserialisationContexts &_context=defaultDeserialisationContext())
Definition Range.h:349
ReturnValue< QString > toRdfLiteral(const SerialisationContexts &_contexts=defaultSerialisationContext()) const
Definition Range.h:365
Definition ReturnValue.h:29
Definition MetaType.h:145
Uri datatype() const
Definition Value.cpp:199
ReturnValue< bool > compare(const Value &_value, ComparisonOperators _operators) const
Definition Value.cpp:299