Realm C++ SDK版本 v 2.2.0

managed_numeric.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// 除非适用法律要求或书面同意,否则软件
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 template <>
27 struct 托管 <int 64 _t> : Managed_base {
28 运用 managed <int 64 _t>::managed_base::operator=;
29
30 Managed_base & 操作符 =( const int 64 _t& v) {
31 this->m_obj->template set<int 64 _t>(m_key, v);
32 return * this ;
33 }
34
35 [[nodiscard]] int 64 _t detach() const {
36 return m_obj->template get<int64_t>(m_key);
37 }
38
39 [[nodiscard]] int 64 _t 操作符 *() const {
40 return detach();
41 }
42
43 [[nodiscard]] 操作符 int 64 _t() const {
44 return detach();
45 }
46
47 template < 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, (int 64 _t)rhs);
51 }
52 返回序列化(分离())== rhs;
53 }
54
55 template < 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, (int 64 _t)rhs);
59 }
60 返回序列化(分离())!= rhs;
61 }
62
63 template < 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, (int 64 _t)rhs);
67 }
68 返回序列化(分离())> rhs;
69 }
70
71 template < 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, (int 64 _t)rhs);
75 }
76 返回序列化(分离())< rhs;
77 }
78
79 template < 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, (int 64 _t)rhs);
83 }
84 返回序列化(分离())> = rhs ;
85 }
86
87 template < 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, (int 64 _t)rhs);
91 }
92 返回序列化(分离())<= rhs;
93 }
94
95 Managed & Operator+=( const int 64 _t& o) {
96 auto old_val = m_obj->template get<int 64 _t>(m_key);
97 m_obj->template 设立<int 64 _t>(this->m_key, old_val + o);
98 return * this ;
99 }
100 void Operator++( int ) {
101 auto old_val = m_obj->template get<int 64 _t>(m_key);
102 m_obj->template 设立<int 64 _t>(this->m_key, old_val + 1 );
103 }
104 void Operator++() {
105 auto old_val = m_obj->template get<int 64 _t>(m_key);
106 m_obj->template 设立<int 64 _t>(this->m_key, old_val + 1 );
107 }
108 托管 & 操作符-=( const int 64 _t& o) {
109 auto old_val = m_obj->template get<int 64 _t>(m_key);
110 m_obj->template 设立<int 64 _t>(this->m_key, old_val - o);
111 return * this ;
112 }
113 void 操作符--( int ) {
114 auto old_val = m_obj->template get<int 64 _t>(m_key);
115 m_obj->template 设立<int 64 _t>(this->m_key, old_val - 1 );
116 }
117 void操作符--() {
118 auto old_val = m_obj->template get<int 64 _t>(m_key);
119 m_obj->template 设立<int 64 _t>(this->m_key, old_val - 1 );
120 }
121 Managed & Operator*=( const int 64 _t& o) {
122 auto old_val = m_obj->template get<int 64 _t>(m_key);
123 m_obj->template 设立<int 64 _t>(this->m_key, old_val * o);
124 return * this ;
125 }
126
127 private :
128 托管() = 默认;
129 托管 ( const 托管 &) = delete ;
130 托管 ( 托管 &&) = delete ;
131 托管 & 操作符=( const 托管 &) = delete ;
132 托管 & 操作符=( 托管 &&) = delete ;
133 template < typename , typename >
134 朋友 struct 托管
135 };
136
137 template <>
138 struct 托管 <double> : Managed_base {
139 运用 托管 < 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 & Operator =( const int & v) {
147 this->m_obj->template 设立<double>(m_key, ( double )v);
148 return * this ;
149 }
150
151 [[nodiscard]] double detach() const {
152 return m_obj->template get<double>(m_key);
153 }
154
155 double 操作符 *() const {
156 return detach();
157 }
158 [[nodiscard]]操作符double() const {
159 return detach();
160 }
161
162 template < typename T>
163 std::enable_if_t< std::disjunction_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 返回序列化(分离())== rhs;
168 }
169
170 template < typename T>
171 std::enable_if_t< std::disjunction_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 返回序列化(分离())!= rhs;
176 }
177
178 template < typename T>
179 std::enable_if_t< std::disjunction_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 返回序列化(分离())> rhs;
184 }
185
186 template < typename T>
187 std::enable_if_t< std::disjunction_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 返回序列化(分离())< rhs;
192 }
193
194 template < typename T>
195 std::enable_if_t< std::disjunction_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 返回序列化(分离())> = rhs ;
200 }
201
202 template < typename T>
203 std::enable_if_t< std::disjunction_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 返回序列化(分离())<= rhs;
208 }
209
210 void Operator+=( const double & o) {
211 auto old_val = m_obj->template get<double>(m_key);
212 m_obj->template set<double>(this->m_key, old_val + o);
213 }
214 void Operator++( int ) {
215 auto old_val = m_obj->template get<double>(m_key);
216 m_obj->template set<double>(this->m_key, old_val + 1.0 );
217 }
218 void Operator++() {
219 auto old_val = m_obj->template get<double>(m_key);
220 m_obj->template set<double>(this->m_key, old_val + 1.0 );
221 }
222 void Operator-=( const double & o) {
223 auto old_val = m_obj->template get<double>(m_key);
224 m_obj->template 设立<double>(this->m_key, old_val - o);
225 }
226 void 操作符--( int ) {
227 auto old_val = m_obj->template get<double>(m_key);
228 m_obj->template 设立<double>(this->m_key, old_val - 1.0 );
229 }
230 void操作符--() {
231 auto old_val = m_obj->template get<double>(m_key);
232 m_obj->template 设立<double>(this->m_key, old_val - 1.0 );
233 }
234 void 操作符*=( const double & o) {
235 auto old_val = m_obj->template get<double>(m_key);
236 m_obj->template set<double>(this->m_key, old_val * o);
237 }
238
239 private :
240 托管() = 默认;
241 托管 ( const 托管 &) = delete ;
242 托管 ( 托管 &&) = delete ;
243 托管 & 操作符=( const 托管 &) = delete ;
244 托管 & 操作符=( 托管 &&) = delete ;
245 template < typename , typename >
246 朋友 struct 托管
247 };
248
249 template <>
250 struct 托管 <bool> : Managed_base {
251 运用 托管 < bool >::managed_base:: 操作符=;
252
253 [[nodiscard]] bool detach() const {
254 return m_obj->template get<bool>(m_key);
255 }
256 [[nodiscard]] 操作符 bool() const {
257 return detach();
258 }
259 bool Operator *() const {
260 return detach();
261 }
262
263 rbool Operator==( const bool & rhs) const noException ;
264 rbool操作符!=( const bool & rhs) const noException ;
265
266 private :
267 托管() = 默认;
268 托管 ( const 托管 &) = delete ;
269 托管 ( 托管 &&) = delete ;
270 托管 & 操作符=( const 托管 &) = delete ;
271 托管 & 操作符=( 托管 &&) = delete ;
272 template < typename , typename >
273 朋友 struct 托管
274 };
275
276#define CPP_REALM_MANAGED_OPTIONAL_NUMERIC(type) \
277 template<> \
278 struct 托管<std::Optional<type>> : Managed_base { \
279 using 托管<std::Optional<type>>::Managed_base:: 操作符=; \
280 \
281 托管<std::Optional<type>>& 操作符 =(const double& v) { \
282 this->m_obj->template set<type>(m_key, v); \
283 return *this; \
284 } \
285 \
286 托管<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> 分离() const { \
292 return m_obj->get_optional<type>(m_key); \
293 } \
294\
295 [[nodiscard]] std::Optional<type> Operator *() 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 void Operator+=(const type& o) { \
304 auto old_val = m_obj->get_Optional<type>(m_key); \
305 if (!old_val) { \
306throw std::runtime_error("无法对 null 值执行算术。" ); \
307 } \
308 m_obj->template set<type>(this->m_key, (*old_val) + o); \
309 } \
310 void Operator++(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->template 设立<type>(this->m_key, (*old_val) + 1 ); \
316 } \
317 void 操作符-=(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->template 设立<type>(this->m_key, (*old_val) - o); \
323 } \
324 void 操作符--(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->template 设立<type>(this->m_key, (*old_val) - 1 ); \
330 } \
331 void 操作符*=(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->template set<type>(this->m_key, (*old_val) * o); \
337 } \
338 void 操作符*(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->template set<type>(this->m_key, (*old_val) * o); \
344 } \
345 void 操作符/(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->template set<type>(this->m_key, (*old_val) / o); \
351 } \
352 private: \
353 托管() = 默认; \
354 托管(const Managed&) = 删除; \
355 托管(托管 &&) = 删除; \
356 Managed& 操作符=(const Managed&) = 删除; \
357 Managed& 操作符=(managed&&) = 删除; \
358 template<typename, typename> \
359友元结构托管; \
360 }; \
361
362 CPP_REALM_MANAGED_OPTIONAL_NUMERIC(int 64 _t)
363 CPP_REALM_MANAGED_OPTIONAL_NUMERIC( double )
364
365 template <>
366 struct 托管 <std::Optional<bool>> : Managed_base {
367 运用 托管 <std::Optional<bool>>::managed_base:: 操作符=;
368
369 [[nodiscard]] std::Optional<bool> detach() 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 detach();
第 379 章
380
381 rbool 操作符==( const std::Optional<bool>& rhs) const noException ;
382 rbool操作符!=( const std::Optional<bool>& rhs) const noException ;
383
384 private :
385 托管() = 默认;
386 托管 ( const 托管 &) = delete ;
387 托管 ( 托管 &&) = delete ;
388 托管 & 操作符=( const 托管 &) = delete ;
389 托管 & 操作符=( 托管 &&) = delete ;
390 template < typename , typename >
391 朋友 struct 托管
392 };
393
394 template < typename T>
395 struct 托管 <T, std::enable_if_t<std:: is_enum_v<T> >> : publicmanaged_base {
396 托管<T> & 操作符 =( const T& v) {
397 m_obj->template 设立<int 64 _t>(m_key, static_cast< int 64 _t > (v));
398 return * this ;
第 399 章
400
401 [[nodiscard]] T 分离 () const {
402 return static_cast< T > (m_obj->get<int 64 _t>(m_key));
403 }
404
405 [[nodiscard]] T操作符*() const {
406 return detach();
407 }
408
409 [[nodiscard]]操作符T() const {
410 return detach();
411 }
412
413 //MARK:-比较操作符
414 rbool 操作符==(const T& rhs) const noException {
415 if (this->m_rbool_query) {
416 return this->查询>equal(m_key,serialize(rhs));
417 }
418 return detach() == rhs;
419 }
420 rbool操作符!=( const T& rhs) const noException {
第 421 章 if (this->m_rbool_query) {
第 422 章 return this->m_rbool_query->not_equal(m_key,serialize(rhs));
423 }
424 return detach() != rhs;
425 }
426 rbool Operator>( 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 detach() < 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 detach() <= rhs;
449 }
450
第 451 章 private :
第 452 章 托管() = 默认;
453 托管 ( const 托管 &) = delete ;
第 454 章 托管 ( 托管 &&) = delete ;
455 托管 & 操作符=( const 托管 &) = delete ;
第 456 章 托管 & 操作符=( 托管 &&) = delete ;
第 457 章 template < typename , typename >
第 458 章 朋友 struct 托管
459 };
460
第 461 章 template < typename T>
第 462 章 struct 托管 <std::Optional,<T> std::enable_if_t<std:: is_enum_v<T> >> : publicmanaged_base {
第 463 章 托管<std::Optional<T> >& 操作符 =( const std::Optional<T>& v) {
第 464 章 if (v) {
465 m_obj->template 设立<std::Optional<int 64 _t>>(m_key, static_cast< int 64 _t > (*v));
466 } else {
467 m_obj->set_null(m_key);
468 }
469 return * this ;
470 }
第 471 章
472 [[nodiscard]] std::可选<T> 分离() const {
473 if ( auto v = m_obj->get_Optional<int 64 _t>(m_key)) {
474 return static_cast< T > (*v);
475 }
476 return std::nullopt;
477 }
478
479 [[nodiscard]] std::Optional<T> 操作符 *() const {
480 return detach();
481 }
482
483 [[nodiscard]]操作符std::Optional<T>() const {
484 return detach();
485 }
486
487 //MARK:-比较操作符
488 rbool 操作符==( const std::Optional<T>& rhs) const noException {
489 if (this->m_rbool_query) {
490 return this->查询>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->m_rbool_query->not_equal(m_key,serialize(rhs));
497 }
498 return detach() != rhs;
499 }
500 rbool Operator>( 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 detach() < 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 detach() <= rhs;
523 }
524
525 private :
526 托管() = 默认;
527 托管 ( const 托管 &) = delete ;
528 托管 ( 托管 &&) = delete ;
529 托管 & 操作符=( const 托管 &) = delete ;
530 托管 & 操作符=( 托管 &&) = delete ;
531 template < typename , typename >
532 朋友 struct 托管
533 };
534 } // 命名空间 Realm
535
536#endif//CPREALM_MANAGED_NUMERIC_HPP
定义: rbool.hpp:36
定义: macros.hpp:286
定义: obj.hpp:62