Realm C++ SDK 버전 v2.2.0

accessors.hpp

1
2//
3//저작권 2024 Realm Inc.
4//
5// Apache 라이선스, 버전 2.0("라이선스")에 따라 라이선스가 부여됩니다.
6// 라이선스를 준수하는 경우를 제외하고는 이 파일을 사용할 수 없습니다.
7// 다음에서 라이선스 사본을 얻을 수 있습니다.
8//
9// http://www.apache.org/licences/LICENSE-2.0
10//
11// 관련 법률에서 요구하거나 문서로 동의하지 않는 한, 소프트웨어
12// 라이선스에 따라 배포되는 것은 '있는 그대로' 배포됩니다,
13// Express 묵시적이든 어떤 종류의 보증이나 조건도 제공하지 않습니다.
14// 권한을 관리하는 특정 언어에 대한 내용은 라이선스를 참조하세요.
15// 라이선스에 따른 제한 사항.
16//
18
19#ifndef CPPRALM_ACCESSORS_HPP
20#define CPPRALM_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 템플릿<typename>
30 struct primary_key;
31
32 템플릿 <typename T, typename = oid>
33 구조체 accessor {
34 static 인라인 oid set(internal::bridge::obj& obj,
37 const T& 값);
38 };
39
40 템플릿 <>
41 구조체 접근자 <int64_t> {
42 static 인라인 oid set(internal::bridge::obj& obj,
45 const int64_t& value) {
46 객체. (키, 값)을 설정하다 합니다.
47 }
48 };
49 템플릿 <>
50 구조체 접근자 <std::optional<int64_t>> {
51 static 인라인 oid set(internal::bridge::obj& obj,
54 const std::optional<int64_t>& value) {
55 if (value) {
56 obj.set(key, *value);
57 } 기타 {
58 obj.set_null(key);
59 }
60 }
61 };
62 템플릿 <>
63 구조체 accessor<double> {
64 static 인라인 oid set(internal::bridge::obj& obj,
67 const 더블& 값) {
68 객체. (키, 값)을 설정하다 합니다.
69 }
70 };
71 템플릿 <>
72 구조체 접근자 <std::optional<double>> {
73 static 인라인 oid set(internal::bridge::obj& obj,
76 const std::optional<double>& value) {
77 if (value) {
78 obj.set(key, *value);
79 } 기타 {
80 obj.set_null(key);
81 }
82 }
83 };
84 템플릿 <>
85 구조체 접근자<bool> {
86 static 인라인 oid set(internal::bridge::obj& obj,
89 const bool& value) {
90 객체. (키, 값)을 설정하다 합니다.
91 }
92 };
93 템플릿 <>
94 구조체 접근자 <std::optional<bool>> {
95 static 인라인 oid set(internal::bridge::obj& obj,
98 const std::optional<bool>& value) {
99 if (value) {
100 obj.set(key, *value);
101 } 기타 {
102 obj.set_null(key);
103 }
104 }
105 };
106
107
108 템플릿 <typename T>
109 구조체 접근자 <T, std::enable_if_t<std::is_enum_v<T>>> {
110 static 인라인 oid set(internal::bridge::obj& obj,
111 const internal::bridge::col_key& 키,
113 const T& 값) {
114 객체. 설정하다(key, static_cast<int64_t>(value));
115 }
116 };
117 템플릿 <typename T>
118 구조체 접근자 <T, std::enable_if_t<std::con Junction_v<internal::type_info::is_optional<T>, std::is_enum<typename T::value_type>>>>> {
119 static 인라인 oid set(internal::bridge::obj& obj,
120 const internal::bridge::col_key& 키,
122 const T& 값) {
123 if (value) {
124 obj.set(key, static_cast<int64_t>(*value));
125 } 기타 {
126 obj.set_null(key);
127 }
128 }
129 };
130
131 템플릿 <typename T>
132 구조체 접근자 <T, std::enable_if_t<internal::type_info::MixedPersistableConcept<T>::value>> {
133 static 인라인 oid set(internal::bridge::obj& obj,
134 const internal::bridge::col_key& 키,
136 const T& 값) {
137 객체. 설정하다(key, serialize(value));
138 }
139 };
140
141
142 템플릿 <>
143 구조체 accessor<uuid> {
144 static 인라인 oid set(internal::bridge::obj& obj,
145 const internal::bridge::col_key& 키,
147 const uuid& value) {
148 객체. (키, 값)을 설정하다 합니다.
149 }
150 };
151 템플릿 <>
152 구조체 접근자 <std::optional<uuid>> {
153 static 인라인 oid set(internal::bridge::obj& obj,
154 const internal::bridge::col_key& 키,
156 const std::optional<uuid>& value) {
157 if (value) {
158 obj.set(key, *value);
159 } 기타 {
160 obj.set_null(key);
161 }
162 }
163 };
164 템플릿 <>
165 구조체 접근자 <object_id> {
166 static 인라인 oid set(internal::bridge::obj& obj,
167 const internal::bridge::col_key& 키,
169 const object_id& value) {
170 객체. (키, 값)을 설정하다 합니다.
171 }
172 };
173 템플릿 <>
174 구조체 접근자 <std::optional<object_id>> {
175 static 인라인 oid set(internal::bridge::obj& obj,
176 const internal::bridge::col_key& 키,
178 const std::optional<object_id>& value) {
179 if (value) {
180 obj.set(key, *value);
181 } 기타 {
182 obj.set_null(key);
183 }
184 }
185 };
186
187 템플릿 <>
188 구조체 접근자 <십진수128> {
189 static 인라인 oid set(internal::bridge::obj& obj,
190 const internal::bridge::col_key& 키,
192 const 10진수128& 값) {
193 객체. (키, 값)을 설정하다 합니다.
194 }
195 };
196 템플릿 <>
197 구조체 접근자 <std::optional<decimal128>> {
198 static 인라인 oid set(internal::bridge::obj& obj,
199 const internal::bridge::col_key& 키,
201 const std::optional<decimal128>& value) {
202 if (value) {
203 obj.set(key, *value);
204 } 기타 {
205 obj.set_null(key);
206 }
207 }
208 };
209
210 템플릿 <>
211 구조체 접근자 <std::chrono::time_point<std::chrono::system_clock>> {
212 static 인라인 oid set(internal::bridge::obj& obj,
213 const internal::bridge::col_key& 키,
215 const std::chrono::time_point<std::chrono::system_clock>& value) {
216 객체. (키, 값)을 설정하다 합니다.
217 }
218 };
219 템플릿 <>
220 구조체 접근자 <std::optional<std::chrono::time_point<std::chrono::system_clock>>> {
221 static 인라인 oid set(internal::bridge::obj& obj,
222 const internal::bridge::col_key& 키,
224 const std::optional<std::chrono::time_point<std::chrono::system_clock>>& value) {
225 if (value) {
226 obj.set(key, *value);
227 } 기타 {
228 obj.set_null(key);
229 }
230 }
231 };
232
233 템플릿 <>
234 구조체 접근자<std::string> {
235 static 인라인 oid set(internal::bridge::obj& obj,
236 const internal::bridge::col_key& 키,
238 const std::string& value) {
239 객체. (키, 값)을 설정하다 합니다.
240 }
241 };
242 템플릿 <>
243 구조체 접근자 <std::optional<std::string>> {
244 static 인라인 oid set(internal::bridge::obj& obj,
245 const internal::bridge::col_key& 키,
247 const std::optional<std::string>& value) {
248 if (value) {
249 obj.set(key, *value);
250 } 기타 {
251 obj.set_null(key);
252 }
253 }
254 };
255
256 템플릿 <>
257 구조체 접근자 <std::vector<uint8_t>> {
258 static 인라인 oid set(internal::bridge::obj& obj,
259 const internal::bridge::col_key& 키,
261 const std::vector<uint8_t>& value) {
262 객체. (키, 값)을 설정하다 합니다.
263 }
264 };
265 템플릿 <>
266 구조체 접근자 <std::optional<std::vector<uint8_t>>> {
267 static 인라인 oid set(internal::bridge::obj& obj,
268 const internal::bridge::col_key& 키,
270 const std::optional<std::vector<uint8_t>>& value) {
271 if (value) {
272 obj.set(key, *value);
273 } 기타 {
274 obj.set_null(key);
275 }
276 }
277 };
278 템플릿 <typename T>
279 구조체 접근자 <std::vector<T>> {
280 static 인라인 oid set(internal::bridge::obj& obj,
281 const internal::bridge::col_key& 키,
283 const std::vector<T>& value) {
284 obj.set_list_values(key, value);
285 }
286 };
287 템플릿 <typename T>
288 구조체 접근자 <std::vector<T*>> {
289 static 인라인 oid set(internal::bridge::obj& obj,
290 const internal::bridge::col_key& 키,
291 const internal::bridge:: 영역& 영역,
292 const std::vector<T*>& value) {
293 자동 목록 = 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 자동 테이블 = obj.get_target_table(key);
301 만약 constexpr (managed<T, oid>:: 스키마.HasPrimaryKeyProperty) {
302 auto pk = (*lnk).*(managed<T, oid>:: 스키마.primary_key().ptr);
303 m_obj = table.create_object_with_primary_key(영역::internal::bridge::mixed(serialize(pk.value)));
304 } 다른 경우 if (managed<T, 무효>:: 스키마.is_embedded()) {
305 m_obj = list.create_and_insert_linking_object(i);
306 } 기타 {
307 m_obj = table.create_object();
308 }
309 std::apply([&m_obj, &lnk, &realm](auto && ...p) {
310 (접근자 <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 (!managed<T, oid>:: 스키마.is_embedded()) {
315 list.add(m_obj.get_key());
316 }
317 }
318 }
319 };
320 템플릿 <typename T>
321 구조체 접근자 <std::set<T>> {
322 static 인라인 oid set(internal::bridge::obj& obj,
323 const internal::bridge::col_key& 키,
324 const internal::bridge:: 영역& 영역,
325 const std::set<T>& value) {
326 auto set = realm::internal::bridge::set(realm, obj, 키);
327 for (const auto& v : value) {
328 설정하다.insert(serialize(v));
329 }
330 }
331 };
332 템플릿 <typename T>
333 구조체 접근자 <std::set<T*>> {
334 static 인라인 oid set(internal::bridge::obj& obj,
335 const internal::bridge::col_key& 키,
336 const internal::bridge:: 영역& 영역,
337 const std::set<T*>& value) {
338 auto set = realm::internal::bridge::set(realm, obj, 키);
339 for (const auto& lnk : value) {
340 if (!lnk) {
341 계속;
342 }
343 자동 테이블 = obj.get_target_table(key);
345 만약 constexpr (managed<T, oid>:: 스키마.HasPrimaryKeyProperty) {
346 auto pk = (*lnk).*(managed<T, oid>:: 스키마.primary_key().ptr);
347 m_obj = table.create_object_with_primary_key(영역::internal::bridge::mixed(serialize(pk.value)));
348 } 기타 {
349 m_obj = table.create_object();
350 }
351 std::apply([&m_obj, &lnk, &realm](auto && ...p) {
352 (접근자 <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 (!managed<T, oid>:: 스키마.is_embedded()) {
357 set.insert(m_obj.get_key());
358 }
359 }
360 }
361 };
362 템플릿 <typename T>
363 구조체 접근자 <std::map<std::string, T>> {
364 static oid set(internal::bridge::obj& obj,
365 const internal::bridge::col_key& 키,
367 const std::map<std::string, T>& value) {
368 auto d = obj.get_dictionary(key);
369 for (auto& [k, v] : value) {
370 만약 constexpr (internal::type_info::MixedPersistableConcept<T>::value) {
371 d.insert(k, std::visit([](auto&& arg) {
372 using M = typename internal::type_info::type_info<std::decay_t<decltype(arg)>>::internal_type;
373 반환 internal::bridge::mixed(M(arg));
374 }, v));
375 } 기타 {
377 만약 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 } 기타 {
381 d.insert(k, internal::bridge::mixed());
382 }
383 } 기타 {
385 d.insert(k, U(v));
386 }
387 } 기타 {
389 d.insert(k, U(v));
390 }
391 }
392 }
393 }
394 };
395 템플릿 <typename T>
396 구조체 접근자 <std::map<std::string, T*>> {
397 static oid set(internal::bridge::obj& obj,
398 const internal::bridge::col_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) {
405 만약 constexpr (managed<T, oid>:: 스키마.HasPrimaryKeyProperty) {
406 auto pk = (*v).*(managed<T, oid>:: 스키마.primary_key().ptr);
407 m_obj = d.create_and_insert_linking_object(k, pk.value);
408 } 기타 {
409 m_obj = d.create_and_insert_linking_object(k);
410 }
411 std:: 적용([&m_obj, &realm, o = *v](auto && ...p) {
412 (접근자 <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 } 기타 {
418 d.insert(k, internal::bridge::mixed());
419 }
420 }
421 }
422 };
423 // Mark: - 접근자 링크
424
425 템플릿 <typename T>
426 구조체 accessor<T*> {
427 static 인라인 oid set(internal::bridge::obj& obj,
428 const internal::bridge::col_key& 키,
429 const internal::bridge:: 영역& 영역,
430 const T* 값) {
431 if (!value) {
432 return;
433 }
434 자동 테이블 = obj.get_target_table(key);
436 만약 constexpr (managed<T, oid>:: 스키마.HasPrimaryKeyProperty) {
437 auto pk = (*value).*(managed<T, oid>:: 스키마.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 } 다른 경우 if (managed<T, 무효>:: 스키마.is_embedded()) {
441 m_obj = obj.create_and_set_linking_object(key);
442 } 기타 {
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 (접근자 <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 구조체 접근자 <linking_objects<T>> {
456 static 인라인 무효 설정하다(const internal::bridge::obj&,
459 const linking_objects<T>&) {
460 }
461 };
462 // Mark: - 접근자 기본 키
463 템플릿 <typename T>
464 구조체 접근자 <프라이머리 키<T>> {
465 static 인라인 oid set(internal::bridge::obj& obj,
466 const internal::bridge::col_key& 키,
468 const primary_key<T>& value) {
469 만약 constexpr (std::is_enum_v<T>) {
470 obj.set(key, static_cast<int64_t>(value.value));
471 } 기타 {
472 obj.set(key, value.value);
473 }
474 }
475 };
476} // realm
477#endif//CPPREALM_ACCESSORS_HPP
478
정의: accessors.hpp:33
정의: types.hpp:75
정의: col_key.hpp:28
정의: realm.hpp:67
정의: results.hpp:419
정의: obj.hpp:62
정의: types.hpp:56
정의: managed_primary_key.hpp:30
정의: types.hpp:35