knowL: Knowledge Libraries
Loading...
Searching...
No Matches
Literal.h
1#pragma once
2
3#include <knowCore/NamedType.h>
4#include <knowCore/Value.h>
5
6namespace knowRDF
7{
13 class Literal : public knowCore::Value
14 {
15 Literal(const knowCore::Uri& _datatype, const knowCore::Value& _rhs, const QString& _lang = QString());
16 public:
20 Literal();
21 Literal(const knowCore::Value& _rhs, const QString& _lang = QString());
22 Literal(const Literal& _rhs);
23 Literal& operator=(const Literal& _rhs);
24 ~Literal();
25 template<typename _T_>
26 static Literal fromValue(const _T_& _value, const Lang& _lang = Lang(QString()));
27 static knowCore::ReturnValue<Literal> fromValue(const knowCore::Value& _value, const Lang& _lang);
28 static knowCore::ReturnValue<Literal> fromValue(const Literal& _value, const Lang& _lang = Lang(QString()));
29 static knowCore::ReturnValue<Literal> fromValue(const QVariant& _value, const Lang& _lang = Lang(QString())) { return fromVariant(_value, _lang); }
30 template<typename _T_>
31 static knowCore::ReturnValue<Literal> fromValue(const knowCore::Uri& _datatype, const _T_& _value, const QString& _lang = QString(), knowCore::TypeCheckingMode _conversion = knowCore::TypeCheckingMode::Safe);
36 knowCore::Uri datatype() const;
41 static Literal fromValue(const knowCore::Value& _rhs);
49 static knowCore::ReturnValue<Literal> fromVariant(const knowCore::Uri& _datatype, const QVariant& _value, const QString& _lang = QString(), knowCore::TypeCheckingMode _conversion = knowCore::TypeCheckingMode::Safe);
53 static knowCore::ReturnValue<Literal> fromVariant(const QVariant& _value, const QString& _lang = QString());
59 static knowCore::ReturnValue<Literal> fromRdfLiteral(const knowCore::Uri& _datatype, const QString& _value, const QString& _lang = QString());
63 QString lang() const;
64 bool operator<(const Literal& _rhs) const;
65 bool operator==(const Literal& _rhs) const;
68 static knowCore::ReturnValue<Literal> fromJsonValue(const QJsonValue& _value, const knowCore::DeserialisationContexts& _contexts);
70 static knowCore::ReturnValue<Literal> fromCborValue(const QCborValue& _value, const knowCore::DeserialisationContexts& _contexts);
71 private:
72 struct Private;
73 QSharedDataPointer<Private> d;
74 };
75 template<typename _T_>
76 Literal Literal::fromValue(const _T_& _value, const Lang& _lang)
77 {
78 return Literal(knowCore::Value::fromValue(_value), _lang);
79 }
80 template<typename _T_>
81 inline knowCore::ReturnValue<Literal> Literal::fromValue(const knowCore::Uri& _datatype, const _T_& _value, const QString& _lang, knowCore::TypeCheckingMode _conversion)
82 {
83 const auto [success, value, message] = Value::fromValue(_datatype, _value, _conversion);
84 Q_UNUSED(message);
85 if(success)
86 {
87 return kCrvSuccess(Literal(value, _lang));
88 } else if constexpr(std::is_same_v<QString, _T_> or std::is_same_v<QByteArray, _T_>) {
89 const auto [success_2, value_2, message_2] = Value::fromRdfLiteral(_datatype, _value);
90 if(success_2)
91 {
92 KNOWCORE_ASSERT(value_2.datatype() == _datatype);
93 return kCrvSuccess(Literal(value_2, _lang));
94 } else {
95 knowCore::Value value = Value::fromValue(_value);
96 return kCrvSuccess(Literal(_datatype, value, _lang));
97 }
98 } else {
99 return kCrvError(message);
100 }
101 }
102 template<>
103 inline knowCore::ReturnValue<Literal> Literal::fromValue<QVariant>(const knowCore::Uri& _datatype, const QVariant& _value, const QString& _lang, knowCore::TypeCheckingMode _conversion)
104 {
105 return fromVariant(_datatype, _value, _lang, _conversion);
106 }
107 uint qHash(const Literal& key, uint seed = 0);
108}
109
110KNOWCORE_CORE_DECLARE_FORMATTER(knowRDF::Literal)
111{
112 if(p.datatype() != p.Value::datatype())
113 {
114 if(p.lang().isEmpty())
115 {
116 return format_to(ctx.out(), "{}({})", p.datatype(), (const knowCore::Value&)p);
117 } else {
118 return format_to(ctx.out(), "{}({})@{}", p.datatype(), (const knowCore::Value&)p, p.lang());
119 }
120 } else if(p.lang().isEmpty())
121 {
122 return forward<knowCore::Value>(p, ctx);
123 } else {
124 return format_to(ctx.out(), "{}@{}", (const knowCore::Value&)p, p.lang());
125 }
126
127}
128
129#include <knowCore/MetaType.h>
130KNOWCORE_DECLARE_FULL_METATYPE(knowRDF, Literal)
131
132inline knowRDF::Lang operator "" _kRDFlang(const char* _text, std::size_t _size)
133{
134 return knowRDF::Lang(QString::fromUtf8(_text, _size));
135}
136
137#if __cplusplus > 201703L
138inline knowRDF::Lang operator "" _kRDFlang(const char8_t* _text, std::size_t _size)
139{
140 return knowRDF::Lang(QString::fromUtf8((const char*)_text, _size));
141}
142#endif
Definition MetaType.h:114
Definition NamedType.h:40
Definition ReturnValue.h:29
Definition MetaType.h:145
Definition Uri.h:14
Definition Value.h:13
static Value fromValue(const _T_ &_value)
Definition Value.h:184
ReturnValue< _T_ > value(TypeCheckingMode _conversion=TypeCheckingMode::Safe) const
Definition Value.h:229
Definition Literal.h:14
static knowCore::ReturnValue< Literal > fromRdfLiteral(const knowCore::Uri &_datatype, const QString &_value, const QString &_lang=QString())
Definition Literal.cpp:127
QString lang() const
Definition Literal.cpp:138
static knowCore::ReturnValue< Literal > fromVariant(const knowCore::Uri &_datatype, const QVariant &_value, const QString &_lang=QString(), knowCore::TypeCheckingMode _conversion=knowCore::TypeCheckingMode::Safe)
Definition Literal.cpp:97
knowCore::Uri datatype() const
Definition Literal.cpp:56
Literal()
Definition Literal.cpp:22
Definition Value.cpp:15