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

Managed_list.hpp

1
2//
3// © 2024 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_MANAGED_LIST_HPP
20#define CPPREALM_MANAGED_LIST_HPP
21
22#include <cpprealm/macros.hpp>
23#include <cpprealm/notifications.hpp>
24#include <cpprealm/observation.hpp>
25#include <cpprealm/types.hpp>
26
27名前空間邦土 {
28
29 テンプレート< typename T>
30 構造体 Managed <std::vector=T>,<T> std::enable_if_t=Interval::type_info:: is_primative =T===value========================================================<T>
31 使用 Managed <std::vector=T==================================================================<T>
32
33 クラスイテレータ {
34 public :
35 using iterator_category = std::input_iterator_tag;
36
37 ブール演算子!=( const イテレータとその他)の制約
38 {
39 return !(*この==その他):
40 }
41
42 ブール演算子==( constイテレータ~その他)コンフィギュレーション
43 {
44 return (m_parent ==その他.m_parent) & & (m_i ==その他.m_i)=====================
45 }
46
47 T*()演算子は例外をスローします
48 {
49 return (*m_parent)[m_i] を返します
50 }
51
52イテレータと演算子 ++()
53 {
54この->m_i++
55 この を 返し ます。
56 }
57
58 制約イテレータと演算子++( int i)
59 {
60この->m_i += i
61 この を 返し ます。
62 }
63 private :
64 テンプレート< typename , typename >
65 友人 構造体 マネージド
66
67反復子( size_t i、 管理対象 : <std::ベクトル======================================================<T>
68 : m_i(i), m_parent(parent)
69 {
70 }
71 size_t m_i
72 Managed=std::vector=T<T> ==========================================================================================
73 };
74イテレータ start()
75 {
76 returnイテレータ( 0 、この):
77 }
78
79イテレータ end()
80 {
81 returnイテレータ(size())、この)。
82 }
83 [[nodiscard]] std::vector<T> Delete() Const {
84 自動リスト = Realm :: internal::bridge::list (*m_realm, *m_obj, m_key)
85 U = typename internal:: type_info ::type_info<T>:: internal_type
86
87 size_t count = list.size()
88 (カウント == 0 )の場合
89 return std::vector=====================================================<T>
90
91 自動レット = std::vector<T>()
92 ret.resolve(count)
93 for(size_t i = 0; i < count; i++) {
94 場合 constexpr (内部::type_info::MixedPersistableConcern<T>::value) {
95ret.push_back(deserialize=T>(realm::<T> <U>internal::bridge::get=U>(list, i))
96 } else if constexpr (std::is_enum_v<T>) {
97ret.push_back(deserialize=T>(realm::<T> <U>internal::bridge::get=U>(list, i))
98 } else {
99 ret.push_back(deserialize(realm:: internal::bridge::get<U>(list, i)):
100 }
101 }
102
103 return ret;
104 }
105
106 [[nodiscard]] の結果 <T> as_results () は、{{
107 結果<T> 返す
108 }
109
110 Realm::notification_token describe (std::function= null::collection_change )>============================================
111 自動 リスト = std::take_shared{realm::の間:<realm::internal::bridge::list> :bridge::list>(*m_realm, *m_obj, m_key)
112 Realm ::notification_tokenトークン = list->add_notification_colback(
113std::take_shared{realm::collection_customback_ wrapper>(<realm::collection_callback_wrapper>
114 std::move(fn),
115 false ))。
116 token.m_realm = *m_realm;
117 token.m_list = list;
118 return token;
119 }
120
121 // TODO: 値への参照をエミュレートします。
122 T演算子[]( size_t idx) const {
123 自動リスト = Realm :: internal::bridge::list (*m_realm, *m_obj, m_key)
124 U = typename internal:: type_info ::type_info<T>:: internal_type
125 場合 constexpr (内部::type_info::MixedPersistableConcern<T>::value) {
126 returndeserialize<T> (realm:: internal::bridge::get=U>(list,<U> idx))
127 } else if constexpr (std::is_enum_v<T>) {
128 return 静 :<T><U>
129 } else {
130 returndeserialize (realm:: internal::bridge::get=1============================================<U>
131 }
132 }
133
134 emptypop_back () {
135 internal::bridge::list(*m_realm, *m_obj, m_key).remove(size() - 1 )
136 }
137 無効化( size_t idx) {
138 internal::bridge::list(*m_realm, *m_obj, m_key).remove(idx)
139 }
140 id clear(){
141 internal::bridge::list(*m_realm, *m_obj, m_key).remove_all()
142 }
143 無効化プッシュ_back( const T & 値) {
144 自動リスト = internal::bridge::list(*m_realm, *m_obj, m_key)
145 list.add(serialize(value))
146 }
147 size_t size() {
148 return internal::bridge::list(*m_realm, *m_obj, m_key).size()
149 }
150 size_t find( const T & ) {
151 場合 constexpr (std::is_enum_v<T>) {
152 は internal::bridge::list(* m_realm , *m_obj, m_key).find( static_ Cast < int 64 _t > (a)) を返します。
153 } else {
154 return internal::bridge::list(*m_realm, *m_obj, m_key).find(a):
155 }
156 }
157 無効セット( size_t PO、 const T+ ){
158 internal::bridge::list(*m_realm, *m_obj, m_key).set(os, )、
159 }
160
161結果<T> sort(ブール値昇順){
162 return 結果を返す<T>
163.sort(std::vector< internal::bridge::sort_descriptor<internal::bridge::sort_descriptor> > ({{昇順}}))
164 }
165
166 private :
167マネージド() =デフォルト
168マネージド( const Managed) =削除
169マネージド(マネージド & )=削除
170マネージド() 演算子=( constマネージド() =削除)
171マネージドと 演算子=(manedおよびを) =削除
172 テンプレート< typename , typename >
173 友人 構造体管理。
174 };
175
176 テンプレート< typename T>
178 public :
179 [[nodiscard]] std::vector<T*> Delete() Const {
180 自動リスト = Realm :: internal::bridge::list (*m_realm, *m_obj, m_key)
181 size_t count = list.size()
182 (カウント == 0 )の場合
183 return std::vector=T================================================
184 自動レプリカセット = std::vector< T*>()
185 ret.resolve(count)
186 for(size_t i = 0; i < count; i++) {
187 Managed <T> m(realm:: internal::bridge::get<internal::bridge::obj>(list, i), *m_realm)
188 T* v = new T():
189 auto assign = [&m, &v](auto& pair) {
190 (*v).*(std::decay_t< Decltype ( pair.first)>::ptr) = (m.*(ペア.秒)). describe()
191 };
192 自動圧縮 = 内部::zip_tunes( Managed <T>::schema .ps, <T>Managed[T]::managed_pointers ())。
193 std::apply([+v, &m, &assign]( auto & & ... pair) {
194 (assign( pair), ...)
195 }、圧縮型)
196
197 ret.push_back(v)
198 }
199 return ret;
200 }
201
202 [[nodiscard]]の結果 <T*>_results () 演算子 {
203 return results ( )
204 }
205
206 クラスイテレータ {
207 public :
208 使用 value_type = Managed<T>
209
210 duration_type = std::ptdiff_tを使用します。
211 ポインター = T*を使用し
212 参照 = T &を使用する
213 イテレータ_カテゴリ = std::forward_itemもの_タグを使用する
214
215 ブール演算子!=( const イテレータとその他)の制約
216 {
217 return !(*この==その他):
218 }
219
220 ブール演算子==( constイテレータ~その他)コンフィギュレーション
221 {
222 return (m_parent ==その他.m_parent) & & (m_i ==その他.m_i)=====================
223 }
224
225 <T>マネージド 演算子*() は例外をスローします
226 {
227 自動リスト = Realm :: internal::bridge::list (*m_parent->m_realm、*m_parent->m_obj、m_parent->m_key)
228 Managed m(realm::<T> internal::bridge::get=realm::<realm::internal::bridge::obj> internal::bridge::obj>(list, m_i), *m_parent->m_realm)
229 return {std::move(m)} を返す
230 }
231
232イテレータと演算子 ++()
233 {
234この->m_i++
235 この を 返し ます。
236 }
237
238 制約イテレータと演算子++( int i)
239 {
240この->m_i += i
241 この を 返し ます。
242 }
243 private :
244 テンプレート< typename , typename >
245 友人 構造体 マネージド
246
247反復子( size_t i、管理対象: <std::ベクトル==========================================================
248 : m_i(i), m_parent(parent)
249 {
250 }
251 size_t m_i
252 Managed=std::vector=T ============================================================================================
253 };
254
255イテレータ start()
256 {
257 returnイテレータ( 0 、この):
258 }
259
260イテレータ end()
261 {
262 returnイテレータ(size())、この)。
263 }
264
265 emptypop_back () {
266 internal::bridge::list(*m_realm, *m_obj, m_key).remove(size() - 1 )
267 }
268 無効化( size_t idx) {
269 internal::bridge::list(*m_realm, *m_obj, m_key).remove(idx)
270 }
271 id clear(){
272 internal::bridge::list(*m_realm, *m_obj, m_key).remove_all()
273 }
274 disabledpush_back (T* 値)
275 {
276 自動リスト = internal::bridge::list(*m_realm, *m_obj, m_key)
277 auto table = m_obj->get_target_table(m_key);
278 internal::bridge::obj m_obj
279 場合 Constexpr (managed<T>::schema.HasPrimaryKeyProperty){{
280 自動pk = (*値).*(managed<T>::schema.primary_key().ptr)
281 m_obj =table.create_object_with_primary_key( realm:: internal::bridge::混合(serialize(pk.value)))
282} であれば ( managed<T> ::schema.is_ embedded()){{
283 m_obj = list.add_ embedded()
284 } else {
285 m_obj =table.create_object()
286 }
287 std::apply([800000000000000000000000000000000000000000000]([80000000000000000000000000000000000000000000000000000000000]( autoと ...p) {
288 (accessor= typename std::decay_t =decimaltype (p)>::Result>::set(
289 m_obj, m_obj.get_table().get_corumn_key(p.name), 邦土
290 (*値).*(std::decimal_t< Decltype (p)>::ptr)), ...)、
291 }、managed< T, 無効>::schema.ps)
292 場合(!managed<T>::schema.is_ embedded()) {
293 list.add(m_obj.get_key())
294 }
295 }
296 無効 なプッシュ _ バック( 管理対象 :<T> および 値)
297 {
298 自動リスト = internal::bridge::list(*m_realm, *m_obj, m_key)
299 場合(!managed<T>::schema.is_ embedded()) {
300 list.add(value.m_obj.get_key())
301 } else {
302 slow std:: logical_error( "既存の埋め込みオブジェクトを管理対象リストに追加できません。" ):
303 }
304 }
305 無効なプッシュ_バック( const Managed <T*> & 値)
306 {
307 場合(!managed<T>::schema.is_ embedded()) {
308 自動リスト = internal::bridge::list(*m_realm, *m_obj, m_key)
309 list.add(value.m_obj->get_key())
310 } else {
311 slow std:: logical_error( "既存の埋め込みオブジェクトを管理対象リストに追加できません。" ):
312 }
313 }
314
315 size_t size() const
316 {
317 return internal::bridge::list(*m_realm, *m_obj, m_key).size()
318 }
319 size_t find( constmaned <T>[T>+a)] {
320 return internal::bridge::list(*m_realm, *m_obj, m_key).find(a.m_obj.get_key())
321 }
322 size_t find( const typenamemanded =T*>::ref_type=a) const {
323 return internal::bridge::list(*m_realm, *m_obj, m_key).find(a->m_obj.get_key())
324 }
325 typenamemanded =T*>::ref_type 演算子[]( size_t idx) const {
326 自動リスト = Realm :: internal::bridge::list (*m_realm, *m_obj, m_key)
327 return typenamemanded =T=======================================================================================<T><realm::internal::bridge::obj>
328 }
329
330 Realm::notification_token describe (std::function= null::collection_change )>============================================
331 自動 リスト = std::take_shared{realm::の間:<realm::internal::bridge::list> :bridge::list>(*m_realm, *m_obj, m_key)
332 Realm ::notification_tokenトークン = list->add_notification_colback(
333std::take_shared{realm::collection_customback_ wrapper>(<realm::collection_callback_wrapper>
334 std::move(fn),
335 false ))。
336 token.m_realm = *m_realm;
337 token.m_list = list;
338 return token;
339 }
340
341結果<T> where( const std::string &query、 const std::vector{realm::ixed><realm::mixed> &argments) {{
342std::vector<internal::bridge::mixed> 混合_args
343 自動& : 引数)
344混合_args.push_back(serialize(a))。
345 結果を<T> 返すstd::move(混合_args))):
346 }
347
348の結果<T> where(std::function[rbool(managed[T]<T> &)> &fn) {{
349 静的_アサート( のサイズ(マネージド <T>), "T のスキーマを宣言する必要があります" )。
350 オートスキーマ = m_realm->schema().find(managed<T>::schema.name)
351 自動グループ = m_realm->read_group()。
352 自動テーブル_参照 = group.get_table(schema.table_key())
353 rbool クエリ = rbool( internal::bridge::query(table_ref))
354 auto query_object = Managed<T>::prepare_for_query(*m_realm, &query)
355 自動full_query = fn(query_object).q
356 return <T>結果を返す
357 }
358
359結果<T> sort( const std::string と key_path、ブール値の昇順) {
360 オートスキーマ = m_realm->schema().find(managed<T>::schema.name)
361 自動テーブル_参照 = m_obj->get_target_table(m_key)
362 <T>return の結果を返す昇順}})
363 }
364
365の結果<T> sort( const std::vector[Interval::bridge::sort_descriptor]><internal::bridge::sort_descriptor> &sort_descriptors){{
366 オートスキーマ = m_realm->schema().find(managed<T>::schema.name)
367 自動テーブル_参照 = m_obj->get_target_table(m_key)
368 return <T>結果を返す
369 }
370
371 private :
372マネージド() =デフォルト
373マネージド( const Managed) =削除
374マネージド(マネージド & )=削除
375マネージド() 演算子=( constマネージド() =削除)
376マネージドと 演算子=(manedおよびを) =削除
377 テンプレート< typename , typename >
378 友人 構造体管理。
379 };
380} // namespace realm
381
382#endif//CPREALM_MANAGED_LAST_HPP
定義: observation.happ: 176
定義: list.happ: 49
定義: compound.hpp:69
定義: caches.hpp:286
Definition: obj.hpp:62
定義: transformation.hpp:38
定義: Result.hpp:411