Realm C++ SDK Versão C++ v2.2.0

accessors.hpp

1
2//
3// Autores 2024 Realm Inc.
4//
5// Licenciado sob a Licença Apache, Versão 2.0 (a "Licença");
6// você não pode usar este arquivo, exceto em conformidade com a Licença.
7// Você pode obter uma cópia da Licença em
8//
9// http://www.apache.org/license/LICENSE-2.0
10//
11// A menos que exigido pela lei aplicável ou acordado por escrito, o software
12// distribuído sob a Licença é distribuído "Como está",
13// sem garantias ou condições de qualquer tipo, Express ou implícitas.
14// Consulte a Licença para obter as permissões específicas de domínio do idioma e
15// limitações da Licença.
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 <cprealm/internal/bridge/realm.hpp>
25#include <cprealm/internal/bridge/table.hpp>
26#include <cprealm/types.hpp>
27
28namespace Realm {
29 modelo<nome do tipo>
30 primary_key da estrutura ;
31
32 template <typename T, typename = null>
33 estrutura, estrutura accessor {
34 estático in-line conjunto vazio (interno::ponte::obj& obj,
37 valor const de T&);
38 };
39
40 modelo <>
41 estrutura, estrutura acessador<int64_t> {
42 estático in-line conjunto vazio (interno::ponte::obj& obj,
45 const int64_t& valor) {
46 obj.set(chave, valor);
47 }
48 };
49 modelo <>
50 estrutura, estrutura accessor<std::optional<int64_t>> {
51 estático in-line conjunto vazio (interno::ponte::obj& obj,
54 const std::opcional<int64_t>valor) {
55 se (valor) {
56 obj.set(key, *value);
57 } mais {
58 obj.set_null(key);
59 }
60 }
61 };
62 modelo <>
63 estrutura, estrutura accessor<double> {
64 estático in-line conjunto vazio (interno::ponte::obj& obj,
67 const valor duploe valor) {
68 obj.set(chave, valor);
69 }
70 };
71 modelo <>
72 estrutura, estrutura accessor<std::optional<double>> {
73 estático in-line conjunto vazio (interno::ponte::obj& obj,
76 const std::opcional<double>&) {
77 se (valor) {
78 obj.set(key, *value);
79 } mais {
80 obj.set_null(key);
81 }
82 }
83 };
84 modelo <>
85 estrutura, estrutura accessor<bool> {
86 estático in-line conjunto vazio (interno::ponte::obj& obj,
89 const bool& value) {
90 obj.set(chave, valor);
91 }
92 };
93 modelo <>
94 estrutura, estrutura accessor<std::optional<bool>> {
95 estático in-line conjunto vazio (interno::ponte::obj& obj,
98 const std::opcional<bool>& valor) {
99 se (valor) {
100 obj.set(key, *value);
101 } mais {
102 obj.set_null(key);
103 }
104 }
105 };
106
107
108 modelo <typename T>
109 estrutura, estrutura accessor<T, std::enable_if_t<std::is_enum_v<T>>> {
110 estático in-line conjunto vazio (interno::ponte::obj& obj,
111 const internal::bridge::col_key& key,
113 valor T& const ) {
114 obj.set(key, static_cast<int64_t>(valor));
115 }
116 };
117 modelo <typename T>
118 estrutura, estrutura accessor<T, std::enable_if_t<std::conjunction_v<internal::type_info::is_optional<T>, std::is_enum<typename T::value_type>>>> {
119 estático in-line conjunto vazio (interno::ponte::obj& obj,
120 const internal::bridge::col_key& key,
122 valor T& const ) {
123 se (valor) {
124 obj.set(key, static_cast <int64_t>(*value));
125 } mais {
126 obj.set_null(key);
127 }
128 }
129 };
130
131 modelo <typename T>
132 estrutura, estrutura accessor<T, std::enable_if_t<internal::type_info::MixedPersistableConcept<T>::value>> {
133 estático in-line conjunto vazio (interno::ponte::obj& obj,
134 const internal::bridge::col_key& key,
136 valor T& const ) {
137 obj.set(key, serialize(value));
138 }
139 };
140
141
142 modelo <>
143 estrutura, estrutura accessor<uuid> {
144 estático in-line conjunto vazio (interno::ponte::obj& obj,
145 const internal::bridge::col_key& key,
147 const uuid& value) {
148 obj.set(chave, valor);
149 }
150 };
151 modelo <>
152 estrutura, estrutura accessor<std::optional<uuid>> {
153 estático in-line conjunto vazio (interno::ponte::obj& obj,
154 const internal::bridge::col_key& key,
156 const std::opcional<uuid>valor) {
157 se (valor) {
158 obj.set(key, *value);
159 } mais {
160 obj.set_null(key);
161 }
162 }
163 };
164 modelo <>
165 estrutura, estrutura accessor<object_id> {
166 estático in-line conjunto vazio (interno::ponte::obj& obj,
167 const internal::bridge::col_key& key,
169 const object_ide valor) {
170 obj.set(chave, valor);
171 }
172 };
173 modelo <>
174 estrutura, estrutura acessador<std::opcional<object_id>> {
175 estático in-line conjunto vazio (interno::ponte::obj& obj,
176 const internal::bridge::col_key& key,
178 const std::opcional<object_id>& valor) {
179 se (valor) {
180 obj.set(key, *value);
181 } mais {
182 obj.set_null(key);
183 }
184 }
185 };
186
187 modelo <>
188 estrutura, estrutura acessante<decimal128> {
189 estático in-line conjunto vazio (interno::ponte::obj& obj,
190 const internal::bridge::col_key& key,
192 const decimal128e valor) {
193 obj.set(chave, valor);
194 }
195 };
196 modelo <>
197 estrutura, estrutura acessante<std::opcional <decimal128>> {
198 estático in-line conjunto vazio (interno::ponte::obj& obj,
199 const internal::bridge::col_key& key,
201 const std::opcional <decimal128>& valor) {
202 se (valor) {
203 obj.set(key, *value);
204 } mais {
205 obj.set_null(key);
206 }
207 }
208 };
209
210 modelo <>
211 estrutura, estrutura acessador<std::chrono::time_point<std::chrono::system_clock>> {
212 estático in-line conjunto vazio (interno::ponte::obj& obj,
213 const internal::bridge::col_key& key,
215 const std::chrono::time_point<std::chrono::system_clock>valor) {
216 obj.set(chave, valor);
217 }
218 };
219 modelo <>
220 estrutura, estrutura accessor<std::optional<std::chrono::time_point<std::chrono::system_clock>>> {
221 estático in-line conjunto vazio (interno::ponte::obj& obj,
222 const internal::bridge::col_key& key,
224 const std::opcional<std::chrono::time_point<std::chrono::system_clock>>valor) {
225 se (valor) {
226 obj.set(key, *value);
227 } mais {
228 obj.set_null(key);
229 }
230 }
231 };
232
233 modelo <>
234 estrutura, estrutura accessor<std::string> {
235 estático in-line conjunto vazio (interno::ponte::obj& obj,
236 const internal::bridge::col_key& key,
238 const std::string& valor) {
239 obj.set(chave, valor);
240 }
241 };
242 modelo <>
243 estrutura, estrutura accessor<std::opcional<std::string>> {
244 estático in-line conjunto vazio (interno::ponte::obj& obj,
245 const internal::bridge::col_key& key,
247 const std::opcional<std::string>& valor) {
248 se (valor) {
249 obj.set(key, *value);
250 } mais {
251 obj.set_null(key);
252 }
253 }
254 };
255
256 modelo <>
257 estrutura, estrutura accessor<std::vector<uint8_t>> {
258 estático in-line conjunto vazio (interno::ponte::obj& obj,
259 const internal::bridge::col_key& key,
261 const std::vector<uint8_t>valor) {
262 obj.set(chave, valor);
263 }
264 };
265 modelo <>
266 estrutura, estrutura accessor<std::opcional <std::vector <uint8_t>>> {
267 estático in-line conjunto vazio (interno::ponte::obj& obj,
268 const internal::bridge::col_key& key,
270 const std::opcional <std::vector <uint8_t>> valor) {
271 se (valor) {
272 obj.set(key, *value);
273 } mais {
274 obj.set_null(key);
275 }
276 }
277 };
278 modelo <typename T>
279 estrutura, estrutura accessor<std::vector<T>> {
280 estático in-line conjunto vazio (interno::ponte::obj& obj,
281 const internal::bridge::col_key& key,
283 const std::vetor<T>valor) {
284 obj.set_list_values(key, value);
285 }
286 };
287 modelo <typename T>
288 estrutura, estrutura accessor<std::vector<T*>> {
289 estático in-line conjunto vazio (interno::ponte::obj& obj,
290 const internal::bridge::col_key& key,
291 const internal::bridge:: Realm& Realm,
292 const std::vector<T*>valor) {
293 auto list = obj.get_linklist(key);
294 for (size_t i = 0; i < value.size(); i++) {
295 auto& lnk = valor[i];
296 se (!lnk) {
297 continuar;
298 }
299 auto table = obj.get_target_table(key);
301 se constexpr (managed<T, null>::schema.HasPrimaryKeyProperty) {
302 auto pk = (*lnk).*(managed<T, null>::schema.primary_key().ptr);
303 m_obj = table.create_object_with_primary_key(Realm::internal::bridge::mixed(serialize(pk.value)));
304 } outra forma se (managed<T, null>::schema.is_embedded()) {
305 m_obj = list.create_and_insert_linked_object(i);
306 } mais {
307 m_obj = table.create_object();
308 }
309 std::apply([&m_obj, &lnk, &realm](auto && ...p) {
310 (acessador<typename std::decay_t<decltype(p)>::Result>::set(
311 m_obj, m_obj.get_table().get_column_key(p.name), domínio,
312 (*lnk).*(std::decay_t<decltype(p)>::ptr)), ...);
314 se (!managed<T, null>::schema.is_embedded()) {
315 list.add(m_obj.get_key());
316 }
317 }
318 }
319 };
320 modelo <typename T>
321 estrutura, estrutura accessor<std::set<T>> {
322 estático in-line conjunto vazio (interno::ponte::obj& obj,
323 const internal::bridge::col_key& key,
324 const internal::bridge:: Realm& Realm,
325 const std::set<T>& valor) {
326 auto set = realm::internal::bridge::set(realm, obj, key);
327 for (const auto& v : valor) {
328 set.insert(serialize(v));
329 }
330 }
331 };
332 modelo <typename T>
333 estrutura, estrutura accessor<std::set<T*>> {
334 estático in-line conjunto vazio (interno::ponte::obj& obj,
335 const internal::bridge::col_key& key,
336 const internal::bridge:: Realm& Realm,
337 const std::set<T*>& valor) {
338 auto set = realm::internal::bridge::set(realm, obj, key);
339 para (const auto& lnk : valor) {
340 se (!lnk) {
341 continuar;
342 }
343 auto table = obj.get_target_table(key);
345 se constexpr (managed<T, null>::schema.HasPrimaryKeyProperty) {
346 auto pk = (*lnk).*(managed<T, null>::schema.primary_key().ptr);
347 m_obj = table.create_object_with_primary_key(Realm::internal::bridge::mixed(serialize(pk.value)));
348 } mais {
349 m_obj = table.create_object();
350 }
351 std::apply([&m_obj, &lnk, &realm](auto && ...p) {
352 (acessador<typename std::decay_t<decltype(p)>::Result>::set(
353 m_obj, m_obj.get_table().get_column_key(p.name), domínio,
354 (*lnk).*(std::decay_t<decltype(p)>::ptr)), ...);
356 se (!managed<T, null>::schema.is_embedded()) {
357 set.insert(m_obj.get_key());
358 }
359 }
360 }
361 };
362 modelo <typename T>
363 estrutura, estrutura accessor<std::map<std::string, T>> {
364 estático conjunto vazio (interno::ponte::obj& obj,
365 const internal::bridge::col_key& key,
367 const std::map<std::string, T>& valor) {
368 auto d = obj.get_ dictionary(key);
369 para (auto& [k, v] : valor) {
370 se constexpr (internal::type_info::MixedPersistableConcept<T>::value) {
371 d.insert(k, std::visit([](auto&& arg) {
372 usando M = typename internal::type_info::type_info<std::decay_t<decltype(arg)>>::internal_type;
373 Método internal::bridge::mixed(M(arg));
374 }, v));
375 } mais {
377 se constexpr (std::is_enum_v<typename T::value_type>) {
378 se (v) {
379 d.insert(k, static_cast<nome do<typename T::value_type> tipo std::sublying_type::tipo>(*v));
380 } mais {
381 d.insert(k, internal::bridge::mixed());
382 }
383 } mais {
385 d.insert(k, U(v));
386 }
387 } mais {
389 d.insert(k, U(v));
390 }
391 }
392 }
393 }
394 };
395 modelo <typename T>
396 estrutura, estrutura accessor<std::map<std::string, T*>> {
397 estático conjunto vazio (interno::ponte::obj& obj,
398 const internal::bridge::col_key& key,
399 const internal::bridge:: Realm& Realm,
400 const std::map<std::string, T*>& valor) {
401 auto d = obj.get_ dictionary(key);
402 para (auto& [k, v] : valor) {
403 se (v) {
405 se constexpr (managed<T, null>::schema.HasPrimaryKeyProperty) {
406 auto pk = (*v).*(managed<T, null>::schema.primary_key().ptr);
407 m_obj = d.create_and_insert_linked_object(k, pk.value);
408 } mais {
409 m_obj = d.create_and_insert_linked_object(k);
410 }
411 std::apply([&m_obj, &realm, o = *v](auto && ...p) {
412 (acessador<typename std::decay_t<decltype(p)>::Result>::set(
413 m_obj, m_obj.get_table().get_column_key(p.name), domínio,
414 o.*(std::decay_t<decltype(p)>::ptr)), ...);
416 d.insert(k, m_obj.get_key());
417 } mais {
418 d.insert(k, internal::bridge::mixed());
419 }
420 }
421 }
422 };
423 //Marca: - link do acessador
424
425 modelo <typename T>
426 estrutura, estrutura accessor<T*> {
427 estático in-line conjunto vazio (interno::ponte::obj& obj,
428 const internal::bridge::col_key& key,
429 const internal::bridge:: Realm& Realm,
430 valor const T*) {
431 se (!value) {
432 retornar;
433 }
434 auto table = obj.get_target_table(key);
436 se constexpr (managed<T, null>::schema.HasPrimaryKeyProperty) {
437 auto pk = (*value).*(managed<T, null>::schema.primary_key().ptr);
438 m_obj = table.create_object_with_primary_key(Realm::internal::bridge::mixed(serialize(pk.value)));
439 obj.set(key, m_obj.get_key());
440 } outra forma se (managed<T, null>::schema.is_embedded()) {
441 m_obj = obj.create_and_set_linked_object(key);
442 } mais {
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 (acessador<typename std::decay_t<decltype(p)>::Result>::set(
448 m_obj, m_obj.get_table().get_column_key(p.name), domínio,
449 (*value).*(std::decay_t<decltype(p)>::ptr)), ...);
451 }
452 };
453
454 template <auto T>
455 estrutura, estrutura accessor<linking_objects<T>> {
456 estático in-line conjunto vazio (const interno::ponte::obj&,
459 const linking_objects<T>&) {
460 }
461 };
462 //Marca: - chave primária do acessador
463 modelo <typename T>
464 estrutura, estrutura accessor<primary_key<T>> {
465 estático in-line conjunto vazio (interno::ponte::obj& obj,
466 const internal::bridge::col_key& key,
468 const primary_key<T>e valor) {
469 se constexpr (std::is_enum_v<T>) {
470 obj.set(key, static_cast<int64_t>(value.value));
471 } mais {
472 obj.set(key, value.value);
473 }
474 }
475 };
476} // realm
477#endif//CPPrealm_ACCESSORS_HPP
478
Definição: accessors.hpp:33
Definição: tipos.hpp:75
Definição: col_key.hpp:28
Definição: misto.hpp:69
Definição: obj.hpp:123
Definição: realm.hpp:67
Definição: set.hpp:48
Definição: type_info.hpp:45
Definição: results.hpp:419
Definição: obj.hpp:62
Definição: tipos.hpp:56
Definição: managed_primary_key.hpp:30
Definição: tipos.hpp:35