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

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