knowL: Knowledge Libraries
Loading...
Searching...
No Matches
Literal.h
1#pragma once
2
3#include <cext_nt>
4#include <knowCore/Value.h>
5
6namespace knowRDF
7{
8 using Lang = cext_named_type<QString, struct LangTag>;
13 class Literal : public knowCore::Value
14 {
15 Literal(const knowCore::Uri& _datatype, const knowCore::Value& _rhs,
16 const QString& _lang = QString());
17 public:
21 Literal();
22 Literal(const knowCore::Value& _rhs, const QString& _lang = QString());
23 Literal(const Literal& _rhs);
24 Literal& operator=(const Literal& _rhs);
25 ~Literal();
26 template<typename _T_>
27 static Literal fromValue(const _T_& _value, const Lang& _lang = Lang(QString()));
28 static cres_qresult<Literal> fromValue(const knowCore::Value& _value, const Lang& _lang);
29 static cres_qresult<Literal> fromValue(const Literal& _value,
30 const Lang& _lang = Lang(QString()));
31 static cres_qresult<Literal> fromValue(const QVariant& _value,
32 const Lang& _lang = Lang(QString()))
33 {
34 return fromVariant(_value, _lang);
35 }
36 template<typename _T_>
37 static cres_qresult<Literal>
38 fromValue(const knowCore::Uri& _datatype, const _T_& _value, const QString& _lang = QString(),
39 knowCore::TypeCheckingMode _conversion = knowCore::TypeCheckingMode::Safe);
45 knowCore::Uri datatype() const;
50 static Literal fromValue(const knowCore::Value& _rhs);
58 static cres_qresult<Literal> fromVariant(const knowCore::Uri& _datatype, const QVariant& _value,
59 const QString& _lang = QString(),
60 knowCore::TypeCheckingMode _conversion
61 = knowCore::TypeCheckingMode::Safe);
65 static cres_qresult<Literal> fromVariant(const QVariant& _value,
66 const QString& _lang = QString());
72 static cres_qresult<Literal> fromRdfLiteral(const knowCore::Uri& _datatype,
73 const QString& _value,
74 const QString& _lang = QString());
78 QString lang() const;
79 bool operator<(const Literal& _rhs) const;
80 bool operator==(const Literal& _rhs) const;
81 cres_qresult<QByteArray> md5() const;
82 cres_qresult<QJsonValue> toJsonValue(const knowCore::SerialisationContexts& _contexts) const;
83 static cres_qresult<Literal> fromJsonValue(const QJsonValue& _value,
84 const knowCore::DeserialisationContexts& _contexts);
85 cres_qresult<QCborValue> toCborValue(const knowCore::SerialisationContexts& _contexts) const;
86 static cres_qresult<Literal> fromCborValue(const QCborValue& _value,
87 const knowCore::DeserialisationContexts& _contexts);
88 private:
89 struct Private;
90 QSharedDataPointer<Private> d;
91 };
92 template<typename _T_>
93 Literal Literal::fromValue(const _T_& _value, const Lang& _lang)
94 {
95 return Literal(knowCore::Value::fromValue(_value), _lang);
96 }
97 template<typename _T_>
98 inline cres_qresult<Literal> Literal::fromValue(const knowCore::Uri& _datatype, const _T_& _value,
99 const QString& _lang,
100 knowCore::TypeCheckingMode _conversion)
101 {
102 const auto [success, value, message] = Value::fromValue(_datatype, _value, _conversion);
103 Q_UNUSED(message);
104 if(success)
105 {
106 return cres_success(Literal(value.value(), _lang));
107 }
108 else if constexpr(std::is_same_v<QString, _T_> or std::is_same_v<QByteArray, _T_>)
109 {
110 const auto [success_2, value_2, message_2] = Value::fromRdfLiteral(_datatype, _value);
111 if(success_2)
112 {
113 clog_assert(value_2.value().datatype() == _datatype);
114 return cres_success(Literal(value_2.value(), _lang));
115 }
116 else
117 {
118 knowCore::Value value = Value::fromValue(_value);
119 return cres_success(Literal(_datatype, value, _lang));
120 }
121 }
122 else
123 {
124 return cres_forward_failure(message);
125 }
126 }
127 template<>
128 inline cres_qresult<Literal>
129 Literal::fromValue<QVariant>(const knowCore::Uri& _datatype, const QVariant& _value,
130 const QString& _lang, knowCore::TypeCheckingMode _conversion)
131 {
132 return fromVariant(_datatype, _value, _lang, _conversion);
133 }
134 uint qHash(const Literal& key, std::size_t seed = 0);
135} // namespace knowRDF
136
137clog_format_declare_formatter(knowRDF::Literal)
138{
139 if(p.datatype() != p.Value::datatype())
140 {
141 if(p.lang().isEmpty())
142 {
143 return format_to(ctx.out(), "{}({})", p.datatype(), (const knowCore::Value&)p);
144 }
145 else
146 {
147 return format_to(ctx.out(), "{}({})@{}", p.datatype(), (const knowCore::Value&)p, p.lang());
148 }
149 }
150 else if(p.lang().isEmpty())
151 {
152 return format_to(ctx.out(), "{}", (const knowCore::Value&)(p));
153 }
154 else
155 {
156 return format_to(ctx.out(), "{}@{}", (const knowCore::Value&)p, p.lang());
157 }
158}
159
160#include <knowCore/MetaType.h>
161KNOWCORE_DECLARE_FULL_METATYPE(knowRDF, Literal);
162
163inline knowRDF::Lang operator"" _kRDFlang(const char* _text, std::size_t _size)
164{
165 return knowRDF::Lang(QString::fromUtf8(_text, _size));
166}
167
168#if __cplusplus > 201703L
169inline knowRDF::Lang operator"" _kRDFlang(const char8_t* _text, std::size_t _size)
170{
171 return knowRDF::Lang(QString::fromUtf8((const char*)_text, _size));
172}
173#endif
Definition MetaType.h:126
Definition MetaType.h:159
Definition Uri.h:15
Definition Value.h:21
static Value fromValue(const _T_ &_value)
Definition Value.h:241
cres_qresult< _T_ > value(TypeCheckingMode _conversion=TypeCheckingMode::Safe) const
Definition Value.h:353
Definition Literal.h:14
QString lang() const
Definition Literal.cpp:153
static cres_qresult< Literal > fromVariant(const knowCore::Uri &_datatype, const QVariant &_value, const QString &_lang=QString(), knowCore::TypeCheckingMode _conversion=knowCore::TypeCheckingMode::Safe)
Definition Literal.cpp:102
static cres_qresult< Literal > fromRdfLiteral(const knowCore::Uri &_datatype, const QString &_value, const QString &_lang=QString())
Definition Literal.cpp:139
knowCore::Uri datatype() const
Definition Literal.cpp:53
Literal()
Definition Literal.cpp:22
Definition Value.cpp:15