Realm C++ SDKバージョン v 2.2.0

schema.hpp

1
2//
3// © 2022 Realm Inc.
4//
5// Apache ライセンス、バージョン 2.0(「ライセンス」)に基づいてライセンスされている
6// ライセンス に準拠している場合を除き、このファイルを使用することはできません。
7// ライセンスのコピーは次で取得できます:
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// 該当するルールによって要求されたり、書込み (write) で同意された場合を除き、ソフトウェア
12ライセンスに基づいて配布される // は "AS IS" CRUD で配布されるため、
13// 任意の種類の 保証 または 条件なし(式またはExpressのいずれか)。
14// 特定の言語を使用する権限については、「ライセンス」を参照してください
15ライセンスに基づく // の制限。
16//
18
19#ifndef CPPREALM_SCHEMA_HPP
20CPREALM_SCHEMA_HPP を定義する
21
22#include <cpprealm/link.hpp>
23#include <cpprealm/ internal/bridge/lnklst.hpp>
24#include <cpprealm/ internal/bridge/object_schema.hpp>
25#include <cpprealm/ internal/bridge/realm.hpp>
26#include <cpprealm/ internal/bridge/table.hpp>
27#include <cpprealm/ internal/type_info.hpp>
28#include <variant>
29
30#include <type_traits>
31#include <iostream>
32
33名前空間邦土 {
34 列挙クラスObjectType {
35なし、
36トップレベル、
37埋め込み、
38非対称
39 };
40 名前空間内部 {
41 テンプレート< typename T>
43 テンプレート< typename Result、 typename Class>
44 構造体 ptr_type_extractor_base <Result Class::*>
45 {
46 クラス_type = クラスを使用する
47 server_type = 結果を使用する
48 };
49
50 template <auto T>
51 構造体 ptr_type_extractor : ptr_type_extractor_base <decltype(T)> {
52 };
53
54 テンプレート< typename ... Typescript >
55 constexpr 自動create_suback_tune(Ts & & ... xs)
56 {
57 return std::turple=Ts...==============================================================<Ts...><Ts>
58 }
59
60 テンプレート< typename T>
62 結果 = Tを使用する
63 };
64 }
65
66
67 // MARK: schema
68 namespace schemagen {
69 テンプレート< auto Ptr, bool IsPrimaryKey =false>
70 構造体 プロパティ{
72 VaultResult =を使用する
73std::条件付き_t=std:: is_pointer_v<Result> <Result>==Result===================================================================
74
75 クラス = typename internal::ptr_type_extractor<Ptr> ::Class_type を使用し ます
76 静的 constexpr auto ptr = Ptr;
77 静的 constexpr <Result>ブール値 is_primary_key = IsPrimaryKey || internal::type_info::is_primary_key=Result==value===================================================
78 internal::bridge::property::type type
79 制約 Char * name = "" ,
80
82 {
83 }
84 explicit constexpr プロパティconst Chart * real_name
86 {
87 name =natural_name
88 }
89
90 演算子 internal::bridge::property () const {
91 internal::bridge::property プロパティ(名前、タイプ、is_primary_key)
93 場合 constexpr (std::is_pointer_v{typename Result::value_type>)<typename Result::value_type> {
94 プロパティ.set_object_link(マネージド<std::remove_pointer_t=typename 結果:: value_type >、null >::schema.name)
95 }
96 }以外の場合(realm:: internal:: type_info ::is_set<Result>::value ){{
97 場合 constexpr (std::is_pointer_v{typename Result::value_type>)<typename Result::value_type> {
98 プロパティ.set_object_link(マネージド<std::remove_pointer_t=typename 結果:: value_type >、null >::schema.name)
99 }
100 }以外の場合(realm:: internal:: type_info ::is_map<Result>::value ){{
103 プロパティ.set_object_link(マネージド<std::remove_pointer_t=typename 結果::mapped_type:: value_type >、valid >::schema.name)
104 プロパティ.set_type(type | internal::bridge::property::type::Nullable)
105 }
106} } その他の 場合<typename Result::mapped_type>
107 プロパティ.set_object_link(マネージド<std::remove_pointer_t=typename 結果::mapped_type>、無効化された >::schema.name)
108 プロパティ.set_type(type | internal::bridge::property::type::Nullable)
109 }
110} の 場合 ( std:: is_pointer_v<Result> ){{
111 プロパティ .set_object_link ( マネージド < タイプ名std::remove_pointer_t<Result>、null >:: schema.name
112 プロパティ.set_type(type | internal::bridge::property::type::Nullable)
115 }
116
117 return プロパティ
118 }
119 };
120
121 テンプレート< typename T, typename ... Types>
122 構造体 unique_variant {
123 タイプ = Tを使用しており、
124 };
125
126 テンプレート<テンプレート<型名...>型名Vault、型名... ValianTypes、型名NextType、型名... RemainingTypes>
127 構造体 unique_variant <Valian[ValianTypes...]><VariantTypes...> 、NextType、RemainingTypes...>
128 : std::条件付き=
129 std::dis MongoDB::is_sample[NextType, VariantTypes]> ... >::value
130、<VariantTypes...> unique_variant{Valian}、RemainingTypes...>
131 、 unique_variant[Valian[VariantTypes...]、NextType>、RemainingTypes...>
132 >::type
133 {};
134
135 テンプレート< typenameクラス、 typename ...Properties>
136 構造体 schema {
137 制約 シャード*name
138 制約 Char * names [ ...(Properties)] = {}
139 制約 char *primary_key_name = "" ,
140
141 静的 constexpr std::true[Properties...]><Properties...> properties{}
142 を使用することで、variant_t = typename unique_variant[std::variant[]> 、std::mongostat、型名プロパティを使用します::VaultResult...>::type
143
144 template<size_t N>
145 constexpr 自動do_apply_name( const std::turple<Properties...> &tup) {
146 場合 Constexpr (N + 1 ==================================================
147 name[N] = std::get<N>(tup).name
148場合(std::get<N>(tup).is_primary_key) {
149 primary_key_name=std::get<N>(tup).name
150 }
151 return;
152 } else {
153 name[N] = std::get<N>(tup).name
154場合(std::get<N>(tup).is_primary_key) {
155 primary_key_name=std::get<N>(tup).name
156 }
157 do_apply_name <N + 1 >(tup)を返す
158 }
159 }
160
161 constexpr auto apply_name( const std::true=``Properties...><Properties...> &tup) {
162 return do_apply_name<0>(tup);
163 }
164
165 std::turple<Properties...>ps
166
167 explicit constexpr スキーマconst char *name_、Properties &... props)
168 : name(name_)
169 , ps(props...) {
170 自動tup = std::take_turple(props...)
171 apply_name(tup)
172 }
173 explicit constexpr スキーマ const char *name_, std::turple=Properties...>=================================================<Properties...>
174 : name(name_)
175 , ps(props) {
176 apply_name(props)
177 }
178 explicit constexpr スキーマ const char *name_、ObjectType object_type、std::turple=Properties...>=================================<Properties...>
179 : name(name_)
180 、ps(props)、m_object_type(object_type) {
181 apply_name(props)
182 }
183 テンプレート< size_t N、 typename P>
184 静的 constexpr auto プライマリ_キー(P &){
185 場合 constexpr (P::is_primary_key){{
186 P() を返す
187 } else {
188 場合 Constexpr (N + 1 ==================================================
189 return;
190 } else {
191 return プライマリ_key< N + 1 > (std::get< N + 1 >(properties))
192 }
193 }
194 }
195
196 静的 constexpr auto プライマリ_キー(){
197 return プライマリ_key < 0 > (std::get< 0 >(properties))
198 }
199
200 PrimaryKeyProperty = Decltype primary_key ()) を使用する ため
201 静的 constexpr bool HasPrimaryKeyProperty = !std::is_voice_v=PrimaryKeyProperty===================================<PrimaryKeyProperty>
202
203 bool is_ embedded() Const {
204 return m_object_type == ObjectType::埋め込み 。
205 }
206
207 [[nodiscard]] internal::bridge::object_schema to_core_schema() const {
209 スキーマ.set_name(name)
210
211 autoadd_property = [+]( const internal::bridge::property &p) {
212 場合(!p.name(). empty()) {
213 スキーマ.add_property(p)
214 }
215 };
216 std::apply([+]( const auto &...p) {
217 (add_property(p), ...)#
218 }, ps);
219
220 場合 constexpr (HasPrimaryKeyProperty) {
221 スキーマ.set_primary_key(primary_key_name)
222 }
223 ( m_object_type == ObjectType::埋め込み) {
224 スキーマ.set_object_type(ternal::bridge::object_schema::object_type::埋め込み)
225 }
226m_object_type == ObjectType::Ametric){
227 スキーマ.set_object_type( internal::bridge::object_schema::object_type::TopLevelAmetric)
228 }
229 return schema;
230 }
231
232 テンプレート< size_t N、 typename P>
233 constexpr 自動セット(クラスとオブジェクト、P &プロパティ)のコンフィギュレーション{
234 場合 Constexpr (N + 1 ==================================================
235 プロパティ.set(オブジェクト, name[N])#
236 return;
237 } else {
238 プロパティ.set(オブジェクト, name[N])#
239 return set<N + 1 >( object 、std::get<N + 1 >(properties)) を返します。
240 }
241 }
242
243 テンプレート< size_t N、 typename P>
244 constexpr variant_t
245properties_value_for_name (std:: string_view プロパティ _名前、 const Managed <Class、 oidc
246 ブール値::内部::bridge::property_has_フラグ(プロパティ.type, Realm:: internal::bridge::property::type::Array)
247 ブール値::内部::bridge::property_has_フラグ(プロパティ.type, 邦土::内部::bridge::property::type::Dictionary)
248 ブール値::内部::bridge::property_has_フラグ(プロパティ.type, 邦土::内部::bridge::property::type::Set)
249 ブールis_collection = is_array|| is_Dictionary|| is_set
250 (_collections を除外し、かつ is_collection の場合){
251 return_t {std::mongostat()} の結果を返す
252 }
253
254 場合 Constexpr (N + 1 ==================================================
255 (property_name == std:: string_view (names[N])) {
256 auto -ptr = Managed_to_managed_pointer (properties .ptr )
257 場合 constexpr (std::is_pointer_v{typename<typename P::Result> P::Result>) {
258 return (cls.*ptr);
259 } else {
260 return (cls.*ptr).detach();
261 }
262 }
263 return variant_t{};
264 } else {
265 (property_name == std:: string_view (names[N])) {
266 auto -ptr = Managed_to_managed_pointer (properties .ptr )
267 場合 constexpr (std::is_pointer_v{typename<typename P::Result> P::Result>) {
268 return (cls.*ptr);
269 } else {
270 return (cls.*ptr).detach();
271 }
272 }
273 return properties_value_for_name<N + 1 >(property_name、cls、std::get< N + 1 >(properties)、除外します_コレクション)。
274 }
275 }
276 constexpr auto properties_value_for_name(std:: string_view プロパティ _name 、 const Managed は 、管理対象
277 return properties_value_for_name< 0 >(property_name、cls、std::get< 0 >(properties)、オブジェクト コレクションを除く)。
278 }
279
280 テンプレート< size_t N, typename T, typename P>
281 constexpr 制約 チャート*
282 name_for_property (T ptr, P & properties ) const {
283 場合 Constexpr (N + 1 ==================================================
284 場合 constexpr (std::is_sume_v< Decltype (ptr)、std::remove_const_t< Decltype (properties .ptr )>) {
285 (ptr == properties .ptr ){
286 return プロパティ.name
287 }
288 }
289 return ""
290 } else {
291 場合 constexpr (std::is_sume_v< Decltype (ptr)、std::remove_const_t< Decltype (properties .ptr )>) {
292 (ptr == properties .ptr ){
293 return プロパティ.name
294 }
295 }
296 name_for_property <N + 1 >(ptr, std::get<N + 1 >(ps)) を返します。
297 }
298 }
299 template <auto ptr>
300 constexpr 制約 チャート * name_for_property () const {
301 return name_for_property< 0 >(ptr, std::get 0 >(ps)) を返します。
302 }
303 テンプレート< typename T>
304 constexpr 制約 チャート * name_for_property (T ptr) const {
305 return name_for_property< 0 >(ptr, std::get 0 >(ps)) を返します。
306 }
307 private :
308 ObjectType m_object_type = ObjectType::None
309 };
310 }
311 テンプレート< auto Ptr, bool IsPrimaryKey =false>
312 静的 constexpr 自動プロパティ( const char * name)
313 {
315 }
316
317 テンプレート< typename ...T>
318 静的 constexpr 自動スキーマ( const char * name,
319 T &... プロパティ){{
320 自動tup = internal::作成_サブスクライブ_tune(props...)
321 auto i = std::get<0>(tup);
322 Clients = typename Decltype (i)::Class を使用し 、
323 スキーマを返すには以下を行います。
324 }
325
326 テンプレート< typename ...T>
327 静的 constexpr 自動スキーマ( const char * name,
328<T...>
329 auto i = std::get<0>(props);
330 Clients = typename Decltype (i)::Class を使用し 、
331 スキーマを返す:::schema[Cls, T...>(name, std::move(props))]
332 }
333
334 テンプレート< typename ...T>
335 静的 constexpr 自動スキーマ( const char * name,
336 ObjectType object_type,
337<T...>
338 auto i = std::get<0>(props);
339 Clients = typename Decltype (i)::Class を使用し 、
340 スキーマを返すには、::schema<Cls, T...>(name, object_type, std::move(props)) を返します。
341 }
342 }
343
344#endif /* CPPrealM_SCHEMA_HPP */
定義: object_schema.happ: 33
定義: properties.happ: 33
定義: type_info.happ: 70
定義: type_info.happ: 62
定義: type_info.happ: 54
Definition: obj.hpp:62
定義: Managed_primary_key.happ:30
定義: schema.happ: 70
定義: schema.happ: 136
定義: schema.happ: 122