Realm C++ SDK 버전 v2.2.0

managed_set.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 CPPREALM_MANAGED_SET_HPP
20#define CPPRALM_MANAGED_SET_HPP
21
22#include <cpprealm/macros.hpp>
23#include <cpprealm/notifications.hpp>
24#include <cpprealm/observation.hpp>
25#include <cpprealm/types.hpp>
26
27#include <set>
28
29네임스페이스 영역 {
30
31 템플릿<typename T>
32 구조체 managed<std:: 설정하다<T>, std::enable_if_t<internal::type_info::is_primitive<T>::value>> : managed_base {
33 사용 managed<std:: 설정하다<T>>::managed_base:: 연산자=;
34 사용 value_type = T;
35
36 클래스 반복자 {
37 public:
38 사용 value_type = T;
39
40 차등 유형 사용 = std::ptrdiff_t;
41 포인터 사용 = T*;
42 참조 사용 = T&;
43 iterator_category = std:: forward_iterator_tag ;
44
45 bool 연산자!=(const iterator& other) const
46 {
47 return !(*this == other);
48 }
49
50 bool 연산자==(const iterator& other) const
51 {
52 return (m_parent == other.m_parent) && (m_i == other.m_i);
53 }
54
55 T 연산자*() const noException
56 {
57 auto s = 영역::internal::bridge:: 설정하다(*m_parent->m_realm, *m_parent->m_obj, m_parent->m_key);
58 return deserialize<T>(s.get_any(m_i));
59 }
60
61 iterator& operator++()
62 {
63 this->m_i++;
64 return *this;
65 }
66
67 const iterator& operator++(int i)
68 {
69 this->m_i += i;
70 return *this;
71 }
72 private:
73 템플릿<typename, typename>
74 친구 구조체 managed 됨 ;
75
76 iterator(size_t i, 관리되는<std::set<T>>* parent)
77 : m_i(i), m_parent(parent)
78 {
79 }
80 size_t m_i;
82 };
83 반복자 begin()
84 {
85 return iterator(0, this);
86 }
87
88 반복자 end()
89 {
90 return iterator(size(), this);
91 }
92 [[nodiscard]] std:: 설정하다<T> fetch() const {
93 auto 설정하다 = 영역::internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
94 auto ret = std::set<T>();
95 for(size_t i = 0; i < 설정하다.size(); i++) {
96 ret.insert(deserialize<T>(set.get_any(i)));
97 }
98 return ret;
99 }
100
101 영역::notification_token 관찰(std::function<oid(영역::collection_change)>&& fn) {
102 auto set = std::make_shared<realm::internal::bridge::set>(*m_realm, *m_obj, m_key);
103 realm::notification_token token = set->add_notification_callback(
104 <realm::collection_callback_wrapper>std::make_shared(
105 std::move(fn),
106 false)),
107 token.m_realm = *m_realm;
108 token.m_set = set;
109 토큰을 반환 합니다.
110 }
111
112 무효 지우기(const iterator& it)
113 {
114 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
115 설정하다. 제거(serialize(*it));
116 }
117
118 std::pair<iterator, bool> insert(const T& v)
119 {
120 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
121 만약 constexpr (internal::type_info::MixedPersistableConcept<T>::value) {
122 std::pair<size_t, bool> res = 설정하다.insert(serialize<T>(v));
123 return std::pair<iterator, bool>(iterator(res.first, this), res.second);
124 } 기타 {
125 std::pair<size_t, bool> res = 설정하다.insert(v);
126 return std::pair<iterator, bool>(iterator(res.first, this), res.second);
127 }
128 }
129
130 iterator insert(const iterator&, const T& v)
131 {
132 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
133 std::pair<size_t, bool> res = 설정하다.insert(v);
134 return iterator(res.first, this);
135 }
136
137 반복자 find(const T& v)
138 {
139 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
140 size_t idx = 설정하다.find(serialize(v));
141 if (idx == 영역::not_in_collection)
142 return iterator(size(), this);
143 return iterator(idx, this);
144 }
145 무효 clear() {
146 internal::bridge::set(*m_realm, *m_obj, m_key).remove_all();
147 }
148
149 size_t size()
150 {
151 return internal::bridge:: 설정하다(*m_realm, *m_obj, m_key).size();
152 }
153
154 private:
155 managed() = 기본값;
156 managed(const managed&) = delete;
157 managed(managed &&) = 삭제;
158 managed& 연산자=(const managed&) = 삭제;
159 managed& operator=(managed&&) = delete;
160 템플릿<typename, typename>
161 친구 구조체 managed;
162 };
163
164 템플릿<typename T>
165 구조체 managed<std::set<T*>> : managed_base {
166 사용 managed<std:: 설정하다<T*>>::managed_base:: 연산자=;
167 사용 value_type = managed<T>;
168
169 클래스 반복자 {
170 public:
171 사용 value_type = managed<T>;
172
173 차등 유형 사용 = std::ptrdiff_t;
174 포인터 사용 = T*;
175 참조 사용 = T&;
176 iterator_category = std:: forward_iterator_tag ;
177
178 bool 연산자!=(const iterator& other) const
179 {
180 return !(*this == other);
181 }
182
183 bool 연산자==(const iterator& other) const
184 {
185 return (m_parent == other.m_parent) && (m_i == other.m_i);
186 }
187
188 managed<T> 연산자*() const noException
189 {
190 auto s = 영역::internal::bridge:: 설정하다(*m_parent->m_realm, *m_parent->m_obj, m_parent->m_key);
191 managed<T> m(s.get_obj(m_i), *m_parent->m_realm);
192 {std::move(m)}를 반환 합니다.
193 }
194
195 iterator& operator++()
196 {
197 this->m_i++;
198 return *this;
199 }
200
201 const iterator& operator++(int i)
202 {
203 this->m_i += i;
204 return *this;
205 }
206 private:
207 템플릿<typename, typename>
208 친구 구조체 managed 됨 ;
209
210 iterator(size_t i, 관리되는<std::set<T*>>* parent)
211 : m_i(i), m_parent(parent)
212 {
213 }
214 size_t m_i;
215 managed<std::set<T*>>* m_parent;
216 };
217 반복자 begin()
218 {
219 return iterator(0, this);
220 }
221
222 반복자 end()
223 {
224 return iterator(size(), this);
225 }
226 [[nodiscard]] std:: 설정하다<T*> fetch() const {
227 auto s = 영역::internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
228 size_t count = s.size();
229 if (count == 0)
230 return std:: 설정하다<T*>();
231 auto ret = std::set<T*>();
232 for(size_t i = 0; i < count; i++) {
233 managed<T> m(s.get_obj(i), *m_realm);
234 T* v = new T();
235 자동 할당 = [&m, &v](자동& 쌍) {
236 (*v).*(std::decay_t<decltype(pair.first)>::ptr) = (m.*(pair.second)).ttach();
237 };
238 auto zipped = internal::zip_tuples(managed<T>:: 스키마.ps, managed<T>::managed_pointers());
239 std:: 적용([&v, &m, &assign](auto && ...pair) {
240 (assign(pair), ...);
241 }, 압축),
242
243 ret.insert(v);
244 }
245 return ret;
246 }
247
248 영역::notification_token 관찰(std::function<oid(영역::collection_change)>&& fn) {
249 auto set = std::make_shared<realm::internal::bridge::set>(*m_realm, *m_obj, m_key);
250 realm::notification_token token = set->add_notification_callback(
251 <realm::collection_callback_wrapper>std::make_shared(
252 std::move(fn),
253 false)),
254 token.m_realm = *m_realm;
255 token.m_set = set;
256 토큰을 반환 합니다.
257 }
258
259 무효 지우기(const iterator& it)
260 {
261 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
262 set.remove(it.operator*().m_obj.get_key());
263 }
264
265 std::pair<iterator, bool> insert(T* 값)
266 {
267 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
268 auto table = m_obj->get_target_table(m_key);
269 internal::bridge::obj m_obj;
270 만약 constexpr (managed<T>:: 스키마.HasPrimaryKeyProperty) {
271 auto pk = (*value).*(managed<T>::schema.primary_key().ptr);
272 m_obj = table.create_object_with_primary_key(영역::internal::bridge::mixed(serialize(pk.value)));
273 } 기타 {
274 m_obj = table.create_object();
275 }
276 std:: 적용([&m_obj, &value, 영역 = *m_realm](auto && ...p) {
277 (접근자<typename std::decay_t<decltype(p)>::Result>:: 설정하다(
278 m_obj, m_obj.get_table().get_column_key(p.name), Realm,
279 (*value).*(std::decay_t<decltype(p)>::ptr)), ...);
280 }, managed<T, 무효>:: 스키마.ps);
281 if (!managed<T>::schema.is_embedded()) {
282 set.insert(m_obj.get_key());
283 }
284 std::pair<size_t, bool> res = 설정하다.insert(m_obj.get_key());
285 return std::pair<iterator, bool>(iterator(res.first, this), res.second);
286 }
287
288 iterator insert(const iterator&, T* 값)
289 {
290 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
291 auto table = m_obj->get_target_table(m_key);
292 internal::bridge::obj m_obj;
293 만약 constexpr (managed<T>:: 스키마.HasPrimaryKeyProperty) {
294 auto pk = (*value).*(managed<T>::schema.primary_key().ptr);
295 m_obj = table.create_object_with_primary_key(영역::internal::bridge::mixed(serialize(pk.value)));
296 } 기타 {
297 m_obj = table.create_object();
298 }
299 std:: 적용([&m_obj, &value, 영역 = *m_realm](auto && ...p) {
300 (접근자<typename std::decay_t<decltype(p)>::Result>:: 설정하다(
301 m_obj, m_obj.get_table().get_column_key(p.name), Realm,
302 (*value).*(std::decay_t<decltype(p)>::ptr)), ...);
303 }, managed<T, 무효>:: 스키마.ps);
304 std::pair<size_t, bool> res = 설정하다.insert(m_obj.get_key());
305 return iterator(res.first, this);
306 }
307
308 std::pair<iterator, bool> insert(const managed<T>& value)
309 {
310 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
311 std::pair<size_t, bool> res = 설정하다.insert(value.m_obj.get_key());
312 return std::pair<iterator, bool>(iterator(res.first, this), res.second);
313
314 }
315
316 iterator insert(const iterator&, const managed<T>& value)
317 {
318 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
319 std::pair<size_t, bool> res = 설정하다.insert(value.m_obj.get_key());
320 return iterator(res.first, this);
321 }
322
323 std::pair<iterator, bool> insert(const managed<T*>& value)
324 {
325 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
326 std::pair<size_t, bool> res = 설정하다.insert(value.m_obj.get_key());
327 return std::pair<iterator, bool>(iterator(res.first, this), res.second);
328
329 }
330
331 iterator insert(const iterator&, const managed<T*>& value)
332 {
333 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
334 std::pair<size_t, bool> res = 설정하다.insert(value.m_obj.get_key());
335 return iterator(res.first, this);
336 }
337
338 iterator find(const managed<T>& v)
339 {
340 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
341 size_t idx = 설정하다.find(v.m_obj.get_key());
342 if (idx == 영역::not_in_collection)
343 return iterator(size(), this);
344 return iterator(idx, this);
345 }
346
347 반복자 find(const managed<T*>& v)
348 {
349 auto 설정하다 = internal::bridge:: 설정하다(*m_realm, *m_obj, m_key);
350 size_t idx = 설정하다.find(v.m_obj->get_key());
351 if (idx == 영역::not_in_collection)
352 return iterator(size(), this);
353 return iterator(idx, this);
354 }
355 무효 clear() {
356 internal::bridge::set(*m_realm, *m_obj, m_key).remove_all();
357 }
358
359 size_t size()
360 {
361 return internal::bridge:: 설정하다(*m_realm, *m_obj, m_key).size();
362 }
363
364 private:
365 managed() = 기본값;
366 managed(const managed&) = delete;
367 managed(managed &&) = 삭제;
368 managed& 연산자=(const managed&) = 삭제;
369 managed& operator=(managed&&) = delete;
370 템플릿<typename, typename>
371 친구 구조체 managed;
372 };
373} // 네임스페이스 영역
374
375#endif//CPPREALM_MANAGED_SET_HPP
정의: 관찰.hpp:176
정의: 매크로.hpp:286
정의: obj.hpp:62
정의: 알림.hpp:38