knowL: Knowledge Libraries
Loading...
Searching...
No Matches
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
15namespace 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
30template<typename _T_, typename Char>
32struct 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__)
Definition Uri.h:15