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

observa.hpp

1
2//
3// Autores 2022 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_OBSERVATION_HPP
20#define CPPREALM_OBSERVATION_HPP
21
22#include <cprealm/internal/bridge/list.hpp>
23#include <cpprealm/internal/bridge/obj.hpp>
24#include <cpprealm/internal/bridge/ objeto.hpp>
25#include <cprealm/internal/bridge/realm.hpp>
26#include <cprealm/macros.hpp>
27
28#include <cprealm/internal/bridge/table.hpp>
29#include <cprealm/internal/bridge/thread_safe_reference.hpp>
30
31#include <iostream>
32#include <variant>
33
34namespace Realm {
35
36 modelo<typename T>
37 estrutura, estrutura object_change {
38 utilizando subjacente = T;
40 const T *objeto;
42 bool is_deleted = false;
50 erro std::Exception_ptr ;
54 std::vector<PropertyChange<T>> Property_changes;
55 };
56
57 modelo<typename T>
59 object_change_callback_wrapper(std::function < null (object_change < T > )> &&b,
60 const T *obj,
61 std::shared_ptr<internal::bridge::object> internal_object)
62 : block(std::move(b)), object(*obj), m_object(internal_object) {
63 estático_cast <vazio>(obj);
64 }
65 std::function <void(object_change<T>)> bloco;
66 objetoconst T ;
67 std::shared_ptr<internal::bridge::object> m_object;
68
69 std::opcional <std::vector<std::string>> Property_names = std::nullopt;
70 std::opcional <std::vector <typename decltype(T::schema)::variant_t>> old_values = std::nullopt;
71 bool delete = false;
72
73 vazio preenchimento_properties(interno::bridge::collection_change_set const &c) {
74 se (property_names) {
75 retornar;
76 }
77 if (!c.deletions().empty()) {
78 excluído = true;
79 retornar;
80 }
81 se (c.columns().empty() {
82 retornar;
83 }
84
85 propriedades automáticas = std::vector<std::string>();
86 auto table = m_object->get_obj().get_table();
87
88 for (auto i = 0; i < std::tuple_size<decltype(T::schema.properties)>{}; i++) {
89 se (c.columns().count(table.get_column_key(T::schema.names[i]).value())) {
90 propriedades.push_back(T::schema.names[i]);
91 }
92 }
93
94 se (!properties.empty()) {
95 Property_names = propriedades;
96 }
97 }
98
99 std::opcional<std::vector<typename decltype(T::schema)::variant_t>>
100 read_values(internal::bridge::collection_change_set const &c) {
101 if (c.empty()) {
102 return std::nullopt;
103 }
104 preenchimento_properties(c);
105 se (!property_names) {
106 return std::nullopt;
107 }
108
109 std::vector< nomedo tipo decltype (T::schema):: variant_t > valores;
110 para (auto &name: *property_names) {
111 valor automático = T::schema.property_value_for_name(nome, objeto, verdadeiro);
112 valores.push_back(value);
113 }
114 valores de retorno ;
115 }
116
117 vazio antes(interno::bridge::collection_change_set const &c) substituir {
118 valores_antigos = valores_de leitura(c);
119 }
120
121 vazio após(interno::bridge::collection_change_set const &c) substituir {
122 auto new_values = read_values(c);
123 se (excluído) {
124 forward_change(nullptr, { }, { }, { }, nullptr);
125 } mais se (new_values) {
126 forward_change(&objeto,
127 *property_names,
128 valores_antigos ? *old_values : std::vector<typename decltype(T::schema)::variant_t>{},
129 *new_values,
130 nullptr);
131 }
132 Nomes_de Propriedades = std::nulopt;
133 valores_antigos = std::nulopt;
134 }
135
136 erro nulo (std::exceção_ptr err) {
137 forward_change(nullptr, { }, { } , { } , err);
138 }
139
140 forward_change (const T *ptr,
141 std::vector<std::string> Property_names,
142 std::vector<typename decltype(T::schema)::variant_t> old_values,
143 std::vector<typename decltype(T::schema)::variant_t> new_values,
144 const std::exException_ptr &error) {
145 se (!ptr) {
146 se (erro) {
147 auto oc= object_change<T>();
148 oc.error = erro;
149 block(std::forward<realm::object_change<T>>(std::move(oc)));
150 } mais {
151 auto oc= object_change<T>();
152 oc.is_deleted = true;
153 block(std::forward<realm::object_change<T>>(std::move(oc)));
154 }
155 } mais {
156 std::vector<PropertyChange<T>> Property_changes;
157 for (size_t i = 0; i < Property_names.size(); i++) {
158 PropertyChange<T> propriedade;
159 propriedade.nome = Property_names[i];
160 se (!old_values.empty()) {
161 propriedade.old_value = valores_antigos[i];
162 }
163 se (!new_values.empty()) {
164 propriedade.new_value = new_values[i];
165 }
166 Property_changes.push_back(std::move(property));
167 }
168 auto oc= object_change<T>();
169 oc.object = ptr;
170 oc.property_changes = Property_changes;
171 block(std::forward<realm::object_change<T>>(std::move(oc)));
172 }
173 }
174 };
175
176 estrutura, estrutura collection_change {
177 std::vector<uint64_t> exclusões;
178 std::vector<uint64_t> inserções;
179 std::vector<uint64_t> modificações;
180
181 // Este sinalizador indica se o objeto subjacente que é a origem desta
182 // a collection foi excluída. Isso se aplica a listas, dicionários e conjuntos.
183 // Isso permite que os notificadores relatem uma alteração nas coleções vazias que foram excluídas.
184 bool collection_root_was_deleted = false;
185
186 [[nodiscard]] bool empty() const noexceto {
187 return deleteries.empty() && inserts.empty() && modified.empty() &&
188 !collection_root_was_deleted;
189 }
190 };
191
193 std::function<void(collection_change)> manipulador;
194 bool ignoreChangesInInitialNotification;
195
196 collection_callback_wrapper(std::function <null(collection_change) > manipulador,
197 bool ignoreChangesInInitialNotification)
198 : handler(handler)
199 , ignoreChangesInitialNotification(ignoreChangesInInitialNotification)
200 {}
201
202
203 anulado antes(const Realm::internal::bridge::collection_change_set &) final {}
204 null after(internal::bridge::collection_change_set const& change) final {
205 se (ignoreChangesInInitialNotification) {
206 ignoreChangesInInitialNotification = false;
207 manipulador({{});
208 }
209 mais se (changes.empty()) {
210 manipulador({{});
211
212 }
213 mais se (!changes.collection_root_was_deleted() || !changes.deletions().empty() {
214 manipulador({to_vector(changes.deletions()),
215 to_vector(changes.insertions()),
216 to_vector(changes.modifications()),
217 });
218 }
219 }
220
221 privado:
222 std::vector<uint64_t> to_vector(const internal::bridge::index_set& index_set) {
223 auto vector = std::vector<uint64_t>();
224 para ( índice automático : index_set.as_indexes()) {
225 vector.push_back(index);
226 }
227 vetor de retorno ;
228 };
229 };
230}
231
232
233modelo <typename T>
234inline std::ostream& operator<< (std::ostream& stream, const realm::object_change<T>& object)
235{
236 stream < "{\n";
237 stream << "\tis_deleted: " << object.is_deleted << "\n";
238 stream << "\tchange_to: " << object.property.name << "\n";
239 se (objeto. propriedade.old_value) {
240 stream < "\told_value: ";
241 std::visit([&stream](auto&& arg) {
242 usando M = std::decay_t<decltype(arg)>;
243 stream <<static_cast<M>(arg);
244 }, *objeto. propriedade.old_value);
245 }
246 se (objeto. propriedade.new_value) {
247 stream << "\tnew_value: ";
248 std::visit([&stream](auto&& arg) {
249 usando M = std::decay_t<decltype(arg)>;
250 stream <<static_cast<M>(arg);
251 }, *object.property.new_value);
252 }
253 stream < " "\n}";
254 fluxo de retorno ;
255}
256
257#endif //CPPrealm_OBSERVATION_HPP
Definição: notificações.hpp:80
std::string name
Definição: notificações.hpp:84
Definição: observação.hpp:192
Definição: observação.hpp:176
Definição: object.hpp:63
Definição: observação.hpp:58
Definição: observação.hpp:37
bool is_deleted
O objeto foi excluído do Realm.
Definição: observação.hpp:42
std::vector < PropertyChange< T > > Property_changes
Definição: observação.hpp:54
objeto constante T *
O objeto que está sendo observado.
Definição: observação.hpp:40
std::exception_ptr error
Definição: observação.hpp:50
Definição: flex_sync.hpp:37