Realm C++ SDK版本 v 2.2.0

Results.hpp

1
2//
3// 版权所有 2022 Realm Inc.
4//
5// 根据 Apache 许可证 2.0 版(“许可证”)获得许可;
6// 除非符合合规,否则不得使用此文件。
7// 您可以在以下网址获取许可证副本:
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// 除非适用法律要求或书面同意,否则软件
12// 根据许可证分发是按“原样”分发的,
13// 不提供任何类型的Express或暗示的保证或条件。
14// 请参阅管理权限的特定语言的许可证和
15// 许可证下的限制。
16//
18
19#ifndef CPPREALM_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 using sort_descriptor =Internal::bridge::sort_descriptor;
38
39 template < typename >
40 struct结果;
41 template < typename T, typename Derived, typename ShouldEnable = void >
42 struct Results_base
43 template < typename T, typename Derived>
44 struct Results_common_base ;
45
46 template < typename T, typename Derived>
49 : m_parent(parent) {
50 }
52派生 * 集合;
53 std::vector<uint 64 _t> deletes;
54 std::vector<uint 64 _t> 插入;
55 std::vector<uint 64 _t> 修改;
56
57 // 此标志指示作为此值来源的底层对象是否
58 // 集合已删除。 这适用于列表、字典和集合。
59 // 这使通知程序能够报告已删除的空集合的更改。
60 bool collection_root_was_deleted = false ;
61
62 [[nodiscard]] bool empty() const noException {
63 return deletements.empty() && inserts.empty() && Modifications.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 Derived 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 Derived( internal::bridge::results (m_parent.get_realm(),
78 m_parent.get_table()。查询(查询, std::move(mixed_args))));
79 }
80
81派生 where(std::function<rbool(托管<T>&)>&& fn) {
82 static_assert ( sizeof (managed<T>), "Must describe schema for T" );
83 auto realm = m_parent.get_realm();
84 auto schema = realm.schema().find(managed<T>::schema.name);
85 auto 群组 = 域.read_group();
86 autotable_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< void ( results_change )>&& fn,
95派生 *c,
96 boolignore_initial_notification = true )
97 : m_handler(std::move(fn)),
98集合(c)、
99 m_ignore_changes_in_initial_notification(ignore_initial_notification) {}
100
101 void before( const realm::internal::bridge::collection_change_set &) override {}
102
103 void 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 } else if (changes.empty()) {
108 m_handler({collection, {}, {}, {}});
109 } else 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<void(results_change)> m_handler ;
123 bool m_ignore_changes_in_initial_notification;
124 std::vector<uint 64 _t> to_vector( const inside ::bridge::index_set &index_set) {
125 auto vector = std::vector<uint 64 _t>();
126 for ( auto index:index_set.as_indexes()) {
127 vector.push_back(index);
128 }
129 返回向量;
130 };
131 };
132
133 域::notification_token Watch(std::function< void ( results_change )>&& handler) {
134 auto r = std::make_shared<internal::bridge::results>(m_parent.get_realm(), m_parent.get_realm().table_for_object_type( 托管<T>:: 模式 .name));
135 域::notification_token token = r->add_notification_callback(std::make_shared<results_callback_wrapper>(std::move(handler), static_cast< Derived* > ( this )));
136 token.m_realm = r->get_realm();
137 token.m_results = r;
138 返回令牌;
139 }
140
141派生的冻结 () {
142 autofred_realm = m_parent.get_realm().freeze();
143 return Derived( internal::bridge::results (frozen_realm,fred_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, thaw_realm.table_for_object_type(托管<T>:: 模式.name)));
149 }
150
151 bool is_frozen() {
152 return m_parent.get_realm().is_frozen();
153 }
154
155 Derived sort( const std::string& key_path, bool ascending) {
156 return Derived(m_parent.sort({{key_path, 升序}}));
157 }
158
159 Derived sort( const std::vector<sort_descriptor>& sort_descriptors) {
160 return Derived(m_parent.sort(sort_descriptors));
161 }
162
163 protected
164内部::桥::结果 m_parent;
165 template<auto> Friend struct Linking_objects ;
166 };
167
168 template < 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 template < 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 template < typename T>
173 using Results_is_mixed = std::enable_if_t<! 托管<T>::is_object && !std::is_enum_v<T> &&Internal::type_info::is_variant_t<T>::value>;
174
175 template < typename T, typename Derived>
176 struct 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, Derived> (std::move(parent)) {
179 }
180
181 T 操作符[]( size_t index) {
182 if (index >= this->m_parent.size())
183 throw std::out_of_range( "Index out of 范围." );
184 returninternal::bridge::get<T> (this-> m_parent , index);
185 }
186
187 迭代器 {
188 public :
189 using diff_type = size_t;
190 using value_type = T;
191 using iterator_category = std::input_iterator_tag;
192
193 bool操作符!=( const 迭代器 &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 Operator*() noException {
202 return m_parent->operator[](m_idx);
203 }
204
205迭代器 &operator++() {
206 m_idx++;
207 return * this ;
208 }
209
210迭代器 Operator++( int i) {
211 m_idx += i;
212 return * this ;
213 }
214
215 显式迭代器( size_t idx, Derived *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< Derived* > ( this ));
225 }
226
227迭代器 end() {
228 return iterator(this->m_parent.size(), static_cast< Derived* > ( this ));
229 }
230 };
231
232 template < typename T, typename Derived>
233 struct 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, Derived> (std::move(parent)) {
236 }
237
238 T 操作符[]( size_t index) {
239 if (index >= this->m_parent.size())
240 throw std::out_of_range( "Index out of 范围." );
241 return deserialize<T>(internal::bridge::get<internal::bridge::mixed>(this->m_parent, index));
242 }
243
244 // TODO: Realm::mixed 的当前实现不允许托管对象类型,
245 // 可从迭代器访问,因为需要将其包装在
246 //托管<> template。 由于这些模板需要 col 和 obj 键,因为它们充当托管
247 // 对象上的属性此用例已损坏。 理想情况下,我们应该将 realm::mixed 替换为
248 // 不是 std::variant,而是我们在 SDK 中定义的类型安全的联合,以便
249 // realm::mixed 本身可以有一个托管上下文。
250 迭代器 {
251 public :
252 using diff_type = size_t;
253 using value_type = T;
254 using iterator_category = std::input_iterator_tag;
255
256 bool操作符!=( const 迭代器 &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 Operator*() noException {
265 return m_parent->operator[](m_idx);
266 }
267
268迭代器 &operator++() {
269 m_idx++;
270 return * this ;
271 }
272
273迭代器 Operator++( int i) {
274 m_idx += i;
275 return * this ;
276 }
277
278 显式迭代器( size_t idx, Derived *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< Derived* > ( this ));
288 }
289
290迭代器 end() {
291 return iterator(this->m_parent.size(), static_cast< Derived* > ( this ));
292 }
293 };
294
295 template < typename T, typename Derived>
296 struct 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, Derived> (std::move(parent)) {
299 }
300
301 T 操作符[]( size_t index) {
302 if (index >= this->m_parent.size())
303 throw std::out_of_range( "Index out of 范围." );
304 return static_cast< T > (internal::bridge::get<int 64 _t>(this->m_parent, index));
305 }
306
307 迭代器 {
308 public :
309 using diff_type = size_t;
310 using value_type = T;
311 using iterator_category = std::input_iterator_tag;
312
313 bool操作符!=( const 迭代器 &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 Operator*() noException {
322 return m_parent->operator[](m_idx);
323 }
324
325迭代器 &operator++() {
326 m_idx++;
327 return * this ;
328 }
329
330迭代器 Operator++( int i) {
331 m_idx += i;
332 return * this ;
333 }
334
335 显式迭代器( size_t idx, Derived *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< Derived* > ( this ));
345 }
346
347迭代器 end() {
348 return iterator(this->m_parent.size(), static_cast< Derived* > ( this ));
349 }
[350 ] 350
351
352 template < typename T, typename Derived>
353 struct 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, Derived> (std::move(parent)) {
356 }
357
358 托管<T, void> 操作符[]( size_t 索引) {
359 if (index >= this->m_parent.size())
360 throw std::out_of_range( "Index out of 范围." );
361 return managed<T, void> (internal::bridge::get<internal::bridge::obj>(this->m_parent, index), this->m_parent.get_realm());
362 }
363
364 迭代器 {
365 public :
366 using diff_type = size_t;
368 using iterator_category = std::input_iterator_tag;
369
370 bool操作符!=( const 迭代器 &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 Operator*() noException {
379 内部::bridge::obj obj =内部::bridge::get<internal::bridge::obj>(m_parent->m_parent, m_idx);
380 return managed<T, void> (std::move(obj), this->m_parent->m_parent.get_realm());
381 }
382
383迭代器 &operator++() {
384 m_idx++;
385 return * this ;
386 }
387
388迭代器 Operator++( int i) {
389 m_idx += i;
390 return * this ;
391 }
392
393 显式迭代器( size_t idx, Derived *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< Derived* > ( this ));
403 }
404
405迭代器 end() {
406 return iterator(this->m_parent.size(), static_cast< Derived* > ( this ));
407 }
408 };
409
410 template < typename T>
411 struct 结果公共结果库<T,结果<T>> {
412 using value_type = T;
413 显式 结果( internal::bridge::results &&parent)
414 : Results_base<T, Results<T> >(std::move(parent)) {
415 }
416 };
第 417 章
418 template <auto ptr>
420 静态 内联 auto Ptr = ptr;
第 421 章 using Class = typenameInternal ::ptr_type_extractor<ptr>::class_type
第 422 章
第 423 章 static_assert ( sizeof ( managed<typenameInternal::ptr_type_extractor<ptr>::class_type >), "Type is not Managed by the Realm" );
424 };
第 425 章
426 template<auto ptr> structmanaged < linking_objects<ptr> < ptr>> : managed_base {
第 427 章 using iterator = typenameResults <typenameinternal::ptr_type_extractor<ptr>::class_type >::iterator;
428 using Class = typenameInternal ::ptr_type_extractor<ptr>::class_type
429
430 Linking_objects<ptr> detach() const {
第 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 章 托管<Class> 操作符[]( size_t idx) {
447 return get_results()[idx];
448 }
第 449 章
450 private :
第 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 章 inside::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(结果));
466 }
467 };
468 }
469
第 470 章
第 471 章#endif //CPREALM_RESULTS_HPP
定义: object.hpp: 63
定义: obj.hpp:123
定义: results.hpp:46
定义: schema.hpp: 51
定义: results.hpp: 419
定义: macros.hpp:286
定义: obj.hpp:62
定义: notifications.hpp:38
定义: results.hpp: 42
定义: results.hpp: 47
定义: results.hpp:411