Realm C++ SDK 버전 v2.2.0

managed_list.hpp

1
2//
3//저작권 2024 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_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>, std::enable_if_t<internal::type_info::is_primitive<T>::value>> : managed_base {
31 사용 managed<std::vector<T>>::managed_base:: 연산자=;
32
33 클래스 반복자 {
34 public:
35 iterator_category = std::input_iterator_tag;
36
37 bool 연산자!=(const iterator& other) const
38 {
39 return !(*this == other);
40 }
41
42 bool 연산자==(const iterator& other) const
43 {
44 return (m_parent == other.m_parent) && (m_i == other.m_i);
45 }
46
47 T 연산자*() const noException
48 {
49 return (*m_parent)[m_i];
50 }
51
52 iterator& operator++()
53 {
54 this->m_i++;
55 return *this;
56 }
57
58 const iterator& operator++(int i)
59 {
60 this->m_i += i;
61 return *this;
62 }
63 private:
64 템플릿<typename, typename>
65 친구 구조체 managed 됨 ;
66
67 iterator(size_t i, managed<std::vector<T>>* parent)
68 : m_i(i), m_parent(parent)
69 {
70 }
71 size_t m_i;
72 managed<std::vector<T>>* m_parent;
73 };
74 반복자 begin()
75 {
76 return iterator(0, this);
77 }
78
79 반복자 end()
80 {
81 return iterator(size(), this);
82 }
83 [[nodiscard]] std::vector<T> fetch() const {
84 자동 목록 = realm::internal::bridge::list(*m_realm, *m_obj, m_key);
85 using U = typename internal::type_info::type_info<T>::internal_type;
86
87 size_t count = list.size();
88 if (count == 0)
89 return std::vector<T>();
90
91 auto ret = std::vector<T>();
92 ret.reserve(count);
93 for(size_t i = 0; i < count; i++) {
94 만약 constexpr (internal::type_info::MixedPersistableConcept<T>::value) {
95 ret.push_back(deserialize<T>(영역::internal::bridge::get<U>(list, i))));
96 } else if constexpr (std::is_enum_v<T>) {
97 ret.push_back(deserialize<T>(영역::internal::bridge::get<U>(list, i))));
98 } 기타 {
99 ret.push_back(deserialize(영역::internal::bridge::get<U>(list, i)));
100 }
101 }
102
103 return ret;
104 }
105
106 [[nodiscard]] results<T> as_results() const {
107 return results<T>(영역::internal::bridge::list(*m_realm, *m_obj, m_key).as_results());
108 }
109
110 영역::notification_token 관찰(std::function<oid(영역::collection_change)>&& fn) {
111 auto list = std::make_shared(*m_realm,<realm::internal::bridge::list> *m_obj, m_key);
112 영역::notification_token token = list->add_notification_callback(
113 <realm::collection_callback_wrapper>std::make_shared(
114 std::move(fn),
115 false)),
116 token.m_realm = *m_realm;
117 token.m_list = list;
118 토큰을 반환 합니다.
119 }
120
121 // TODO: 값에 대한 참조를 에뮬레이션합니다.
122 T 연산자[](size_t idx) const {
123 자동 목록 = realm::internal::bridge::list(*m_realm, *m_obj, m_key);
124 using U = typename internal::type_info::type_info<T>::internal_type;
125 만약 constexpr (internal::type_info::MixedPersistableConcept<T>::value) {
126 return deserialize<T>(realm::internal::bridge::get<U>(list, idx));
127 } else if constexpr (std::is_enum_v<T>) {
128 반환 static_cast<T>(deserialize<T>(영역::internal::bridge::get<U>(list, idx))));
129 } 기타 {
130 return deserialize(영역::internal::bridge::get<U>(list, idx));
131 }
132 }
133
134 무효 pop_back() {
135 internal::bridge::list(*m_realm, *m_obj, m_key). (제거() - 1);
136 }
137 무효 지우기(size_t idx) {
138 internal::bridge::list(*m_realm, *m_obj, m_key). (idx) 제거 합니다.
139 }
140 무효 clear() {
141 internal::bridge::list(*m_realm, *m_obj, m_key).remove_all();
142 }
143 무효 push_back(const T& value) {
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& a) {
151 만약 constexpr (std::is_enum_v<T>) {
152 return internal::bridge::list(*m_realm, *m_obj, m_key).find(static_cast<int64_t>(a));
153 } 기타 {
154 return internal::bridge::list(*m_realm, *m_obj, m_key).find(a);
155 }
156 }
157 oid set(size_t pos, const T& a) {
158 internal::bridge::list(*m_realm, *m_obj, m_key). 설정하다(위치, a);
159 }
160
161 결과<T> sort(bool 오름차순) {
162 return results<T>(internal::bridge::list(*m_realm, *m_obj, m_key)
163 .sort(std::vector<internal::bridge::sort_descriptor>({{"self", 오름차순}}))));
164 }
165
166 private:
167 managed() = 기본값;
168 managed(const managed&) = delete;
169 managed(managed &&) = 삭제;
170 managed& 연산자=(const managed&) = 삭제;
171 managed& operator=(managed&&) = delete;
172 템플릿<typename, typename>
173 친구 구조체 managed;
174 };
175
176 템플릿<typename T>
177 구조체 managed<std::vector<T*>> : managed_base {
178 public:
179 [[nodiscard]] std::vector<T*> take() const {
180 자동 목록 = realm::internal::bridge::list(*m_realm, *m_obj, m_key);
181 size_t count = list.size();
182 if (count == 0)
183 return std::vector<T*>();
184 auto ret = std::vector<T*>();
185 ret.reserve(count);
186 for(size_t i = 0; i < count; i++) {
187 managed<T> m(영역::internal::bridge::get<internal::bridge::obj>(list, i), *m_realm);
188 T* v = new T();
189 자동 할당 = [&m, &v](자동& 쌍) {
190 (*v).*(std::decay_t<decltype(pair.first)>::ptr) = (m.*(pair.second)).ttach();
191 };
192 auto zipped = internal::zip_tuples(managed<T>:: 스키마.ps, managed<T>::managed_pointers());
193 std:: 적용([&v, &m, &assign](auto && ...pair) {
194 (assign(pair), ...);
195 }, 압축),
196
197 ret.push_back(v);
198 }
199 return ret;
200 }
201
202 [[nodiscard]] results<T*> as_results() const {
203 반환 결과<T*>(realm::internal::bridge::list(*m_realm, *m_obj, m_key).as_results());
204 }
205
206 클래스 반복자 {
207 public:
208 사용 value_type = managed<T>;
209
210 차등 유형 사용 = std::ptrdiff_t;
211 포인터 사용 = T*;
212 참조 사용 = T&;
213 iterator_category = std:: forward_iterator_tag ;
214
215 bool 연산자!=(const iterator& other) const
216 {
217 return !(*this == other);
218 }
219
220 bool 연산자==(const iterator& other) const
221 {
222 return (m_parent == other.m_parent) && (m_i == other.m_i);
223 }
224
225 managed<T> 연산자*() const noException
226 {
227 auto list = realm::internal::bridge::list(*m_parent->m_realm, *m_parent->m_obj, m_parent->m_key);
228 managed<T> m(realm::internal::bridge::get<realm::internal::bridge::obj>(list, m_i), *m_parent->m_realm);
229 {std::move(m)}를 반환 합니다.
230 }
231
232 iterator& operator++()
233 {
234 this->m_i++;
235 return *this;
236 }
237
238 const iterator& operator++(int i)
239 {
240 this->m_i += i;
241 return *this;
242 }
243 private:
244 템플릿<typename, typename>
245 친구 구조체 managed 됨 ;
246
247 iterator(size_t i, managed<std::vector<T*>>* parent)
248 : m_i(i), m_parent(parent)
249 {
250 }
251 size_t m_i;
252 managed<std::vector<T*>>* m_parent;
253 };
254
255 반복자 begin()
256 {
257 return iterator(0, this);
258 }
259
260 반복자 end()
261 {
262 return iterator(size(), this);
263 }
264
265 무효 pop_back() {
266 internal::bridge::list(*m_realm, *m_obj, m_key). (제거() - 1);
267 }
268 무효 지우기(size_t idx) {
269 internal::bridge::list(*m_realm, *m_obj, m_key). (idx) 제거 합니다.
270 }
271 무효 clear() {
272 internal::bridge::list(*m_realm, *m_obj, m_key).remove_all();
273 }
274 무효 push_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>:: 스키마.HasPrimaryKeyProperty) {
280 auto pk = (*value).*(managed<T>::schema.primary_key().ptr);
281 m_obj = table.create_object_with_primary_key(영역::internal::bridge::mixed(serialize(pk.value)));
282 } other if (managed::<T> 스키마.is_embedded ()) {
283 m_obj = list.add_embedded();
284 } 기타 {
285 m_obj = table.create_object();
286 }
287 std:: 적용([&m_obj, &value, 영역 = *m_realm](auto && ...p) {
288 (접근자<typename std::decay_t<decltype(p)>::Result>:: 설정하다(
289 m_obj, m_obj.get_table().get_column_key(p.name), Realm,
290 (*value).*(std::decay_t<decltype(p)>::ptr)), ...);
291 }, managed<T, 무효>:: 스키마.ps);
292 if (!managed<T>::schema.is_embedded()) {
293 list.add(m_obj.get_key());
294 }
295 }
296 oid push_back(const managed<T>& value)
297 {
298 자동 목록 = internal::bridge::list(*m_realm, *m_obj, m_key);
299 if (!managed<T>::schema.is_embedded()) {
300 list.add(value.m_obj.get_key());
301 } 기타 {
302 throw std::logic_error("기존 내장된 객체 를 managed 목록에 추가할 수 없습니다.");
303 }
304 }
305 oid push_back(const managed<T*>& value)
306 {
307 if (!managed<T>::schema.is_embedded()) {
308 자동 목록 = internal::bridge::list(*m_realm, *m_obj, m_key);
309 list.add(value.m_obj->get_key());
310 } 기타 {
311 throw std::logic_error("기존 내장된 객체 를 managed 목록에 추가할 수 없습니다.");
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(const managed<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 typename managed<T*>::ref_type& a) const {
323 return internal::bridge::list(*m_realm, *m_obj, m_key).find(a->m_obj.get_key());
324 }
325 유형 이름 managed<T*>:: ref_type 연산자[](size_t idx) const {
326 자동 목록 = realm::internal::bridge::list(*m_realm, *m_obj, m_key);
327 반환 유형이름 <T><realm::internal::bridge::obj> managed<T*>:: ref_type (managed(영역::internal::bridge::get(list, idx), *m_realm));
328 }
329
330 영역::notification_token 관찰(std::function<oid(영역::collection_change)>&& fn) {
331 auto list = std::make_shared(*m_realm,<realm::internal::bridge::list> *m_obj, m_key);
332 영역::notification_token token = list->add_notification_callback(
333 <realm::collection_callback_wrapper>std::make_shared(
334 std::move(fn),
335 false)),
336 token.m_realm = *m_realm;
337 token.m_list = list;
338 토큰을 반환 합니다.
339 }
340
341 results<T> where(const std::string &query, const std::vector<realm::mixed> &arguments) {
342 std::vector<internal::bridge::mixed> mixed_args;
343 for(auto& a : 인수)
344 mixed_args.push_back(serialize(a));
345 return results<T>(internal::bridge::results(*m_realm, m_obj->get_target_table( 쿼리 , std::move(mixed_args)))));
346 }
347
348 결과<T> where(std::function<rbool(managed<T> &)> &&fn) {
349 static_assert(sizeof(managed<T>), "Must explain schema for T");
350 auto 스키마 = m_realm-> 스키마().find(managed<T>:: 스키마.name);
351 자동 그룹 = m_realm->read_group();
352 auto table_ref = group.get_table(schema.table_key());
353 rbool query = rbool(internal::bridge::query(table_ref));
354 auto query_object = managed<T>::prepare_for_query(*m_realm, &query);
355 auto full_query = fn(query_object).q;
356 return results<T>(internal::bridge::results(*m_realm, full_query));
357 }
358
359 결과<T> sort(const std::string &key_path, bool 오름차순) {
360 auto 스키마 = m_realm-> 스키마().find(managed<T>:: 스키마.name);
361 auto table_ref = m_obj->get_target_table(m_key);
362 return results<T>(internal::bridge::results(*m_realm, Table_ref)).sort({{key_path, 오름차순}});
363 }
364
365 결과<T> sort(const std::vector<internal::bridge::sort_descriptor> &sort_descriptors) {
366 auto 스키마 = m_realm-> 스키마().find(managed<T>:: 스키마.name);
367 auto table_ref = m_obj->get_target_table(m_key);
368 return results<T>(internal::bridge::results(*m_realm, table_ref)).sort(sort_descriptors);
369 }
370
371 private:
372 managed() = 기본값;
373 managed(const managed&) = delete;
374 managed(managed &&) = 삭제;
375 managed& 연산자=(const managed&) = 삭제;
376 managed& operator=(managed&&) = delete;
377 템플릿<typename, typename>
378 친구 구조체 managed;
379 };
380} // 네임스페이스 영역
381
382#endif//CPPREALM_MANAGED_LIST_HPP
정의: 관찰.hpp:176
정의: 매크로.hpp:286
정의: obj.hpp:62
정의: 알림.hpp:38
정의: Results.hpp:411