knowL: Knowledge Libraries
Loading...
Searching...
No Matches
knowl
src
knowCore
Uris
Uris.h
1
#pragma once
2
3
#include <knowCore/Uri.h>
4
#include <knowCore/UriManager.h>
5
#include <knowCore/UrisRegistry.h>
6
#include <knowCore/Value.h>
7
8
#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
9
#define __QT_QVARIANT_FROM_VALUE_EXCEPT(T)
10
#else
11
#define __QT_QVARIANT_FROM_VALUE_EXCEPT(T) \
12
noexcept(std::is_nothrow_copy_constructible_v<T> && Private::CanUseInternalSpace<T>)
13
#endif
14
15
namespace
knowCore::Uris
16
{
17
template
<
typename
_T_>
18
struct
IsUriDefinition
: std::false_type
19
{
20
};
21
22
template
<
typename
_T1_,
typename
_T2_>
23
requires
(IsUriDefinitionV<_T1_> and IsUriDefinitionV<_T2_>)
24
inline
knowCore::Uri
select(
bool
_cond,
const
_T1_& _t1,
const
_T2_& _t2)
25
{
26
return
_cond ?
knowCore::Uri
(_t1) : knowCore::
Uri
(_t2);
27
}
28
}
// namespace knowCore::Uris
29
30
template
<
typename
_T_,
typename
Char>
31
requires
knowCore::Uris::IsUriDefinition<_T_>::value
32
struct
std::formatter<_T_, Char> : std::formatter<knowCore::Uri>
33
{
34
};
35
36
// On a side node, the operator from "UriDefinition" should be assumed to be "static".
37
// They might be called before the UriDefinition is initialised. Which works fine because they don't
38
// depend on anything. (even though it is clearly ugly)
39
40
#define __KNOWCORE_DECLARE_URI_C(_NAME_, _URL_) \
41
class _NAME_##UriDefinition \
42
{ \
43
public: \
44
inline operator knowCore::Uri() const \
45
{ \
46
static knowCore::Uri uri = knowCore::Uri(QStringLiteral(_URL_)); \
47
return uri; \
48
} \
49
inline operator QString() const { return knowCore::Uri(*this); } \
50
}; \
51
static _NAME_##UriDefinition _NAME_;
52
53
#define __KNOWCORE_DECLARE_URI_2(_NS_, _URL_, _NAME_, _LABEL_) \
54
__KNOWCORE_DECLARE_URI_C(_NAME_, _URL_ _LABEL_)
55
56
#define __KNOWCORE_DECLARE_URI_1(_NS_, _URL_, _NAME_) \
57
__KNOWCORE_DECLARE_URI_C(_NAME_, _URL_ #_NAME_)
58
59
#define KNOWCORE_DECLARE_URI_CHOOSER(A, B, C, ...) \
60
__KNOWCORE_GET_2ND_ARG(__VA_OPT__(, ) __VA_ARGS__, __KNOWCORE_DECLARE_URI_2, \
61
__KNOWCORE_DECLARE_URI_1, )
62
63
#define __KNOWCORE_DECLARE_URI(...) KNOWCORE_DECLARE_URI_CHOOSER(__VA_ARGS__)(__VA_ARGS__)
64
65
#define __KNOWCORE_DECLARE_URI_TRAITS_C(_NS_, _NAME_) \
66
template<> \
67
struct knowCore::Uris::IsUriDefinition<_NS_::_NAME_##UriDefinition> : std::true_type \
68
{ \
69
}; \
70
template<> \
71
inline QVariant QVariant::fromValue<_NS_::_NAME_##UriDefinition>( \
72
const _NS_::_NAME_##UriDefinition& _ud) \
73
__QT_QVARIANT_FROM_VALUE_EXCEPT(_NS_::_NAME_##UriDefinition) \
74
{ \
75
return QVariant::fromValue(knowCore::Uri(_ud)); \
76
} \
77
template<> \
78
inline knowCore::Value knowCore::Value::fromValue<_NS_::_NAME_##UriDefinition>( \
79
const _NS_::_NAME_##UriDefinition& _ud) \
80
{ \
81
return knowCore::Value::fromValue(knowCore::Uri(_ud)); \
82
}
83
84
#define __KNOWCORE_DECLARE_URI_TRAITS_2(_NS_, _URL_, _NAME_, _LABEL_) \
85
__KNOWCORE_DECLARE_URI_TRAITS_C(_NS_, _NAME_)
86
87
#define __KNOWCORE_DECLARE_URI_TRAITS_1(_NS_, _URL_, _NAME_) \
88
__KNOWCORE_DECLARE_URI_TRAITS_C(_NS_, _NAME_)
89
90
#define KNOWCORE_DECLARE_URI_TRAITS_CHOOSER(A, B, C, ...) \
91
__KNOWCORE_GET_2ND_ARG(__VA_OPT__(, ) __VA_ARGS__, __KNOWCORE_DECLARE_URI_TRAITS_2, \
92
__KNOWCORE_DECLARE_URI_TRAITS_1, )
93
94
#define __KNOWCORE_DECLARE_URI_TRAITS(...) \
95
KNOWCORE_DECLARE_URI_TRAITS_CHOOSER(__VA_ARGS__)(__VA_ARGS__)
96
97
#define __KNOWCORE_DEFINE_URI_C(_NS_, _NAME_) _NS_::_NAME_##UriDefinition _NS_::_NAME_;
98
99
#define __KNOWCORE_DEFINE_URI_2(_NS_, _URL_, _NAME_, _LABEL_) __KNOWCORE_DEFINE_URI_C(_NS_, _NAME_)
100
101
#define __KNOWCORE_DEFINE_URI_1(_NS_, _URL_, _NAME_) __KNOWCORE_DEFINE_URI_C(_NS_, _NAME_)
102
103
#define KNOWCORE_DEFINE_URI_CHOOSER(A, B, C, ...) \
104
__KNOWCORE_GET_2ND_ARG(__VA_OPT__(, ) __VA_ARGS__, __KNOWCORE_DEFINE_URI_2, \
105
__KNOWCORE_DEFINE_URI_1, )
106
107
#define __KNOWCORE_DEFINE_URI(...) KNOWCORE_DEFINE_URI_CHOOSER(__VA_ARGS__)(__VA_ARGS__)
108
109
#define __KNOWCORE_DECLARE_ONTOLOGY_URIS(_CPP_NAMESPACE_, _NSE_, _CNS_, _URL_, _PREFIX_) \
110
namespace _CPP_NAMESPACE_ \
111
{ \
112
class _CNS_ \
113
{ \
114
_CNS_(); \
115
~_CNS_(); \
116
public: \
117
class UriDefinition \
118
{ \
119
public: \
120
inline operator knowCore::Uri() const \
121
{ \
122
static knowCore::Uri uri = knowCore::Uri(QStringLiteral(_URL_)); \
123
return uri; \
124
} \
125
inline operator std::optional<knowCore::Uri>() const \
126
{ \
127
static knowCore::Uri uri = knowCore::Uri(QStringLiteral(_URL_)); \
128
return uri; \
129
} \
130
inline operator QString() const { return knowCore::Uri(*this); } \
131
knowCore::Uri resolved(const knowCore::Uri& _url) const \
132
{ \
133
return knowCore::Uri(*this).resolved(_url); \
134
} \
135
}; \
136
static const UriDefinition base; \
137
class PrefixDefinition \
138
{ \
139
public: \
140
inline operator QString() const { return QString(_PREFIX_); } \
141
}; \
142
static const PrefixDefinition prefix; \
143
_NSE_(__KNOWCORE_DECLARE_URI, _CNS_, _URL_) \
144
}; \
145
} \
146
_NSE_(__KNOWCORE_DECLARE_URI_TRAITS, _CPP_NAMESPACE_::_CNS_, _URL_)
147
148
#ifdef KNOWCORE_ENABLE_ONTOLOGY_URIS_DEFINITION
149
150
#define __KNOWCORE_ONTOLOGY_URIS(_CPP_NAMESPACE_, _NSE_, _CNS_, _URL_, _PREFIX_) \
151
__KNOWCORE_DECLARE_ONTOLOGY_URIS(_CPP_NAMESPACE_, _NSE_, _CNS_, _URL_, _PREFIX_) \
152
namespace _CPP_NAMESPACE_ \
153
{ \
154
_NSE_(__KNOWCORE_DEFINE_URI, _CNS_, _URL_) \
155
const _CNS_::UriDefinition _CNS_::base; \
156
const _CNS_::PrefixDefinition _CNS_::prefix; \
157
struct _CNS_##_Registration \
158
{ \
159
_CNS_##_Registration() \
160
{ \
161
knowCore::UrisRegistry::manager()->addPrefix(_CNS_::prefix, knowCore::Uri(_CNS_::base)); \
162
} \
163
}; \
164
_CNS_##_Registration _CNS_##_registration; \
165
}
166
167
#else
168
169
#define __KNOWCORE_ONTOLOGY_URIS(_CPP_NAMESPACE_, _NSE_, _CNS_, _URL_, _PREFIX_) \
170
__KNOWCORE_DECLARE_ONTOLOGY_URIS(_CPP_NAMESPACE_, _NSE_, _CNS_, _URL_, _PREFIX_)
171
172
#endif
173
174
#define _KNOWCORE_ONTOLOGY_URIS_2(_CPP_NAMESPACE_, _NSE_, _CNS_, _URL_, _PREFIX_) \
175
__KNOWCORE_ONTOLOGY_URIS(_CPP_NAMESPACE_, _NSE_, _CNS_, _URL_, _PREFIX_)
176
#define _KNOWCORE_ONTOLOGY_URIS_1(_CPP_NAMESPACE_, _NSE_, _CNS_, _URL_) \
177
__KNOWCORE_ONTOLOGY_URIS(_CPP_NAMESPACE_, _NSE_, _CNS_, _URL_, #_CNS_)
178
179
#define _KNOWCORE_ONTOLOGY_URIS_CHOOSER(A, B, C, D, ...) \
180
__KNOWCORE_GET_2ND_ARG(__VA_OPT__(, ) __VA_ARGS__, _KNOWCORE_ONTOLOGY_URIS_2, \
181
_KNOWCORE_ONTOLOGY_URIS_1, )
182
183
#define ___KNOWCORE_ONTOLOGY_URIS(...) _KNOWCORE_ONTOLOGY_URIS_CHOOSER(__VA_ARGS__)(__VA_ARGS__)
184
185
#define KNOWCORE_ONTOLOGY_URIS(_CPP_NAMESPACE_, _NSE_, _CNS_, _URL_, ...) \
186
___KNOWCORE_ONTOLOGY_URIS(_CPP_NAMESPACE_, _NSE_, _CNS_, _URL_ __VA_OPT__(, ) __VA_ARGS__)
knowCore::Uri
Definition
Uri.h:15
knowCore::Uris::IsUriDefinition
Definition
Uris.h:19
Generated by
1.12.0