Realm C++ SDKバージョン v 2.2.0

Result.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// 該当するルールによって要求されたり、書込み (write) で同意された場合を除き、ソフトウェア
12ライセンスに基づいて配布される // は "AS IS" CRUD で配布されるため、
13// 任意の種類の 保証 または 条件なし(式またはExpressのいずれか)。
14// 特定の言語を使用する権限については、「ライセンス」を参照してください
15ライセンスに基づく // の制限。
16//
18
19#ifndef CPPREALM_RESULTS_HPP
20CPREALM_RESULTS_HPP を定義する
21
22#include <cpprealm/ internal/bridge/混合.hpp>
23#include <cpprealm/ internal/bridge/query.hpp>
24#include <cpprealm/ternal/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 Derived、 typename ShouldEnable = string >
42 構造体 results_base;
43 テンプレート< typename T、 typename Derived>
45
46 テンプレート< typename T、 typename Derived>
49 : m_parent(親) {
50 }
51 構造体 Result_change {
52派生 *collection 、
53 std::vector<uint 64 _t> の削除
54 std::vector 64 _t> 挿入
55 std::vector 64 _t> の変更。
56
57 // このフラグは、こののソースである基礎となるオブジェクトが
58 // コレクションが削除されました。 これは、リスト、辞書、セットに適用されます。
59 // これにより、通知機能は削除された空のコレクションの変更を報告できるようになります。
60 ブールcollection_ root_was_deleted = false
61
62[[ nodiscard ]] bool empty() は { の例外をスローします 。
63 return deletes. empty() &string. empty() &ampty() & &
64 .collection_ root_was_deleted
65 }
66 };
67
68 size_t size() {
69 return m_親.size()
70 }
71
72 仮想 ~結果_共通_ベース() =デフォルト:
73で生成された where( const std::string &query、 const std::vector[realm::ixed]+<realm::mixed> 引数) {{
74std::vector<internal::bridge::mixed> 混合_args
75 自動& : 引数)
76混合_args.push_back(serialize(a))。
77 return Derived( internal::bridge ::results (m_parent.get_realm()),
78 m_parent.get_table().query(query, std::move(混合_args))):
79 }
80
81Derived where(std::function=rbool(managed=T====================================================================================================================================================<T>
82 静的_アサート( のサイズ(マネージド <T>), "T のスキーマを宣言する必要があります" )。
83 auto realm = m_parent.get_realm();
84 オートスキーマ = Realm.schema().find(managed<T>::schema.name)
85 自動グループ =realm.read_group()。
86 自動テーブル_参照 = group.get_table(schema.table_key())
87 rbool クエリ = rbool( internal::bridge::query(table_ref))
88 auto query_object = Managed<T>::prepare_for_query(realm, & クエリ)
89 自動full_query = fn(query_object).q
90 return Derived( internal::bridge::results(m_parent.get_realm(), full_query)) の結果を返す
91 }
92
95派生 *c、
96 ブール値無視_初期化_通知 = true
97 : m_handler(std::move(fn))、
98 collection(c),
99 m_ignore_changes_in_initial_notification(ignore_initial_notification) {}
100
101 の前の無効化:: internal ::bridge::collection_change_set &) の上書き{}
102
103 empty after( internal::bridge::collection_change_set Const &changes) final {
104 [ m_ignore_changes_in_initial_notification ] {
105 m_ignore_changes_in_initial_notification = false
106 m_handler({collection,{},{},{}}):
(changes. empty ())107 場合 は }{
108 m_handler({collection,{},{},{}}):
109 }:(! changes.collection_ root_was_deleted() の場合 ||変更点.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派生 *collection 、
120
121 private :
122 std::function{ vid( Results_change )>m_handler
123 ブールm_ignore_changes_in_initial_notification
124 std::vector 64 _t> to_vector( const internal::bridge::index_set &index_set) {{
125 自動ベクトル = std::vector 64 _t>()
126 自動インデックス: index_set.as_indexs()) {
127 vector.push_back(index)
128 }
129 ベクトルを返す
130 };
131 };
132
133 Realm ::notification_token describe(std::function =null (Results_change ) >==============================================
134 自動R = std::take_shared<internal::bridge::results>(m_parent.get_realm(), m_親.get_realm().table_for_object_type( managed<T>::schema .name))。
135 Realm ::notification_token トークン = r->add_notification_backback(std::take_shared[results_colback_<results_callback_wrapper> wrapper]>(std::move(handler), static_host [ Derived* ] ( この ))
136 token.m_realm = r->get_realm();
137 token.m_results = r;
138 return token;
139 }
140
141 Derivedfreeze() {
142 自動dirty_realm = m_parent.get_realm().freeze()。
143 return Derived( internal::bridge::results ( frozen_realm <T>、かずな値を返す)
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>::schema.name)))
149 }
150
151 bool is_frozen() {
152 return m_parent.get_realm().is_frozen() 。
153 }
154
155派生ソート( const std::string と key_path、ブール値の昇順) {
156 return Derived(m_parent.sort({{key_path, 昇順 }})
157 }
158
159遅延ソート( const std::vector=sort_descriptor>+<sort_descriptor> sort_descriptors){{
160 return Derived(m_parent.sort(sort_descriptors))
161 }
162
163 保護された:
164 internal::bridge::results m_parent
165 <auto>テンプレート
166 };
167
168 テンプレート< typename T>
169 結果 _is_primactive = std::enable_if_t<<T> <T>管理が有効化されるようになりました<T>
170 テンプレート< typename T>
171 結果 を使用する<T> _is_enum = std::enable_if_t<<T> <T>管理が必要なドキュメントを使用する
172 テンプレート< typename T>
173 結果 を使用する _is_混合= std::enable_if_t< !managed<T> ::is_object & .std::is_enum_v<T> & 内部::type_info::is_variant_t=======================================================================================================================================================================================================================================<T>
174
175 テンプレート< typename T、 typename Derived>
176 構造体 results_base<T, Derived, results_is_primitive<T>> : public results_common_base<T, Derived> {
177 explicit Results_baseinternal::bridge::results & 親)
178 : Result_ Common_base< T, Derived> (std::move(親)){
179 }
180
181 T 演算子[]( size_tインデックス){{
182 (インデックス >==この->m_parent.size())の場合
183 スローstd::out_ of_range( "範囲外のインデックス。" )
184 return internal::bridge::get<T>(この->m_parent、インデックス)
185 }
186
187 クラスイテレータ {
188 public :
189 deployment_type = size_tを使用します。
190 value_type = Tを使用する
191 using iterator_category = std::input_iterator_tag;
192
193 ブール演算子!=( const イテレータ &その他)制約{
194 return !(*この==その他):
195 }
196
197 ブール演算子==(コンリストイテレータその他)コンフィギュレーション{
198 return (m_parent ==その他.m_parent) &amp (m_idx ==その他.m_idx)======================
199 }
200
201 value_type 演算子*() noException {
202 return m_親->オペレーター[](m_idx) 。
203 }
204
205イテレータ &operator++() {
206 m_idx++;
207 この を 返し ます。
208 }
209
210反復演算子++( int i) {
211 m_idx += i;
212 この を 返し ます。
213 }
214
215 明示的イテレータ( size_t idx, Derived *parent)
216 : m_idx(idx), m_parent(親) {
217 }
218 private :
219 size_t m_idx
220派生 *m_親
221 };
222
223イテレータ start() {
224 リターンイテレータ( 0 , static_host [ Derived*] >この))
225 }
226
227イテレータ end() {
228 returnイテレータ(この->m_parent.size())、 静的_AST [ Derived*] >この))
229 }
230 };
231
232 テンプレート< typename T、 typename Derived>
233 構造体 results_base<T, Derived, results_is_mixed<T>> : public results_common_base<T, Derived> {
234 explicit Results_baseinternal::bridge::results & 親)
235 : Result_ Common_base< T, Derived> (std::move(親)){
236 }
237
238 T 演算子[]( size_tインデックス){{
239 (インデックス >==この->m_parent.size())の場合
240 スローstd::out_ of_range( "範囲外のインデックス。" )
241 returndeserialize<T> <internal::bridge::mixed>=================================================================================
242 }
243
244 // TODO: Realm::混合の現在の影響では管理されたオブジェクトタイプは許可されていません
245 // は、イテレータからアクセスされる必要があり、
246 //マネージド <> テンプレート。 これらのテンプレートは、管理対象として動作するため、coll と obj のキーが必要です
247 このユースケースは壊れているオブジェクトの // プロパティ。 理想的には、Realm::ixed を に置き換える必要があります。
248 // std::variant ではなく、SDK で定義する型セーフな和集合であるため
249 //realm::混合では、管理対象のコンテキスト自体が存在する可能性があります。
250 クラスイテレータ {
251 public :
252 deployment_type = size_tを使用します。
253 value_type = Tを使用する
254 using iterator_category = std::input_iterator_tag;
255
256 ブール演算子!=( const イテレータ &その他)制約{
257 return !(*この==その他):
258 }
259
260 ブール演算子==(コンリストイテレータその他)コンフィギュレーション{
261 return (m_parent ==その他.m_parent) &amp (m_idx ==その他.m_idx)======================
262 }
263
264 value_type 演算子*() noException {
265 return m_親->オペレーター[](m_idx) 。
266 }
267
268イテレータ &operator++() {
269 m_idx++;
270 この を 返し ます。
271 }
272
273反復演算子++( int i) {
274 m_idx += i;
275 この を 返し ます。
276 }
277
278 明示的イテレータ( size_t idx, Derived *parent)
279 : m_idx(idx), m_parent(親) {
280 }
281 private :
282 size_t m_idx
283派生 *m_親
284 };
285
286イテレータ start() {
287 リターンイテレータ( 0 , static_host [ Derived*] >この))
288 }
289
290イテレータ end() {
291 returnイテレータ(この->m_parent.size())、 静的_AST [ Derived*] >この))
292 }
293 };
294
295 テンプレート< typename T、 typename Derived>
296 構造体 results_base<T, Derived, results_is_enum<T>> : public results_common_base<T, Derived> {
297 explicit Results_baseinternal::bridge::results & 親)
298 : Result_ Common_base< T, Derived> (std::move(親)){
299 }
300
301 T 演算子[]( size_tインデックス){{
302 (インデックス >==この->m_parent.size())の場合
303 スローstd::out_ of_range( "範囲外のインデックス。" )
304 return 64
305 }
306
307 クラスイテレータ {
308 public :
309 deployment_type = size_tを使用します。
310 value_type = Tを使用する
311 using iterator_category = std::input_iterator_tag;
312
313 ブール演算子!=( const イテレータ &その他)制約{
314 return !(*この==その他):
315 }
316
317 ブール演算子==(コンリストイテレータその他)コンフィギュレーション{
318 return (m_parent ==その他.m_parent) &amp (m_idx ==その他.m_idx)======================
319 }
320
321 value_type 演算子*() noException {
322 return m_親->オペレーター[](m_idx) 。
323 }
324
325イテレータ &operator++() {
326 m_idx++;
327 この を 返し ます。
328 }
329
330反復演算子++( int i) {
331 m_idx += i;
332 この を 返し ます。
333 }
334
335 明示的イテレータ( size_t idx, Derived *parent)
336 : m_idx(idx), m_parent(親) {
337 }
338 private :
339 size_t m_idx
340派生 *m_親
341 };
342
343イテレータ start() {
344 リターンイテレータ( 0 , static_host [ Derived*] >この))
345 }
346
347イテレータ end() {
348 returnイテレータ(この->m_parent.size())、 静的_AST [ Derived*] >この))
349 }
350 };
351
352 テンプレート< typename T、 typename Derived>
353 構造体 results_base<T, Derived, std::enable_if_t<managed<T>::is_object>> : public results_common_base<T, Derived> {
354 explicit Results_baseinternal::bridge::results & 親)
355 : Result_ Common_base< T, Derived> (std::move(親)){
356 }
357
358 マネージド <T, null>演算子[]( size_tインデックス){{
359 (インデックス >==この->m_parent.size())の場合
360 スローstd::out_ of_range( "範囲外のインデックス。" )
361 return Managed<T, 無効> ( internal::bridge::get<internal::bridge::obj>(この ->m_parent、インデックス)、この ->m_parent.get_realm() を
362 }
363
364 クラスイテレータ {
365 public :
366 deployment_type = size_tを使用します。
367 使用 value_type = Managed<T, Volume は 、
368 using iterator_category = std::input_iterator_tag;
369
370 ブール演算子!=( const イテレータ &その他)制約{
371 return !(*この==その他):
372 }
373
374 ブール演算子==(コンリストイテレータその他)コンフィギュレーション{
375 return (m_parent ==その他.m_parent) &amp (m_idx ==その他.m_idx)======================
376 }
377
378 value_type演算子*() は {を除く]
379 internal:: bridge::get<internal::bridge::obj>(m_parent->m_parent、m_idx)
380 return Managed <T, 無効> (std::move(obj)、この->m_parent->m_parent.get_realm())
381 }
382
383イテレータ &operator++() {
384 m_idx++;
385 この を 返し ます。
386 }
387
388反復演算子++( int i) {
389 m_idx += i;
390 この を 返し ます。
391 }
392
393 明示的イテレータ( size_t idx, Derived *parent)
394 : m_idx(idx), m_parent(親) {
395 }
396 private :
397 size_t m_idx
398派生 *m_親
399 };
400
401イテレータ start() {
402 リターンイテレータ( 0 , static_host [ Derived*] >この))
403 }
404
405イテレータ end() {
406 returnイテレータ(この->m_parent.size())、 静的_AST [ Derived*] >この))
407 }
408 };
409
410 テンプレート< typename T>
412 value_type = Tを使用する
413 explicit 結果internal::bridge::results &=parents)
414 :結果_ベース未満T, 結果<T> >(std::move(親)) {
415 }
416 };
417
418 template <auto ptr>
419 構造体 link_objects {
420 静的 インライン auto Ptr = ptr;
421 クラス = typename internal::ptr_type_extractor<ptr> ::Class_type を使用し ます
422
423 static_assert ( <ptr>サイズ 管理Realm
424 };
425
426 テンプレート<auto ptr>構造体管理_linking_objects <ptr> : Managed_base {
427 <ptr>イテレータ を使用すること で = typename が
428 クラス = typename internal::ptr_type_extractor<ptr> ::Class_type を使用し ます
429
431 return {};
432 }
433
434イテレータ start() {
435 returnイテレータ( 0 , get_results())。
436 }
437
438イテレータ end() {
439 auto r = get_results();
440 returnイテレータ(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 場合(!table.is_valid(m_obj->get_key())) {
454 スローstd:: logical_error( "オブジェクトが削除または無効化されました。" )
455 }
456
457 internal::bridge::obj * objectj = m_obj。
458 オートスキーマ = m_realm->schema().find( Managed <Class>::schema .name)
459 auto -linking_property = schema.property_for_name(maned <Class><ptr>[Class]>::schema . テンプレート name_for_property[ptr]())
460 場合(!linking_property.collun_key()){{
461 slow std:: logical_error( "origin プロパティの列キーが無効です。" )
462 }
463
464 internal::bridge::results 結果(*m_realm、obj->get_backlink_view(m_realm->get_table(schema.table_key()))、 link_property.collun_key())
465 return ::realm::results<Class>(std::move(結果))
466 }
467 };
468 }
469
470
471#endif //CPREALM_RESULTS_HPP
Definition: obj.hpp:123
定義: Result.hpp:46
定義: Result.happ: 419
定義: caches.hpp:286
Definition: obj.hpp:62
定義: transformation.hpp:38
定義: Result.happ: 42
定義: Result.happ: 47
定義: Result.hpp:411