Realm C++ SDK 버전 v2.2.0

managed_numeric.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_NUMERIC_HPP
20#define CPPREALM_MANAGED_NUMERIC_HPP
21
22#include <cpprealm/macros.hpp>
23#include <cpprealm/rbool.hpp>
24
25네임스페이스 영역 {
26 템플릿<>
27 구조체 managed<int64_t> : managed_base {
28 사용 관리되는<int64_t>::managed_base::operator=;
29
30 managed_base& 연산자 =(const int64_t& v) {
31 this->m_obj-> template set<int64_t>(m_key, v);
32 return *this;
33 }
34
35 [[nodiscard]] int64_t fetch() const {
36 return m_obj->템플릿 get<int64_t>(m_key);
37 }
38
39 [[nodiscard]] int64_t 연산자 *() const {
40 return fetch();
41 }
42
43 [[nodiscard]] 연산자 int64_t() const {
44 return fetch();
45 }
46
47 템플릿<typename T>
48 std::enable_if_t<std::is_integral_v<T>, rbool> 연산자==(const T& rhs) const noException {
49 if (This->m_rbool_query) {
50 return this->m_rbool_query->equal(m_key, (int64_t)rhs);
51 }
52 return serialize( Attach()) == rhs;
53 }
54
55 템플릿<typename T>
56 std::enable_if_t<std::is_integral_v<T>, rbool> operator!=(const T& rhs) const noException {
57 if (This->m_rbool_query) {
58 return this->m_rbool_query->not_equal(m_key, (int64_t)rhs);
59 }
60 return serialize( Attach()) != rhs;
61 }
62
63 템플릿<typename T>
64 std::enable_if_t<std::is_integral_v<T>, rbool> 연산자>(const T& rhs) const noException {
65 if (This->m_rbool_query) {
66 return this->m_rbool_query->greater(m_key, (int64_t)rhs);
67 }
68 return 직렬화(분리()) > rhs;
69 }
70
71 템플릿<typename T>
72 std::enable_if_t<std::is_integral_v<T>, rbool> 연산자<(const T& rhs) const noException {
73 if (This->m_rbool_query) {
74 return this->m_rbool_query->less(m_key, (int64_t)rhs);
75 }
76 return 직렬화(분리()) < rhs;
77 }
78
79 템플릿<typename T>
80 std::enable_if_t<std::is_integral_v<T>, rbool> operator>=(const T& rhs) const noException {
81 if (This->m_rbool_query) {
82 return this->m_rbool_query->greater_equal(m_key, (int64_t)rhs);
83 }
84 return serialize( Attach()) >= rhs;
85 }
86
87 템플릿<typename T>
88 std::enable_if_t<std::is_integral_v<T>, rbool> 연산자<=(const T& rhs) const noException {
89 if (This->m_rbool_query) {
90 return this->m_rbool_query->less_equal(m_key, (int64_t)rhs);
91 }
92 return serialize( Attach()) <= rhs;
93 }
94
95 managed& operator+=(const int64_t& o) {
96 auto old_val = m_obj-> template get<int64_t>(m_key);
97 m_obj->템플릿 설정하다<int64_t>(This->m_key, old_val + o);
98 return *this;
99 }
100 무효 연산자++(int) {
101 auto old_val = m_obj-> template get<int64_t>(m_key);
102 m_obj->템플릿 설정하다<int64_t>( this->m_key, old_val + 1);
103 }
104 무효 연산자++() {
105 auto old_val = m_obj-> template get<int64_t>(m_key);
106 m_obj->템플릿 설정하다<int64_t>( this->m_key, old_val + 1);
107 }
108 managed& 연산자-=(const int64_t& o) {
109 auto old_val = m_obj-> template get<int64_t>(m_key);
110 m_obj->템플릿 설정하다<int64_t>(This->m_key, old_val - o);
111 return *this;
112 }
113 무효 연산자--(int) {
114 auto old_val = m_obj-> template get<int64_t>(m_key);
115 m_obj->템플릿 설정하다<int64_t>( this->m_key, old_val - 1);
116 }
117 무효 연산자--() {
118 auto old_val = m_obj-> template get<int64_t>(m_key);
119 m_obj->템플릿 설정하다<int64_t>( this->m_key, old_val - 1);
120 }
121 managed& operator*=(const int64_t& o) {
122 auto old_val = m_obj-> template get<int64_t>(m_key);
123 m_obj->템플릿 설정하다<int64_t>(This->m_key, old_val * o);
124 return *this;
125 }
126
127 private:
128 managed() = 기본값;
129 managed(const managed&) = delete;
130 managed ( managed &&) = delete ;
131 managed& 연산자=(const managed&) = delete;
132 managed& 연산자=(managed&&) = delete;
133 템플릿<typename, typename>
134 친구 구조체 managed 됨 ;
135 };
136
137 템플릿<>
138 구조체 managed<double> : managed_base {
139 사용 managed<double>::managed_base:: 연산자=;
140
141 managed_base& 연산자 =(const double& v) {
142 this->m_obj-> template set<double>(m_key, v);
143 return *this;
144 }
145
146 managed_base& 연산자 =(const int& v) {
147 this->m_obj-> 템플릿 설정하다<double>(m_key, (double)v);
148 return *this;
149 }
150
151 [[nodiscard]] double fetch() const {
152 return m_obj->템플릿 get<double>(m_key);
153 }
154
155 double 연산자 *() const {
156 return fetch();
157 }
158 [[nodiscard]] 연산자 double() const {
159 return fetch();
160 }
161
162 템플릿<typename T>
163 std::enable_if_t< std::disjoint_v<std::is_integral<T>, std::is_floating_point<T>>, rbool> 연산자==(const T& rhs) const noException {
164 if (This->m_rbool_query) {
165 return this->m_rbool_query->equal(m_key, (double)rhs);
166 }
167 return serialize( Attach()) == rhs;
168 }
169
170 템플릿<typename T>
171 std::enable_if_t< std::dis Junction_v<std::is_integral<T>, std::is_floating_point<T>>, rbool> 연산자!=(const T& rhs) const noException {
172 if (This->m_rbool_query) {
173 return this->m_rbool_query->not_equal(m_key, (double)rhs);
174 }
175 return serialize( Attach()) != rhs;
176 }
177
178 템플릿<typename T>
179 std::enable_if_t< std::dis Junction_v<std::is_integral<T>, std::is_floating_point<T>>, rbool> 연산자>(const T& rhs) const noException {
180 if (This->m_rbool_query) {
181 return this->m_rbool_query->greater(m_key, (double)rhs);
182 }
183 return 직렬화(분리()) > rhs;
184 }
185
186 템플릿<typename T>
187 std::enable_if_t< std::dis Junction_v<std::is_integral<T>, std::is_floating_point<T>>, rbool> 연산자<(const T& rhs) const noException {
188 if (This->m_rbool_query) {
189 return this->m_rbool_query->less(m_key, (double)rhs);
190 }
191 return 직렬화(분리()) < rhs;
192 }
193
194 템플릿<typename T>
195 std::enable_if_t< std::disjoint_v<std::is_integral<T>, std::is_floating_point<T>>, rbool> 연산자>=(const T& rhs) const noException {
196 if (This->m_rbool_query) {
197 return this->m_rbool_query->greater_equal(m_key, (double)rhs);
198 }
199 return serialize( Attach()) >= rhs;
200 }
201
202 템플릿<typename T>
203 std::enable_if_t< std::dis Junction_v<std::is_integral<T>, std::is_floating_point<T>>, rbool> 연산자<=(const T& rhs) const noException {
204 if (This->m_rbool_query) {
205 return this->m_rbool_query->less_equal(m_key, (double)rhs);
206 }
207 return serialize( Attach()) <= rhs;
208 }
209
210 무효 연산자+=(const double& o) {
211 auto old_val = m_obj-> Template get<double>(m_key);
212 m_obj->템플릿 세트<double>( this->m_key, old_val + o);
213 }
214 무효 연산자++(int) {
215 auto old_val = m_obj-> Template get<double>(m_key);
216 m_obj->템플릿 세트<double>( this->m_key, old_val + 1.0);
217 }
218 무효 연산자++() {
219 auto old_val = m_obj-> Template get<double>(m_key);
220 m_obj->템플릿 세트<double>( this->m_key, old_val + 1.0);
221 }
222 무효 연산자-=(const double& o) {
223 auto old_val = m_obj-> Template get<double>(m_key);
224 m_obj->템플릿 설정하다<double>(This->m_key, old_val - o);
225 }
226 무효 연산자--(int) {
227 auto old_val = m_obj-> Template get<double>(m_key);
228 m_obj->템플릿 설정하다<double>( this->m_key, old_val - 1.0);
229 }
230 무효 연산자--() {
231 auto old_val = m_obj-> Template get<double>(m_key);
232 m_obj->템플릿 설정하다<double>( this->m_key, old_val - 1.0);
233 }
234 무효 연산자*=(const double& o) {
235 auto old_val = m_obj-> Template get<double>(m_key);
236 m_obj->템플릿 세트<double>( this->m_key, old_val * o);
237 }
238
239 private:
240 managed() = 기본값;
241 managed(const managed&) = delete;
242 managed ( managed &&) = delete ;
243 managed& 연산자=(const managed&) = delete;
244 managed& 연산자=(managed&&) = delete;
245 템플릿<typename, typename>
246 친구 구조체 managed 됨 ;
247 };
248
249 템플릿<>
250 구조체 managed<bool> : managed_base {
251 사용 managed<bool>::managed_base:: 연산자=;
252
253 [[nodiscard]] bool fetch() const {
254 return m_obj->템플릿 get<bool>(m_key);
255 }
256 [[nodiscard]] 연산자 bool() const {
257 return fetch();
258 }
259 bool 연산자 *() const {
260 return fetch();
261 }
262
263 rbool operator==(const bool& rhs) const noException;
264 rbool 연산자!=(const bool& rhs) const noException;
265
266 private:
267 managed() = 기본값;
268 managed(const managed&) = delete;
269 managed ( managed &&) = delete ;
270 managed& 연산자=(const managed&) = delete;
271 managed& 연산자=(managed&&) = delete;
272 템플릿<typename, typename>
273 친구 구조체 managed 됨 ;
274 };
275
276#define CPP_REALM_MANAGED_OPTIONAL_NUMERIC(type) \
277 template<> \
278 struct managed<std::optional<type>> : managed_base { \
279 managed<std::optional<type>>::managed_base:: 연산자=; \
280 \
281 managed<std::optional<type>>& 연산자 =(const double& v) { \
282 this->m_obj-> template set<type>(m_key, v); \
283 return * this; \
284 } \
285 \
286 managed<std::optional<type>>& 연산자 =(const int& v) { \
287 this->m_obj-> template set<type>(m_key, (double)v); \
288 return * this; \
289 } \
290 \
291 [[nodiscard]] std::optional<type> breaker() const { \
292 return m_obj->get_optional<type>(m_key); \
293 } \
294\
295 [[nodiscard]] std::optional<type> 연산자 *() const { \
296 return detach(); \
297 } \
298 [[nodiscard]] 연산자 std::optional<type>() const { \
299 return detach(); \
300 } \
301 rbool 연산자==(const std::optional<type>& rhs) const noException; \
302 rbool 연산자!=(const std::optional<type>& rhs) const noException; \
303 무효 연산자+=(const type& o) { \
304 auto old_val = m_obj->get_optional<type>(m_key); \
305 if (!old_val) { \
306 throw std::runtime_error("null 값에 대해 연산을 수행할 수 없습니다."); \
307 } \
308 m_obj->템플릿 세트<type>(This->m_key, (*old_val) + o); \
309 } \
310 무효 연산자++(int) { \
311 auto old_val = m_obj->get_optional<type>(m_key); \
312 if (!old_val) { \
313 throw std::runtime_error("null 값에 대해 산술을 수행할 수 없습니다."); \
314 } \
315 m_obj->템플릿 설정하다<type>( this->m_key, (*old_val) + 1); \
316 } \
317 무효 연산자-=(const type& o) { \
318 auto old_val = m_obj->get_optional<type>(m_key); \
319 if (!old_val) { \
320 throw std::runtime_error("null 값에 대해 산술을 수행할 수 없습니다."); \
321 } \
322 m_obj->템플릿 설정하다<type>(This->m_key, (*old_val) - o); \
323 } \
324 무효 연산자--(int) { \
325 auto old_val = m_obj->get_optional<type>(m_key); \
326 if (!old_val) { \
327 throw std::runtime_error("null 값에 대해 산술을 수행할 수 없습니다."); \
328 } \
329 m_obj->템플릿 설정하다<type>(This->m_key, (*old_val) - 1); \
330 } \
331 무효 연산자*=(const type& o) { \
332 auto old_val = m_obj->get_optional<type>(m_key); \
333 if (!old_val) { \
334 throw std::runtime_error("null 값에 대해 산술을 수행할 수 없습니다."); \
335 } \
336 m_obj->템플릿 세트<type>( this->m_key, (*old_val) * o); \
337 } \
338 무효 연산자*(const type& o) { \
339 auto old_val = m_obj->get_optional<type>(m_key); \
340 if (!old_val) { \
341 throw std::runtime_error("null 값에 대해 산술을 수행할 수 없습니다."); \
342 } \
343 m_obj->템플릿 세트<type>( this->m_key, (*old_val) * o); \
344 } \
345 무효 연산자/(const type& o) { \
346 auto old_val = m_obj->get_optional<type>(m_key); \
347 if (!old_val) { \
348 throw std::runtime_error("null 값에 대해 산술을 수행할 수 없습니다."); \
349 } \
350 m_obj->템플릿 세트<type>( this->m_key, (*old_val) / o); \
351 } \
352 비공개: \
353 managed() = 기본값; \
354 managed(const managed&) = 삭제; \
355 managed(managed &&) = 삭제; \
356 managed& 연산자=(const managed&) = 삭제; \
357 managed& 연산자=(managed&&) = 삭제; \
358 template<typename, typename> \
359 친구 구조체 managed 됨 ; \
360 }; \
361
362CPP_REALM_MANAGED_OPTIONAL_NUMERIC(int64_t)
363CPP_REALM_MANAGED_OPTIONAL_NUMERIC(double)
364
365 템플릿<>
366 구조체 managed<std::optional<bool>> : managed_base {
367 사용 managed<std::optional<bool>>::managed_base:: 연산자=;
368
369 [[nodiscard]] std::optional<bool> fetch() const {
370 return m_obj-> Template get_optional<bool>(m_key);
371 }
372
373 [[nodiscard]] 연산자 std::optional<bool>() const {
374 return m_obj-> Template get_optional<bool>(m_key);
375 }
376
377 std::optional<bool> 연산자 *() const {
378 return fetch();
379 }
380
381 rbool 연산자==(const std::optional<bool>& rhs) const noException;
382 rbool 연산자!=(const std::optional<bool>& rhs) const noException;
383
384 private:
385 managed() = 기본값;
386 managed(const managed&) = delete;
387 managed ( managed &&) = delete ;
388 managed& 연산자=(const managed&) = delete;
389 managed& 연산자=(managed&&) = delete;
390 템플릿<typename, typename>
391 친구 구조체 managed 됨 ;
392 };
393
394 템플릿 <typename T>
395 구조체 managed<T, std::enable_if_t<std::is_enum_v<T>>> : public managed_base {
396 managed<T>& 연산자 =(const T& v) {
397 m_obj->템플릿 설정하다<int64_t>(m_key, static_cast<int64_t>(v));
398 return *this;
399 }
400
401 [[nodiscard]] T fetch() const {
402 반환 static_cast<T>(m_obj->get<int64_t>(m_key));
403 }
404
405 [[nodiscard]] T 연산자 *() const {
406 return fetch();
407 }
408
409 [[nodiscard]] 연산자 T() const {
410 return fetch();
411 }
412
413 //MARK: - 비교 연산자
414 rbool 연산자==(const T& rhs) const noException {
415 if (This->m_rbool_query) {
416 return this->m_rbool_query->equal(m_key, serialize(rhs));
417 }
418 return detach() == rhs;
419 }
420 rbool 연산자!=(const T& rhs) const no exception {
421 if (This->m_rbool_query) {
422 return this->쿼리>not_equal(m_key, serialize(rhs));
423 }
424 return detach() != rhs;
425 }
426 rbool 연산자>(const T& rhs) const noException {
427 if (This->m_rbool_query) {
428 return this->m_rbool_query->greater(m_key, serialize(rhs));
429 }
430 return detach() > rhs;
431 }
432 rbool 연산자<(const T& rhs) const noException {
433 if (This->m_rbool_query) {
434 return this->m_rbool_query->greater(m_key, serialize(rhs));
435 }
436 return fetch() < rhs;
437 }
438 rbool 연산자>=(const T& rhs) const noException {
439 if (This->m_rbool_query) {
440 return this->m_rbool_query->greater_equal(m_key, serialize(rhs));
441 }
442 return detach() >= rhs;
443 }
444 rbool 연산자<=(const T& rhs) const noException {
445 if (This->m_rbool_query) {
446 return this->m_rbool_query->less_equal(m_key, serialize(rhs));
447 }
448 return fetch() <= rhs;
449 }
450
451 private:
452 managed() = 기본값;
453 managed(const managed&) = delete;
454 managed ( managed &&) = delete ;
455 managed& 연산자=(const managed&) = delete;
456 managed& 연산자=(managed&&) = delete;
457 템플릿<typename, typename>
458 친구 구조체 managed 됨 ;
459 };
460
461 템플릿 <typename T>
462 구조체 managed<std::optional<T>, std::enable_if_t<std::is_enum_v<T>>> : public managed_base {
463 managed<std::optional<T>>& 연산자 =(const std::optional<T>& v) {
464 if (v) {
465 m_obj->템플릿 설정하다<std::optional<int64_t>>(m_key, static_cast<int64_t>(*v));
466 } 기타 {
467 m_obj->set_null(m_key);
468 }
469 return *this;
470 }
471
472 [[nodiscard]] std::optional<T> fetch() const {
473 if (auto v = m_obj->get_optional<int64_t>(m_key)) {
474 반환 static_cast<T>(*v);
475 }
476 return std::nullopt;
477 }
478
479 [[nodiscard]] std::optional<T> 연산자 *() const {
480 return fetch();
481 }
482
483 [[nodiscard]] 연산자 std::optional<T>() const {
484 return fetch();
485 }
486
487 //MARK: - 비교 연산자
488 rbool 연산자==(const std::optional<T>& rhs) const noException {
489 if (This->m_rbool_query) {
490 return this->m_rbool_query->equal(m_key, serialize(rhs));
491 }
492 return detach() == rhs;
493 }
494 rbool 연산자!=(const std::optional<T>& rhs) const noException {
495 if (This->m_rbool_query) {
496 return this->쿼리>not_equal(m_key, serialize(rhs));
497 }
498 return detach() != rhs;
499 }
500 rbool 연산자>(const T& rhs) const noException {
501 if (This->m_rbool_query) {
502 return this->m_rbool_query->greater(m_key, rhs);
503 }
504 return detach() > rhs;
505 }
506 rbool 연산자<(const T& rhs) const noException {
507 if (This->m_rbool_query) {
508 return this->m_rbool_query->less(m_key, rhs);
509 }
510 return fetch() < rhs;
511 }
512 rbool 연산자>=(const T& rhs) const noException {
513 if (This->m_rbool_query) {
514 return this->m_rbool_query->greater_equal(m_key, rhs);
515 }
516 return detach() >= rhs;
517 }
518 rbool 연산자<=(const T& rhs) const noException {
519 if (This->m_rbool_query) {
520 return this->m_rbool_query->less_equal(m_key, rhs);
521 }
522 return fetch() <= rhs;
523 }
524
525 private:
526 managed() = 기본값;
527 managed(const managed&) = delete;
528 managed ( managed &&) = delete ;
529 managed& 연산자=(const managed&) = delete;
530 managed& 연산자=(managed&&) = delete;
531 템플릿<typename, typename>
532 친구 구조체 managed 됨 ;
533 };
534} // 네임스페이스 영역
535
536#endif//CPPREALM_MANAGED_NUMERIC_HPP
정의: rbool.hpp:36
정의: 매크로.hpp:286
정의: obj.hpp:62