Realm C++ SDK 버전 v2.2.0

results.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 CPPRALM_RESULTS_HPP
20#define CPPREALM_RESULTS_HPP
21
22#include <cpprealm/internal/bridge/mixed.hpp>
23#include <cpprealm/internal/bridge/ 쿼리.hpp>
24#include <cpprealm/internal/bridge/results.hpp>
25#include <cpprealm/internal/bridge/table.hpp>
26#include <cpprealm/macros.hpp>
27#include <cpprealm/notifications.hpp>
28#include <cpprealm/schema.hpp>
29#include <cpprealm/rbool.hpp>
30
31네임스페이스 영역 {
32 struct mutable_sync_subscription_set;
33}
34
35네임스페이스 영역 {
36
37 sort_descriptor 사용 = internal::bridge::sort_descriptor;
38
39 템플릿<typename>
40 구조체 결과
41 템플릿<typename T, typename 파생, typename ShouldEnable= oid >
42 구조체 results_base;
43 템플릿<typename T, typename 파생>
44 구조체 results_common_base;
45
46 템플릿<typename T, typename 파생>
49 : m_parent(parent) {
50 }
51 구조체 결과_변경 {
52 파생 * 컬렉션;
53 std::vector<uint64_t> 삭제;
54 std::vector<uint64_t> 삽입;
55 std::vector<uint64_t> 수정;
56
57 // 이 플래그는 다음의 소스인 기본 객체가
58 // 컬렉션이 삭제되었습니다. 이는 목록, 사전 및 세트에 적용됩니다.
59 // 이를 통해 알리미는 삭제된 빈 컬렉션에 대한 변경 사항을 보고할 수 있습니다.
60 bool collection_root_was_deleted = false;
61
62 [[nodiscard]] bool empty() const noException {
63 반환 deletes.empty() && inserts.empty() && Modifys.empty() &&
64 !collection_root_was_deleted;
65 }
66 };
67
68 size_t size() {
69 return m_parent.size();
70 }
71
72 가상 ~results_common_base() = 기본값;
73 파생 where(const std::string &query, const std::vector<realm::mixed>& arguments) {
74 std::vector<internal::bridge::mixed> mixed_args;
75 for(auto& a : 인수)
76 mixed_args.push_back(serialize(a));
77 return 파생(internal::bridge::results(m_parent.get_realm(),
78 m_parent.get_table(). 쿼리(쿼리, std::move(mixed_args)))));
79 }
80
81 파생 where(std::function<rbool(managed<T>&)>&& fn) {
82 static_assert(sizeof(managed<T>), "Must explain schema for T");
83 auto realm = m_parent.get_realm();
84 auto schema = realm.schema().find(managed<T>::schema.name);
85 자동 그룹 = 영역.read_group();
86 auto table_ref = group.get_table(schema.table_key());
87 rbool query = rbool(internal::bridge::query(table_ref));
88 auto query_object = managed<T>::prepare_for_query(realm, &query);
89 auto full_query = fn(query_object).q;
90 return Derived(internal::bridge::results(m_parent.get_realm(), full_query));
91 }
92
94 명시적 results_callback_wrapper(std::function<oid(results_change)>&& fn,
95 파생 *c,
96 bool ignore_initial_notification = true)
97 : m_handler(std::move(fn)),
98 컬렉션(c),
99 m_ignore_changes_in_initial_notification(ignore_initial_notification) {}
100
101 before (const realm::internal::bridge::collection_change_set&) 재정 의 {}
102
103 oid after(internal::bridge::collection_change_set const &changes) final {
104 if (m_ignore_changes_in_initial_notification) {
105 m_ignore_changes_in_initial_notification = false;
106 m_handler({collection, {}, {}, {}});
107 } if ( changes.empty ()) {
108 m_handler({collection, {}, {}, {}});
109 } 다른 경우 if (!changes.collection_root_was_deleted() || !changes.deletions().empty()) {
110 m_handler({
111 컬렉션,
112 to_vector(changes.deletions()),
113 to_vector(changes.insertions()),
114 to_vector(changes.modifications()),
115 }),
116 }
117 }
118
119 파생 * 컬렉션;
120
121 private:
122 std::function<oid(results_change)> m_handler;
123 bool m_ignore_changes_in_initial_notification;
124 std::vector<uint64_t> to_vector(const internal::bridge::index_set &index_set) {
125 자동 벡터 = std::vector<uint64_t>();
126 for (auto index: index_set.as_indexes()) {
127 vector.push_back(index);
128 }
129 벡터를 반환 합니다.
130 };
131 };
132
133 영역::notification_token 관찰(std::function<oid(results_change)>&& 처리기) {
134 auto r = std::make_shared<internal::bridge::results>(m_parent.get_realm(), m_parent.get_realm().table_for_object_type(managed<T>:: 스키마.name));
135 영역::notification_token token = r->add_notification_callback(std::make_shared<results_callback_wrapper>(std::move(handler), static_cast<파생*>(this)));
136 token.m_realm = r->get_realm();
137 token.m_results = r;
138 토큰을 반환 합니다.
139 }
140
141 파생된 동결() {
142 자동 동결 영역 = m_parent.get_realm().freeze();
143 return 파생(internal::bridge::results(frozen_realm,frozen_realm.table_for_object_type(managed<T>::schema.name)));
144 }
145
146 파생된 thaw() {
147 auto thawed_realm = m_parent.get_realm().thaw();
148 return Derived(internal::bridge::results(thawed_realm, thawed_realm.table_for_object_type(managed<T>:: 스키마.name)));
149 }
150
151 bool is_frozen() {
152 return m_parent.get_realm().is_frozen();
153 }
154
155 파생 정렬(const std::string& key_path, bool 오름차순) {
156 return 파생(m_parent.sort({{key_path, 오름차순}}));
157 }
158
159 파생 정렬(const std::vector<sort_descriptor>& sort_descriptors) {
160 return 파생(m_parent.sort(sort_descriptors));
161 }
162
163 보호됨:
164 internal::bridge::results m_parent;
165 템플릿 <auto> 친구 구조체 linking_objects;
166 };
167
168 템플릿<typename T>
169 using results_is_primitive = std::enable_if_t<!managed<T>::is_object && !std::is_enum_v<T> && !internal::type_info::is_variant_t<T>::value>;
170 템플릿<typename T>
171 using results_is_enum = std::enable_if_t<!managed<T>::is_object && std::is_enum_v<T> && !internal::type_info::is_variant_t<T>::value>;
172 템플릿<typename T>
173 results_is_mixed = std:: enable_if_t <! managed<T>::is_object && !std::is_enum_v<T> && internal::type_info::is_variant_t<T>::value>;
174
175 템플릿<typename T, typename 파생>
176 구조체 results_base<T, Derived, results_is_primitive<T>> : public results_common_base<T, Derived> {
177 명시적 results_base(internal::bridge::results &&parent)
178 : results_common_base<T, 파생>(std::move(parent)) {
179 }
180
181 T 연산자[](size_t 인덱스) {
182 if (index >= this->m_parent.size())
183 throw std::out_of_range("인덱스가 범위 를 벗어났습니다.");
184 return internal::bridge::get<T>(This->m_parent, index);
185 }
186
187 클래스 반복자 {
188 public:
189 차이 유형 사용 = size_t;
190 사용 value_type = T;
191 iterator_category = std::input_iterator_tag;
192
193 bool 연산자!=(const iterator & other) const {
194 return !(*this == other);
195 }
196
197 bool 연산자==(const iterator & other) const {
198 return (m_parent == other.m_parent) && (m_idx == other.m_idx);
199 }
200
201 value_type 연산자*() noException {
202 return m_parent->operator[](m_idx);
203 }
204
205 iterator &operator++() {
206 m_idx++;
207 return *this;
208 }
209
210 반복자 연산자++(int i) {
211 m_idx += i;
212 return *this;
213 }
214
215 명시적 반복기(size_t idx, 파생 *parent)
216 : m_idx(idx), m_parent(parent) {
217 }
218 private:
219 size_t m_idx;
220 파생 *m_parent;
221 };
222
223 반복자 begin() {
224 return iterator(0, static_cast<파생*>(this));
225 }
226
227 반복자 end() {
228 return iterator( this->m_parent.size(), static_cast<파생*>(this));
229 }
230 };
231
232 템플릿<typename T, typename 파생>
233 구조체 results_base<T, Derived, results_is_mixed<T>> : public results_common_base<T, Derived> {
234 명시적 results_base(internal::bridge::results &&parent)
235 : results_common_base<T, 파생>(std::move(parent)) {
236 }
237
238 T 연산자[](size_t 인덱스) {
239 if (index >= this->m_parent.size())
240 throw std::out_of_range("인덱스가 범위 를 벗어났습니다.");
241 return deserialize<T>(internal::bridge::get<internal::bridge::mixed>(This->m_parent, index));
242 }
243
244 // TODO: realm::mixed의 현재 impl에서는 관리되는 객체 유형을 허용하지 않습니다.
245 // 다음으로 래핑해야 하므로 반복자에서 액세스할 수 있습니다.
246 // managed<> 템플릿. 이러한 템플릿은 managed 역할을 하기 때문에 열 및 객체 키에 필요합니다.
247 // 객체의 속성을 사용하는 경우 이 사용 사례는 중단되었습니다. realm::mixed를 다음으로 대체하는 것이 가장 좋습니다.
248 // std::variant가 아니라 SDK에서 정의한 형식 안전 union이어야 합니다.
249 // realm::mixed는 관리되는 컨텍스트 자체를 가질 수 있습니다.
250 클래스 반복자 {
251 public:
252 차이 유형 사용 = size_t;
253 사용 value_type = T;
254 iterator_category = std::input_iterator_tag;
255
256 bool 연산자!=(const iterator & other) const {
257 return !(*this == other);
258 }
259
260 bool 연산자==(const iterator & other) const {
261 return (m_parent == other.m_parent) && (m_idx == other.m_idx);
262 }
263
264 value_type 연산자*() noException {
265 return m_parent->operator[](m_idx);
266 }
267
268 iterator &operator++() {
269 m_idx++;
270 return *this;
271 }
272
273 반복자 연산자++(int i) {
274 m_idx += i;
275 return *this;
276 }
277
278 명시적 반복기(size_t idx, 파생 *parent)
279 : m_idx(idx), m_parent(parent) {
280 }
281 private:
282 size_t m_idx;
283 파생 *m_parent;
284 };
285
286 반복자 begin() {
287 return iterator(0, static_cast<파생*>(this));
288 }
289
290 반복자 end() {
291 return iterator( this->m_parent.size(), static_cast<파생*>(this));
292 }
293 };
294
295 템플릿<typename T, typename 파생>
296 구조체 results_base<T, Derived, results_is_enum<T>> : public results_common_base<T, Derived> {
297 명시적 results_base(internal::bridge::results &&parent)
298 : results_common_base<T, 파생>(std::move(parent)) {
299 }
300
301 T 연산자[](size_t 인덱스) {
302 if (index >= this->m_parent.size())
303 throw std::out_of_range("인덱스가 범위 를 벗어났습니다.");
304 반환 static_cast<T>(internal::bridge::get<int64_t>(This->m_parent, index));
305 }
306
307 클래스 반복자 {
308 public:
309 차이 유형 사용 = size_t;
310 사용 value_type = T;
311 iterator_category = std::input_iterator_tag;
312
313 bool 연산자!=(const iterator & other) const {
314 return !(*this == other);
315 }
316
317 bool 연산자==(const iterator & other) const {
318 return (m_parent == other.m_parent) && (m_idx == other.m_idx);
319 }
320
321 value_type 연산자*() noException {
322 return m_parent->operator[](m_idx);
323 }
324
325 iterator &operator++() {
326 m_idx++;
327 return *this;
328 }
329
330 반복자 연산자++(int i) {
331 m_idx += i;
332 return *this;
333 }
334
335 명시적 반복기(size_t idx, 파생 *parent)
336 : m_idx(idx), m_parent(parent) {
337 }
338 private:
339 size_t m_idx;
340 파생 *m_parent;
341 };
342
343 반복자 begin() {
344 return iterator(0, static_cast<파생*>(this));
345 }
346
347 반복자 end() {
348 return iterator( this->m_parent.size(), static_cast<파생*>(this));
349 }
350 };
351
352 템플릿<typename T, typename 파생>
353 구조체 results_base<T, Derived, std::enable_if_t<managed<T>::is_object>> : public results_common_base<T, Derived> {
354 명시적 results_base(internal::bridge::results &&parent)
355 : results_common_base<T, 파생>(std::move(parent)) {
356 }
357
358 managed<T, 무효> 연산자[](size_t 인덱스) {
359 if (index >= this->m_parent.size())
360 throw std::out_of_range("인덱스가 범위 를 벗어났습니다.");
361 반환 managed<T, oid>(internal::bridge::get<internal::bridge::obj>(This->m_parent, index), this->m_parent.get_realm());
362 }
363
364 클래스 반복자 {
365 public:
366 차이 유형 사용 = size_t;
368 iterator_category = std::input_iterator_tag;
369
370 bool 연산자!=(const iterator & other) const {
371 return !(*this == other);
372 }
373
374 bool 연산자==(const iterator & other) const {
375 return (m_parent == other.m_parent) && (m_idx == other.m_idx);
376 }
377
378 value_type 연산자*() noException {
379 internal::bridge::obj obj = internal::bridge::get<internal::bridge::obj>(m_parent->m_parent, m_idx);
380 반환 managed<T, oid>(std::move(obj), this->m_parent->m_parent.get_realm());
381 }
382
383 iterator &operator++() {
384 m_idx++;
385 return *this;
386 }
387
388 반복자 연산자++(int i) {
389 m_idx += i;
390 return *this;
391 }
392
393 명시적 반복기(size_t idx, 파생 *parent)
394 : m_idx(idx), m_parent(parent) {
395 }
396 private:
397 size_t m_idx;
398 파생 *m_parent;
399 };
400
401 반복자 begin() {
402 return iterator(0, static_cast<파생*>(this));
403 }
404
405 반복자 end() {
406 return iterator( this->m_parent.size(), static_cast<파생*>(this));
407 }
408 };
409
410 템플릿<typename T>
411 구조체 결과 : 공개 결과_ 베이스<T, 결과<T>> {
412 사용 value_type = T;
413 명시적 결과(internal::bridge::results &&parent)
414 : results_base<T, results<T>>(std::move(parent)) {
415 }
416 };
417
418 템플릿 <auto ptr>
419 구조체 linking_objects {
420 static 인라인 자동 Ptr = Ptr;
422
423 static_assert(sizeof(managed<typename internal::ptr_type_extractor<ptr>::class_type>), "Type is not managed by the Realm");
424 };
425
426 템플릿 <auto ptr> struct managed<linking_objects<ptr>> : managed_base {
427 using iterator = typename results<typename internal::ptr_type_extractor<ptr>::class_type>::iterator;
429
431 return {};
432 }
433
434 반복자 begin() {
435 return iterator(0, get_results());
436 }
437
438 반복자 end() {
439 auto r = get_results();
440 return iterator(r.size(), r);
441 }
442
443 size_t size() {
444 return get_results().size();
445 }
446 managed<Class> 연산자[](size_t idx) {
447 return get_results()[idx];
448 }
449
450 private:
451 결과<Class> get_results() {
452 auto table = m_obj->get_table();
453 if (!table.is_valid(m_obj->get_key())) {
454 throw std::logic_error("객체가 삭제되었거나 무효화되었습니다.");
455 }
456
457 internal::bridge::obj* obj = m_obj;
458 auto schema = m_realm->schema().find(managed<Class>::schema.name);
459 auto linking_property = schema.property_for_name(managed<Class>::schema.template name_for_property<ptr>());
460 if (!linking_property.column_key()) {
461 throw std::logic_error("원점 속성에 대한 열 키가 잘못되었습니다.");
462 }
463
464 internal::bridge::results 결과(*m_realm, obj->get_backlink_view(m_realm->get_table(schema.table_key())), linking_property.column_key()));
465 return ::realm::results<Class>(std::move(results));
466 }
467 };
468}
469
470
471#endif //CPPREALM_RESULTS_HPP
정의: Results.hpp:46
정의: results.hpp:419
정의: 매크로.hpp:286
정의: obj.hpp:62
정의: 알림.hpp:38
정의: results.hpp:42
정의: results.hpp:47
정의: Results.hpp:411