Realm C++ SDK版本 v 2.2.0

accessors.hpp

1
2//
3// 版权所有 2024 Realm Inc.
4//
5// 根据 Apache 许可证 2.0 版(“许可证”)获得许可;
6// 除非符合合规,否则不得使用此文件。
7// 您可以在以下网址获取许可证副本:
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// 除非适用法律要求或书面同意,否则软件
12// 根据许可证分发是按“原样”分发的,
13// 不提供任何类型的Express或暗示的保证或条件。
14// 请参阅管理权限的特定语言的许可证和
15// 许可证下的限制。
16//
18
19#ifndef CPPREALM_ACCESSORS_HPP
20#define CPPREALM_ACCESSORS_HPP
21
22#include <cpprealm/internal/bridge/lnklst.hpp>
23#include <cpprealm/internal/bridge/obj.hpp>
24#include <cpprealm/internal/bridge/realm.hpp>
25#include <cpprealm/internal/bridge/table.hpp>
26#include <cpprealm/types.hpp>
27
28命名空间域 {
29 template < typename >
30 struct primary_key;
31
32 template < typename T, typename = void >
33 struct accessor {
34 静态 内联 void set( Internal::bridge::obj & obj,
35 const Internal::bridge::col_key & key,
37 const T& value);
38 };
39
40 template <>
41 struct accessor <int 64 _t> {
42 静态 内联 void set( Internal::bridge::obj & obj,
43 const Internal::bridge::col_key & key,
45 const int 64 _t& value) {
46对象。 设立(key, value);
47 }
48 };
49 template <>
50 struct 访问器<std::Optional<int 64 _t>> {
51 静态 内联 void set( Internal::bridge::obj & obj,
52 const Internal::bridge::col_key & key,
54 const std::Optional<int 64 _t>& value) {
55 if (value) {
56 obj.set(key, *value);
57 } else {
58 obj.set_null(key);
59 }
60 }
61 };
62 template <>
63 struct accessor<double> {
64 静态 内联 void set( Internal::bridge::obj & obj,
65 const Internal::bridge::col_key & key,
67 const double & value) {
68对象。 设立(key, value);
69 }
70 };
71 template <>
72 struct accessor <std::Optional<double>> {
73 静态 内联 void set( Internal::bridge::obj & obj,
74 const Internal::bridge::col_key & key,
76 const std::Optional<double>& value) {
77 if (value) {
78 obj.set(key, *value);
79 } else {
80 obj.set_null(key);
81 }
82 }
83 };
84 template <>
85 struct accessor <bool> {
86 静态 内联 void set( Internal::bridge::obj & obj,
87 const Internal::bridge::col_key & key,
89 const bool & value) {
90对象。 设立(key, value);
91 }
92 };
93 template <>
94 struct accessor <std::Optional<bool>> {
95 静态 内联 void set( Internal::bridge::obj & obj,
96 const Internal::bridge::col_key & key,
98 const std::Optional<bool>& value) {
99 if (value) {
100 obj.set(key, *value);
101 } else {
102 obj.set_null(key);
103 }
104 }
105 };
106
107
108 template < typename T>
109 struct accessor <T, std::enable_if_t<std::is_enum_v<T>>> {
110 静态 内联 void set( Internal::bridge::obj & obj,
111 const Internal::bridge::col_key & key,
113 const T& value) {
114对象。 设立(key, static_cast< int 64 _t > (value));
115 }
116 };
117 template < typename T>
118 struct accessor <T, std::enable_if_t<std::conjunction_v<internal::type_info::is_Optional<T>, std::is_enum<typename T::value_type>>>> {
119 静态 内联 void set( Internal::bridge::obj & obj,
120 const Internal::bridge::col_key & key,
122 const T& value) {
123 if (value) {
124 obj.set(key, static_cast< int 64 _t > (*value));
125 } else {
126 obj.set_null(key);
127 }
128 }
129 };
130
131 template < typename T>
132 struct accessor <T, std::enable_if_t<internal::type_info::MixedPersistableConcept<T>::value>> {
133 静态 内联 void set( Internal::bridge::obj & obj,
134 const Internal::bridge::col_key & key,
136 const T& value) {
137对象。 设立(key,serialize(value));
138 }
139 };
140
141
142 template <>
143 struct accessor<uuid> {
144 静态 内联 void set( Internal::bridge::obj & obj,
145 const Internal::bridge::col_key & key,
147 const uuid& value) {
148对象。 设立(key, value);
149 }
150 };
151 template <>
152 struct accessor <std::Optional<uuid>> {
153 静态 内联 void set( Internal::bridge::obj & obj,
154 const Internal::bridge::col_key & key,
156 const std::Optional<uuid>& value) {
157 if (value) {
158 obj.set(key, *value);
159 } else {
160 obj.set_null(key);
161 }
162 }
163 };
164 template <>
165 struct accessor < object_id > {
166 静态 内联 void set( Internal::bridge::obj & obj,
167 const Internal::bridge::col_key & key,
169 const object_id & value) {
170对象。 设立(key, value);
171 }
172 };
173 template <>
174 struct accessor <std::Optional<object_id>> {
175 静态 内联 void set( Internal::bridge::obj & obj,
176 const Internal::bridge::col_key & key,
178 const std::Optional<object_id>& value) {
179 if (value) {
180 obj.set(key, *value);
181 } else {
182 obj.set_null(key);
183 }
184 }
185 };
186
187 template <>
189 静态 内联 void set( Internal::bridge::obj & obj,
190 const Internal::bridge::col_key & key,
192 const 十进制128和值){
193对象。 设立(key, value);
194 }
195 };
196 template <>
197 struct 访问器<std::Optional<decimal 128 >> {
198 静态 内联 void set( Internal::bridge::obj & obj,
199 const Internal::bridge::col_key & key,
201 const std::Optional<decimal 128 >& value) {
202 if (value) {
203 obj.set(key, *value);
204 } else {
205 obj.set_null(key);
206 }
207 }
208 };
209
210 template <>
211 struct accessor <std::chrono::time_point<std::chrono::system_clock>> {
212 静态 内联 void set( Internal::bridge::obj & obj,
213 const Internal::bridge::col_key & key,
215 const std::chrono::time_point<std::chrono::system_clock>& value) {
216对象。 设立(key, value);
217 }
218 };
219 template <>
220 struct accessor <std::Optional<std::chrono::time_point<std::chrono::system_clock>>> {
221 静态 内联 void set( Internal::bridge::obj & obj,
222 const Internal::bridge::col_key & key,
224 const std::Optional<std::chrono::time_point<std::chrono::system_clock>>& value) {
225 if (value) {
226 obj.set(key, *value);
227 } else {
228 obj.set_null(key);
229 }
230 }
231 };
232
233 template <>
234 struct accessor <std::string> {
235 静态 内联 void set( Internal::bridge::obj & obj,
236 const Internal::bridge::col_key & key,
238 const std::string& value) {
239对象。 设立(key, value);
240 }
241 };
242 template <>
243 struct accessor <std::Optional<std::string>> {
244 静态 内联 void set( Internal::bridge::obj & obj,
245 const Internal::bridge::col_key & key,
247 const std::Optional<std::string>& value) {
248 if (value) {
249 obj.set(key, *value);
250 } else {
251 obj.set_null(key);
252 }
253 }
254 };
255
256 template <>
257 struct 访问器<std::vector<uint 8 _t>> {
258 静态 内联 void set( Internal::bridge::obj & obj,
259 const Internal::bridge::col_key & key,
261 const std::vector<uint 8 _t>& value) {
262对象。 设立(key, value);
263 }
264 };
265 template <>
266 struct 访问器<std::Optional<std::vector<uint 8 _t>>> {
267 静态 内联 void set( Internal::bridge::obj & obj,
268 const Internal::bridge::col_key & key,
270 const std::Optional<std::vector<uint 8 _t>>& value) {
271 if (value) {
272 obj.set(key, *value);
273 } else {
274 obj.set_null(key);
275 }
276 }
277 };
278 template < typename T>
279 struct accessor <std::vector<T>> {
280 静态 内联 void set( Internal::bridge::obj & obj,
281 const Internal::bridge::col_key & key,
283 const std::vector<T>& value) {
284 obj.set_list_values(key, value);
285 }
286 };
287 template < typename T>
288 struct accessor <std::vector<T*>> {
289 静态 内联 void set( Internal::bridge::obj & obj,
290 const Internal::bridge::col_key & key,
291 const Internal::bridge:: 域和域,
292 const std::vector<T*>& value) {
293 auto list = obj.get_linklist(key);
294 for ( size_t i = 0 ; i < value.size(); i++) {
295 auto & lnk = value[i];
296 if (!lnk) {
297 继续;
298 }
299 auto tab = obj.get_target_table(key);
300 Internal::bridge::obj m_obj;
301 if constexpr ( 托管<T, void>:: 模式 .HasPrimaryKeyProperty) {
302 auto pk = (*lnk).*( 托管<T, void>:: 模式 .primary_key().ptr);
303 m_obj = Table.create_object_with_primary_key( 域::internal::bridge::mixed (serialize(pk.value)));
304 } else if ( 托管<T, void>:: 模式 .is_embedded()) {
305 m_obj = list.create_and_insert_linked_object(i);
306 } else {
307 m_obj = table.create_object();
308 }
309 std::apply([&m_obj, &lnk, &realm]( auto && ...p) {
310 ( accessor < typename std::decay_t< decltype (p)>::Result>::set(
311 m_obj, m_obj.get_table().get_column_key(p.name), Realm,
312 (*lnk).*(std::decay_t< decltype (p)>::ptr)), ...);
314 if (! 托管<T, void>:: 模式 .is_embedded()) {
315 list.add(m_obj.get_key());
316 }
317 }
318 }
319 };
320 template < typename T>
321 struct accessor <std::set<T>> {
322 静态 内联 void set( Internal::bridge::obj & obj,
323 const Internal::bridge::col_key & key,
324 const Internal::bridge:: 域和域,
325 const std::set<T>& value) {
326 auto set = realm::internal::bridge::set (realm, obj, key);
327 for ( const auto & v : value) {
328 设立.insert(serialize(v));
329 }
[330 ]
331 };
332 template < typename T>
333 struct accessor <std::set<T*>> {
334 静态 内联 void set( Internal::bridge::obj & obj,
335 const Internal::bridge::col_key & key,
336 const Internal::bridge:: 域和域,
337 const std::set<T*>& value) {
338 auto set = realm::internal::bridge::set (realm, obj, key);
339 for ( const auto & lnk : value) {
340 if (!lnk) {
341 继续;
342 }
343 auto tab = obj.get_target_table(key);
344 Internal::bridge::obj m_obj;
345 if constexpr ( 托管<T, void>:: 模式 .HasPrimaryKeyProperty) {
346 auto pk = (*lnk).*( 托管<T, void>:: 模式 .primary_key().ptr);
347 m_obj = Table.create_object_with_primary_key( 域::internal::bridge::mixed (serialize(pk.value)));
348 } else {
349 m_obj = table.create_object();
350 }
351 std::apply([&m_obj, &lnk, &realm]( auto && ...p) {
352 ( accessor < typename std::decay_t< decltype (p)>::Result>::set(
353 m_obj, m_obj.get_table().get_column_key(p.name), Realm,
354 (*lnk).*(std::decay_t< decltype (p)>::ptr)), ...);
356 if (! 托管<T, void>:: 模式 .is_embedded()) {
357 set.insert(m_obj.get_key());
358 }
359 }
360 }
361 };
362 template < typename T>
363 struct accessor <std::map<std::string, T>> {
364 静态 void set( Internal::bridge::obj & obj,
365 const Internal::bridge::col_key & key,
367 const std::map<std::string, T>& value) {
368 auto d = obj.get_dictionary(key);
369 for ( auto & [k, v] : value) {
370 if constexpr (internal::type_info::MixedPersistableConcept<T>::value) {
371 d.insert(k, std::visit([]( auto && arg) {
372 using M = typenameInternal ::type_info::type_info <std::decay_t< decltype (arg)>>::internal_type;
373 return Internal::bridge::Mixed (M(arg));
374 }, v));
375 } else {
377 if constexpr (std::is_enum_v<typename T::value_type>) {
378 if (v) {
379 d.insert(k, static_cast< typename std::underlying_type<typename T::value_type>::type > (*v));
380 } else {
381 d.insert(k, internal::bridge::mixed ());
382 }
383 } else {
384 using U = typenameInternal ::type_info::type_info<T, void>::internal_type
385 d.insert(k, U(v));
386 }
387 } else {
388 using U = typenameInternal ::type_info::type_info<T, void>::internal_type
389 d.insert(k, U(v));
390 }
391 }
392 }
393 }
394 };
395 template < typename T>
396 struct accessor <std::map<std::string, T*>> {
397 静态 void set( Internal::bridge::obj & obj,
398 const Internal::bridge::col_key & key,
399 const Internal::bridge:: 域和域,
400 const std::map<std::string, T*>& value) {
401 auto d = obj.get_dictionary(key);
402 for ( auto & [k, v] : value) {
403 if (v) {
404 Internal::bridge::obj m_obj;
405 if constexpr ( 托管<T, void>:: 模式 .HasPrimaryKeyProperty) {
406 auto pk = (*v).*( 托管<T, void>:: 模式 .primary_key().ptr);
407 m_obj = d.create_and_insert_linked_object(k, pk.value);
408 } else {
409 m_obj = d.create_and_insert_linked_object(k);
410 }
411 std:: 应用([&m_obj, &realm, o = *v]( auto && ...p) {
412 ( accessor < typename std::decay_t< decltype (p)>::Result>::set(
413 m_obj, m_obj.get_table().get_column_key(p.name), Realm,
414 o.*(std::decay_t< decltype (p)>::ptr)), ...);
416 d.insert(k, m_obj.get_key());
417 } else {
418 d.insert(k, internal::bridge::mixed ());
419 }
第 420
421 }
422 };
第 423 章 // MARK:-accessor 链接
424
第 425 章 template < typename T>
426 struct accessor<T*> {
第 427 章 静态 内联 void set( Internal::bridge::obj & obj,
428 const Internal::bridge::col_key & key,
429 const Internal::bridge:: 域和域,
430 const T* value) {
第 431 章 if (!value) {
第 432 章 return ;
433 }
第 434 章 auto tab = obj.get_target_table(key);
第 435 章 Internal::bridge::obj m_obj;
第 436 章 if constexpr ( 托管<T, void>:: 模式 .HasPrimaryKeyProperty) {
第 437 章 auto pk = (*value).*( 托管<T, void>:: 模式 .primary_key().ptr);
438 m_obj = Table.create_object_with_primary_key( 域::internal::bridge::mixed (serialize(pk.value)));
439 obj.set(key, m_obj.get_key());
440 } else if ( 托管<T, void>:: 模式 .is_embedded()) {
441 m_obj = obj.create_and_set_linked_object(key);
442 } else {
443 m_obj = table.create_object();
444 obj.set(key, m_obj.get_key());
445 }
446 std::apply([&m_obj, &realm, &value]( auto && ...p) {
447 ( accessor < typename std::decay_t< decltype (p)>::Result>::set(
448 m_obj, m_obj.get_table().get_column_key(p.name), Realm,
449 (*value).*(std::decay_t< decltype (p)>::ptr)), ...);
451 }
452 };
453
第 454 章 template <auto T>
455 struct accessor < linking_objects <T>> {
第 456 章 静态 内联 void 设立( const inside ::bridge::obj &,
第 457 章 const Internal::bridge::col_key &,
第 458 章 const Internal::bridge:: 域 &,
第 459 章 const Linking_objects<T> &) {
460 }
461 };
第 462 章 // MARK: - 访问器主键
第 463 章 template < typename T>
第 465 章 静态 内联 void set( Internal::bridge::obj & obj,
第 466 章 const Internal::bridge::col_key & key,
第 467 章 const Internal::bridge:: 域 &,
468 const primary_key<T> & value) {
469 if constexpr (std::is_enum_v<T>) {
470 obj.set(key, static_cast< int 64 _t > (value.value));
471 } else {
472 obj.set(key, value.value);
473 }
474 }
475 };
476} // realm
477#endif//CPREALM_ACCESSORS_HPP
478
定义: accessors.hpp:33
定义: types.hpp: 75
定义: col_key.hpp: 28
定义: mixed.hpp:69
定义: obj.hpp:123
定义: realm.hpp: 67
定义: set.hpp: 48
定义: type_info.hpp: 45
定义: results.hpp: 419
定义: obj.hpp:62
定义: types.hpp:56
定义: managed_primary_key.hpp:30
定义: types.hpp:35