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

link.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_BRIDGE_LINK_HPP
20#define CPPREALM_BRIDGE_Link_HPP
21
22#include <cprealm/accessors.hpp>
23#include <cprealm/macros.hpp>
24#include <cprealm/rbool.hpp>
25
26#include <cpprealm/internal/type_info.hpp>
27
28namespace Realm {
29 modelo <typename, typename>
30 estrutura managed;
31
32 modelo<typename T>
33 estrutura, estrutura managed<T*> : managed_base {
34 T* detach() const {
35 T* v = novo T();
36 managed<T> m(m_obj->is_null(m_key) ? *m_obj : m_obj->get_linked_object(m_key), *m_realm);
37 auto assign = [&m, &v](auto& emparelh) {
38 (*v).*(std::decay_t<decltype(pair.first)>::ptr) = (m.*(pair.second)).detach();
39 };
40 auto zipped = internal::zip_tuples(managed<T>::schema.ps, managed<T>::managed_pointers());
41 std::apply([&v, &m, &assign](auto && ...pair) {
42 (assign(par), ...);
43 }, compactado);
44 return v;
45 }
46
47 estruturado ref_type {
48 ref_type explícito (managed<T>&& value) : m_managed(std::move(value)) { }
49 const managed<T>* operador ->() const {
50 retornar &m_managed;
51 }
52 managed<T>* operador ->() {
53 retornar &m_managed;
54 }
55
56 const managed<T>& operator *() const {
57 return m_managed;
58 }
59 managed<T>& operator *() {
60 return m_managed;
61 }
62
63 bool operator ==(const managed<T*>& rhs) const {
64 if (This->m_managed.m_realm != *rhs.m_realm) {
65 Método false;
66 }
67 return this->m_managed.m_obj.get_key() == rhs.m_obj->get_key();
68 }
69 bool operator ==(const managed<T>& rhs) const {
70 if (This->m_managed.m_realm != rhs.m_realm) {
71 Método false;
72 }
73 return this->m_managed.m_obj.get_table() == rhs.m_obj.get_table() &&
74 isto->m_managed.m_obj.get_key() == rhs.m_obj.get_key();
75 }
76 bool operator ==(const ref_type& rhs) const {
77 se (This->m_managed.m_realm != rhs.m_managed.m_realm) {
78 Método false;
79 }
80 return this->m_managed.m_obj.get_table() == rhs.m_managed.m_obj.get_table() &&
81 isto->m_managed.m_obj.get_key() == rhs.m_managed.m_obj.get_key();
82 }
83 operador de bool !=(const managed<T*>e rhs) const {
84 return !This->operator==(rhs);
85 }
86 operador de bool !=(const managed<T>& rhs) const {
87 return !This->operator==(rhs);
88 }
89 operador de bool !=(const ref_type& rhs) const {
90 return !This->operator==(rhs);
91 }
92 privado:
93 managed<T> m_managed;
94 };
95 operador ref_type ->() const {
96 if (This->query) {
97 esta->m_rbool_query->add_link_chain(m_key);
98 return ref_type(managed<T>::prepare_for_query(*m_realm, this->m_rbool_query));
99 }
100 return ref_type(managed<T>(m_obj->get_linked_object(m_key), *m_realm));
101 }
102 operador bool() const {
103 if (m_obj && m_key) {
104 return !m_obj->is_null(m_key);
105 }
106 Método false;
107 }
108 managed &operator=(const managed<T>& obj) {
109 m_obj->set(m_key, obj.m_obj.get_key());
110 devolva *isto;
111 }
112 managed &operator=(const managed<T*> &obj) {
113 m_obj->set(m_key, obj.m_obj->get_key());
114 devolva *isto;
115 }
116 managed &operator=(std::nullptr_t) {
117 m_obj->set_null(m_key);
118 devolva *isto;
119 }
120 managed &operator=(T* o) {
121 auto table = m_realm->table_for_object_type(managed<T>::schema.name);
122 internal::bridge::obj obj;
123 if (!o) {
124 m_obj->set_null(m_key);
125 devolva *isto;
126 } outra forma se constexpr (managed<T>::schema.HasPrimaryKeyProperty) {
127 auto pk = (*o).*(managed<T>::schema.primary_key().ptr);
128 obj = table.create_object_with_primary_key(realm::internal::bridge::mixed(serialize(pk.value)));
129 m_obj->set(m_key, obj.get_key());
130 } mais se (gerenciado<T>::schema.is_embedded()) {
131 obj = m_obj->create_and_set_linked_object(m_key);
132 } mais {
133 obj = table.create_object();
134 m_obj->set(m_key, obj.get_key());
135 }
136
137 std::apply([&obj, &o, Realm = *m_realm](auto && ...p) {
138 (acessador <typename std::decay_t <decltype(p)>::Result>::set(
139 obj, obj.get_table().get_column_key(p.name), Realm, (*o).*(std::decay_t<decltype(p)>::ptr)
140 ), ...);
141 }, managed<T>::schema.ps);
142 devolva *isto;
143 }
144
145 operador de rbool ==(std::nullptr_t) const {
146 if (m_rbool_query) {
147 return m_rbool_query->link_equal(m_key, std::nullopt);
148 }
149 return !m_obj->get_linked_object(m_key).is_valid();
150 }
151 rbool operator ==(const managed<T>& rhs) const {
152 if (m_rbool_query) {
153 return m_rbool_query->link_equal(m_key, rhs.m_obj);
154 }
155 se (*This->m_realm != rhs.m_realm)
156 Método false;
157 return m_obj->get_linked_object(m_key).get_key() == rhs.m_obj.get_key();
158 }
159
160 rbool operator ==(const managed<T*>& rhs) const {
161 if (m_rbool_query) {
162 return m_rbool_query->link_equal(m_key, *rhs.m_obj);
163 }
164 se (*This->m_realm != *rhs.m_realm)
165 Método false;
166 return m_obj->get_linked_object(m_key).get_key() == rhs.m_obj->get_key();
167 }
168
169 operador de rbool !=(std::nullptr_t) const {
170 if (m_rbool_query) {
171 return m_rbool_query->link_not_equal(m_key, std::nullopt);
172 }
173 return m_obj->get_linked_object(m_key).is_valid();
174 }
175 operador rbool !=(const managed<T>& rhs) const {
176 if (m_rbool_query) {
177 return m_rbool_query->link_not_equal(m_key, rhs.m_obj);
178 }
179 return m_obj->get_linked_object(m_key).is_valid();
180 }
181
182 operador rbool !=(const managed<T*>& rhs) const {
183 if (m_rbool_query) {
184 return m_rbool_query->link_not_equal(m_key, *rhs.m_obj);
185 }
186 return m_obj->get_linked_object(m_key).is_valid();
187 }
188
189 privado:
190 managed<T*>() = default;
191 modelo<typename, typename>
192 amigo estrutura managed;
193 };
194} //namespace realm
195#endif //CPPrealm_bridge_link_HPP
Definição: misto.hpp:69
Definição: link.hpp:33
Definição: macros.hpp:286
Definição: obj.hpp:62