Realm C++ SDK 버전 v2.2.0

관찰.hpp

1
2//
3//저작권 2022 Realm Inc.
4//
5// Apache 라이선스, 버전 2.0("라이선스")에 따라 라이선스가 부여됩니다.
6// 라이선스를 준수하는 경우를 제외하고는 이 파일을 사용할 수 없습니다.
7// 다음에서 라이선스 사본을 얻을 수 있습니다.
8//
9// http://www.apache.org/licences/LICENSE-2.0
10//
11// 관련 법률에서 요구하거나 문서로 동의하지 않는 한, 소프트웨어
12// 라이선스에 따라 배포되는 것은 '있는 그대로' 배포됩니다,
13// Express 묵시적이든 어떤 종류의 보증이나 조건도 제공하지 않습니다.
14// 권한을 관리하는 특정 언어에 대한 내용은 라이선스를 참조하세요.
15// 라이선스에 따른 제한 사항.
16//
18
19#ifndef CPPREALM_OBSERVATION_HPP
20#define CPPRALM_OBSERVATION_HPP
21
22#include <cpprealm/internal/bridge/list.hpp>
23#include <cpprealm/internal/bridge/obj.hpp>
24#include <cpprealm/internal/bridge/ 객체.hpp>
25#include <cpprealm/internal/bridge/realm.hpp>
26#include <cpprealm/macros.hpp>
27
28#include <cpprealm/internal/bridge/table.hpp>
29#include <cpprealm/internal/bridge/thread_safe_reference.hpp>
30
31#include <iostream>
32#include <variant>
33
34네임스페이스 영역 {
35
36 템플릿<typename T>
37 구조체 object_change {
38 기본 = T 를 사용 합니다.
40 const T *객체;
42 부울 is_deleted = false;
50 std:: exception_ptr 오류;
54 std::vector<PropertyChange<T>> Property_changes;
55 };
56
57 템플릿<typename T>
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 static_cast<void>(obj);
64 }
65 std::function< 무효(object_change<T>)> 차단;
66 const T 객체;
67 std::shared_ptr<internal::bridge::object> m_object;
68
69 std::optional<std::vector<std::string>> Property_names = std::nullopt;
70 std::optional<std::vector<typename decltype(T::schema)::variant_t>> old_values = std::nullopt;
71 bool Deleted = false;
72
73 ' { _
74 if (property_names) {
75 return;
76 }
77 if (!c.deletions().empty()) {
78 삭제됨 = true;
79 return;
80 }
81 if (c.columns().empty()) {
82 return;
83 }
84
85 자동 속성 = std::vector<std::string>();
86 자동 테이블 = m_object->get_obj().get_table();
87
88 for (auto i = 0; i < std::tuple_size<decltype(T:: 스키마.properties)>{}; i++) {
89 if (c.columns().count(table.get_column_key(T::schema.names[i]).value())) {
90 properties.push_back(T::schema.names[i]);
91 }
92 }
93
94 if (!properties.empty()) {
95 속성 이름 = 속성;
96 }
97 }
98
99 std::optional<std::vector<typename decltype(T:: 스키마)::variant_t>>
100 read_values(internal::bridge::collection_change_set const &c) {
101 if (c.empty()) {
102 return std::nullopt;
103 }
104 채우기_속성(c);
105 if (!property_names) {
106 return std::nullopt;
107 }
108
109 std::vector<typename decltype(T::schema)::variant_t> values;
110 for (auto &name: *property_names) {
111 자동 값 = T::schema.property_value_for_name(name, 객체, true);
112 values.push_back(value);
113 }
114 반환
115 }
116
117 before (internal::bridge::collection_change_set const &c) 재정의 {
118 old_values = read_values(c);
119 }
120
121 after (internal::bridge::collection_change_set const &c) 재정의 {
122 auto new_values = read_values(c);
123 if (deleted) {
124 forward_change(nullptr, {}, {}, {}, nullptr);
125 } if ( new_values ) {
126 forward_change(&객체,
127 *property_names,
128 old_values ? *old_values : std::vector<typename decltype(T::schema)::variant_t>{},
129 *new_values,
130 nullptr);
131 }
132 속성 이름 = std::nullopt;
133 old_values = std::nullopt;
134 }
135
136 무효 오류(std::Exception_ptr err) {
137 forward_change(nullptr, {}, {}, {}, err);
138 }
139
140 forward_change (const T *ptr,
141 std::vector<std::string> 속성 이름,
142 std::vector<typename decltype(T:: 스키마)::variant_t> old_values,
143 std::vector<typename decltype(T:: 스키마)::variant_t> new_values,
144 const std::Exception_ptr &error) {
145 if (!ptr) {
146 if (error) {
147 auto oc = object_change<T>();
148 oc.error = 오류;
149 block(std::forward<realm::object_change<T>>(std::move(oc)));
150 } 기타 {
151 auto oc = object_change<T>();
152 oc.is_deleted = true;
153 block(std::forward<realm::object_change<T>>(std::move(oc)));
154 }
155 } 기타 {
156 std::vector<PropertyChange<T>> Property_changes;
157 for (size_t i = 0; i < Property_names.size(); i++) {
158 PropertyChange<T> 속성;
159 속성.이름 = 속성 이름[i];
160 if (!old_values.empty()) {
161 속성.old_value = old_values[i];
162 }
163 if (!new_values.empty()) {
164 속성.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
177 std::vector<uint64_t> 삭제;
178 std::vector<uint64_t> 삽입;
179 std::vector<uint64_t> 수정;
180
181 // 이 플래그는 다음의 소스인 기본 객체가
182 // 컬렉션이 삭제되었습니다. 이는 목록, 사전 및 세트에 적용됩니다.
183 // 이를 통해 알리미는 삭제된 빈 컬렉션에 대한 변경 사항을 보고할 수 있습니다.
184 bool collection_root_was_deleted = false;
185
186 [[nodiscard]] bool empty() const noException {
187 반환 deletes.empty() && inserts.empty() && Modifys.empty() &&
188 !collection_root_was_deleted;
189 }
190 };
191
193 std::function< 무효(collection_change)> 핸들러;
194 bool ignoreChangesInInitialNotification;
195
196 collection_callback_wrapper(std::function<oid(collection_change)> 핸들러,
197 bool ignoreChangesInInitialNotification)
198 : handler(handler)
199 , ignoreChangesInInitialNotification(ignoreChangesInInitialNotification)
200 {}
201
202
203 oid before(const 영역::internal::bridge::collection_change_set &) final {}
204 oid after(internal::bridge::collection_change_set const& changes) final {
205 if (ignoreChangesInInitialNotification) {
206 ignoreChangesInInitialNotification = false;
207 핸들러({{},{},{}});
208 }
209 other if (changes.empty()) {
210 핸들러({{},{},{}});
211
212 }
213 other if (!changes.collection_root_was_deleted() || !changes.deletions().empty()) {
214 처리기({to_vector(changes.deletions()),
215 to_vector(changes.insertions()),
216 to_vector(changes.modifications()),
217 }),
218 }
219 }
220
221 private:
222 std::vector<uint64_t> to_vector(const internal::bridge::index_set& index_set) {
223 자동 벡터 = std::vector<uint64_t>();
224 for (auto index : index_set.as_indexes()) {
225 vector.push_back(index);
226 }
227 벡터를 반환 합니다.
228 };
229 };
230}
231
232
233템플릿 <typename T>
234인라인 std::ostream& operator<< (std::ostream& stream, const realm::object_change<T>& object)
235{
236 스트림 << "{\n";
237 스트림 << "\tis_deleted: " << 객체.is_deleted << "\n";
238 stream << "\tchange_to: " << object.property.name << "\n";
239 if (객체. 속성.old_value) {
240 스트림 << "\told_value: ";
241 std::visit([&stream](auto&& arg) {
242 using M = std::decay_t<decltype(arg)>;
243 스트림 << static_cast<M>(arg);
244 }, *객체. 속성.old_value);
245 }
246 if (객체. 속성.new_value) {
247 스트림 << "\tnew_value: ";
248 std::visit([&stream](auto&& arg) {
249 using M = std::decay_t<decltype(arg)>;
250 스트림 << static_cast<M>(arg);
251 }, *객체.property.new_value);
252 }
253 스트림 << "\n}";
254 반환 스트림;
255}
256
257#endif //CPPREALM_OBSERVATION_HPP
정의: 알림.hpp:80
std::문자열 이름
정의: 알림.hpp:84
정의: 관찰.hpp:176
정의: 관찰.hpp:37
bool is_deleted
객체가 Realm에서 삭제되었습니다.
정의: 관찰.hpp:42
std::vector< PropertyChange< T > > 속성 변경
정의: 관찰.hpp:54
const T * 객체
관찰 중인 객체입니다.
정의: 관찰.hpp:40
std::exception_ptr error
정의: 관찰.hpp:50
정의: flex_sync.hpp:37