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

managed_set.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_MANAGED_SET_HPP
20#define CPPREALM_MANAGED_SET_HPP
21
22#include <cprealm/macros.hpp>
23#include <cprealm/notifications.hpp>
24#include <cprealm/observation.hpp>
25#include <cprealm/types.hpp>
26
27#include <set>
28
29namespace Realm {
30
31 modelo<typename T>
32 estrutura, estrutura managed<std::set<T>, std::enable_if_t<internal::type_info::is_primitive<T>::value>> : managed_base {
33 Usando managed<std::set<T>>::managed_base::operator=;
34 usando value_type = T;
35
36 iterador de classe {
37 público:
38 usando value_type = T;
39
40 usando change_type = std::ptrdiff_t;
41 usando o ponteiro = T*;
42 usando a referência = T&;
43 usando iterador_category = std::forward_itizer_tag;
44
45 operador bool !=( iterador const & outro) const
46 {
47 return !(*isto == outro);
48 }
49
50 bool operator==( iterador const & outro) const
51 {
52 return (m_principal == outro.m_principal) && (m_i == outro.m_i);
53 }
54
55 Operador T*() const noexceto
56 {
57 auto s = Realm::internal::bridge::set(*m_parent->m_realm, *m_parent->m_obj, m_parent->m_key);
58 return desserialize<T>(s.get_any(m_i));
59 }
60
61 iterador e operador++()
62 {
63 esta->m_i++;
64 devolva *isto;
65 }
66
67 const iterador e operador++(int i)
68 {
69 esta->m_i += i;
70 devolva *isto;
71 }
72 privado:
73 modelo<typename, typename>
74 amigo estrutura, estrutura managed;
75
76 iterador(size_t i, managed<std::set<T>>* pai)
77 : m_i(i), m_parent(parent)
78 {
79 }
80 size_t m_i;
81 managed<std::set<T>>* m_parent;
82 };
83 iterador begin()
84 {
85 retorna o iterador(0, este);
86 }
87
88 end() do iterador
89 {
90 return iterador(tamanho(), este);
91 }
92 [[nodiscard]] std::set<T> detach() const {
93 auto set = Realm::internal::bridge::set(*m_realm, *m_obj, m_key);
94 auto ret = std::set<T>();
95 para(size_t i = 0; i < set.size(); i++) {
96 ret.insert(deserialize<T>(set.get_any(i)));
97 }
98 retornar ret;
99 }
100
101 Realm::notification_token observe(std::function<void(Realm::collection)>&& fn) {
102 auto set = std::make_shared<realm::internal::bridge::set>(*m_realm, *m_obj, m_key);
103 realm::notification_token token = set->add_notification_callback(
104 std::make_shared<realm::collection_callback_wrapper>(
105 std::move(fn),
106 false));
107 token.m_realm = *m_realm;
108 token.m_set = set;
109 token de devolução ;
110 }
111
112 anular o (a) iterador const & it)
113 {
114 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
115 set.remove(serialize(*it));
116 }
117
118 std::pair<iterator, bool> insert(const T& v)
119 {
120 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
121 se constexpr (internal::type_info::MixedPersistableConcept<T>::value) {
122 std::pair<size_t, bool> res = set.insert(serialize<T>(v));
123 return std::pair<iterator, bool>(iterator(res.first, esta), res.second);
124 } mais {
125 std::pair<size_t, bool> res = set.insert(v);
126 return std::pair<iterator, bool>(iterator(res.first, esta), res.second);
127 }
128 }
129
130 inserção do iterador( iterador const &, const T& v)
131 {
132 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
133 std::pair<size_t, bool> res = set.insert(v);
134 return iterador(res.first, este);
135 }
136
137 iterador find(const T& v)
138 {
139 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
140 size_t idx = set.find(serialize(v));
141 se (idx == Realm::not_in_collection)
142 return iterador(tamanho(), este);
143 return iterador(idx, este);
144 }
145 empty clear() {
146 internal::bridge::set(*m_realm, *m_obj, m_key).remove_all();
147 }
148
149 tamanho_t tamanho()
150 {
151 return initial::bridge::set(*m_realm, *m_obj, m_key).size();
152 }
153
154 privado:
155 managed() = padrão;
156 managed(const managed&) = delete;
157 managed(managed &&) = excluir;
158 managed& operator=(const managed&) = excluir;
159 managed& operator=(managed&&) = excluir;
160 modelo<typename, typename>
161 amigo estrutura managed;
162 };
163
164 modelo<typename T>
165 estrutura, estrutura managed<std::set<T*>> : managed_base {
166 Usando managed<std::set<T*>>::managed_base::operator=;
167 Usando value_type = managed<T>;
168
169 iterador de classe {
170 público:
171 Usando value_type = managed<T>;
172
173 usando change_type = std::ptrdiff_t;
174 usando o ponteiro = T*;
175 usando a referência = T&;
176 usando iterador_category = std::forward_itizer_tag;
177
178 operador bool !=( iterador const & outro) const
179 {
180 return !(*isto == outro);
181 }
182
183 bool operator==( iterador const & outro) const
184 {
185 return (m_principal == outro.m_principal) && (m_i == outro.m_i);
186 }
187
188 managed<T> operator*() const noexceto
189 {
190 auto s = Realm::internal::bridge::set(*m_parent->m_realm, *m_parent->m_obj, m_parent->m_key);
191 managed<T> m(s.get_obj(m_i), *m_parent->m_realm);
192 return {std::move(m)};
193 }
194
195 iterador e operador++()
196 {
197 esta->m_i++;
198 devolva *isto;
199 }
200
201 const iterador e operador++(int i)
202 {
203 esta->m_i += i;
204 devolva *isto;
205 }
206 privado:
207 modelo<typename, typename>
208 amigo estrutura, estrutura managed;
209
210 iterador(size_t i, managed<std::set<T*>>* pai)
211 : m_i(i), m_parent(parent)
212 {
213 }
214 size_t m_i;
215 managed<std::set<T*>>* m_parent;
216 };
217 iterador begin()
218 {
219 retorna o iterador(0, este);
220 }
221
222 end() do iterador
223 {
224 return iterador(tamanho(), este);
225 }
226 [[nodiscard]] std::set<T*> detach() const {
227 auto s = Realm::internal::bridge::set(*m_realm, *m_obj, m_key);
228 contagem size_t = s.size();
229 se (count == 0)
230 return std::set<T*>();
231 auto ret = std::set<T*>();
232 para(size_t i = 0; i < contagem; i++) {
233 managed<T> m(s.get_obj(i), *m_realm);
234 T* v = novo T();
235 auto assign = [&m, &v](auto& emparelh) {
236 (*v).*(std::decay_t<decltype(pair.first)>::ptr) = (m.*(pair.second)).detach();
237 };
238 auto zipped = internal::zip_tuples(managed<T>::schema.ps, managed<T>::managed_pointers());
239 std::apply([&v, &m, &assign](auto && ...pair) {
240 (assign(par), ...);
241 }, compactado);
242
243 ret.insert(v);
244 }
245 retornar ret;
246 }
247
248 Realm::notification_token observe(std::function<void(Realm::collection)>&& fn) {
249 auto set = std::make_shared<realm::internal::bridge::set>(*m_realm, *m_obj, m_key);
250 realm::notification_token token = set->add_notification_callback(
251 std::make_shared<realm::collection_callback_wrapper>(
252 std::move(fn),
253 false));
254 token.m_realm = *m_realm;
255 token.m_set = set;
256 token de devolução ;
257 }
258
259 anular o (a) iterador const & it)
260 {
261 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
262 set.remove(it.operator*().m_obj.get_key());
263 }
264
265 std::pair<iterator, bool> insert(T* value)
266 {
267 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
268 auto table = m_obj->get_target_table(m_key);
269 internal::bridge::obj m_obj;
270 se constexpr (managed<T>::schema.HasPrimaryKeyProperty) {
271 auto pk = (*value).*(managed<T>::schema.primary_key().ptr);
272 m_obj = table.create_object_with_primary_key(Realm::internal::bridge::mixed(serialize(pk.value)));
273 } mais {
274 m_obj = table.create_object();
275 }
276 std::apply([&m_obj, &value, Realm = *m_realm](auto && ...p) {
277 (acessador <typename std::decay_t <decltype(p)>::Result>::set(
278 m_obj, m_obj.get_table().get_column_key(p.name), domínio,
279 (*value).*(std::decay_t<decltype(p)>::ptr)), ...);
280 }, managed<T, null>::schema.ps);
281 se (!managed<T>::schema.is_embedded()) {
282 set.insert(m_obj.get_key());
283 }
284 std::pair<size_t, bool> res = set.insert(m_obj.get_key());
285 return std::pair<iterator, bool>(iterator(res.first, esta), res.second);
286 }
287
288 inserção do iterador( iterador const &, valor T*)
289 {
290 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
291 auto table = m_obj->get_target_table(m_key);
292 internal::bridge::obj m_obj;
293 se constexpr (managed<T>::schema.HasPrimaryKeyProperty) {
294 auto pk = (*value).*(managed<T>::schema.primary_key().ptr);
295 m_obj = table.create_object_with_primary_key(Realm::internal::bridge::mixed(serialize(pk.value)));
296 } mais {
297 m_obj = table.create_object();
298 }
299 std::apply([&m_obj, &value, Realm = *m_realm](auto && ...p) {
300 (acessador <typename std::decay_t <decltype(p)>::Result>::set(
301 m_obj, m_obj.get_table().get_column_key(p.name), domínio,
302 (*value).*(std::decay_t<decltype(p)>::ptr)), ...);
303 }, managed<T, null>::schema.ps);
304 std::pair<size_t, bool> res = set.insert(m_obj.get_key());
305 return iterador(res.first, este);
306 }
307
308 std::pair<iterator, bool> insert(const managed<T>& value)
309 {
310 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
311 std::pair<size_t, bool> res = set.insert(value.m_obj.get_key());
312 return std::pair<iterator, bool>(iterator(res.first, esta), res.second);
313
314 }
315
316 inserção do iterador(const iterador&, const gerenciado<T>& valor)
317 {
318 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
319 std::pair<size_t, bool> res = set.insert(value.m_obj.get_key());
320 return iterador(res.first, este);
321 }
322
323 std::pair<iterator, bool> insert(const managed<T*>& value)
324 {
325 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
326 std::pair<size_t, bool> res = set.insert(value.m_obj.get_key());
327 return std::pair<iterator, bool>(iterator(res.first, esta), res.second);
328
329 }
330
331 inserção do iterador(const iterador&, const gerenciado<T*>& valor)
332 {
333 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
334 std::pair<size_t, bool> res = set.insert(value.m_obj.get_key());
335 return iterador(res.first, este);
336 }
337
338 iterador find(const managed<T>& v)
339 {
340 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
341 size_t idx = set.find(v.m_obj.get_key());
342 se (idx == Realm::not_in_collection)
343 return iterador(tamanho(), este);
344 return iterador(idx, este);
345 }
346
347 iterador find(const managed<T*>& v)
348 {
349 auto set = interno::bridge::set(*m_realm, *m_obj, m_key);
350 size_t idx = set.find(v.m_obj->get_key());
351 se (idx == Realm::not_in_collection)
352 return iterador(tamanho(), este);
353 return iterador(idx, este);
354 }
355 empty clear() {
356 internal::bridge::set(*m_realm, *m_obj, m_key).remove_all();
357 }
358
359 tamanho_t tamanho()
360 {
361 return initial::bridge::set(*m_realm, *m_obj, m_key).size();
362 }
363
364 privado:
365 managed() = padrão;
366 managed(const managed&) = delete;
367 managed(managed &&) = excluir;
368 managed& operator=(const managed&) = excluir;
369 managed& operator=(managed&&) = excluir;
370 modelo<typename, typename>
371 amigo estrutura managed;
372 };
373} // namespace realm
374
375#endif//CPREALM_MANAGED_SET_HPP
Definição: observação.hpp:176
Definição: misto.hpp:69
Definição: set.hpp:48
Definição: macros.hpp:286
Definição: obj.hpp:62
Definição: notificações.hpp:38