Realm C++ SDK 버전 v2.2.0

rbool.hpp

1
2//
3//저작권 2022 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_RBOOL_HPP
20#define CPPREALM_RBOOL_HPP
21
22#include <cpprealm/internal/bridge/ 쿼리.hpp>
23#include <cpprealm/internal/bridge/realm.hpp>
24#include <cpprealm/internal/bridge/table.hpp>
25#include <cpprealm/internal/bridge/utils.hpp>
26#include <cpprealm/types.hpp>
27
28네임스페이스 영역 {
29 템플릿<typename>
30 struct Box_base;
31}
32
33네임스페이스 영역 {
34 // MARK: rbool
35
36 클래스 rbool {
37 public:
39 internal::bridge:: col_keyorigin_col_key;
40 std::string m_key;
41 };
42
43 rbool& add_link_chain(const internal::bridge::col_key& col_key) {
44 if (m_link_chain) {
45 m_link_chain->link(col_key);
46 } 기타 {
47 m_link_chain = m_table.get_link(col_key);
48 }
49 return *this;
50 }
51
52#define 정의_쿼리(유형, 비교) \
53 rbool& comparison(const internal::bridge::col_key& col_key, const std::optional<type>& rhs) { \
54 if (auto lc = m_link_chain) { \
55 q = lc->column<type>(col_key).comparison(rhs); \
56 m_link_chain = std::nullopt; \
57 } 다른 경우 (m_dictionary_ctx) { \
58 q = q.dictionary_link_subexpr(m_dictionary_ctx->origin_col_key, col_key, m_dictionary_ctx->m_key).comparison(rhs); \
59 m_dictionary_ctx = std::nullopt; \
60 } 기타 { \
61 if (rhs) { \
62 q = internal::bridge::query(q.get_table()).comparison(col_key, *rhs); \
63 } 기타 { \
64 q = internal::bridge::query(q.get_table()).comparison(col_key, std::nullopt); \
65 } \
66 } \
67 return * this; \
68 } \
69 rbool& comparison(const internal::bridge::col_key& col_key, const type& rhs) { \
70 if (auto lc = m_link_chain) { \
71 q = lc->column<type>(col_key).comparison(std::optional<type>(rhs)); \
72 m_link_chain = std::nullopt; \
73 } 다른 경우 (m_dictionary_ctx) { \
74 q = q.dictionary_link_subexpr(m_dictionary_ctx->origin_col_key, col_key, m_dictionary_ctx->m_key).comparison(std::optional<type>(rhs)); \
75 m_dictionary_ctx = std::nullopt; \
76 } 기타 { \
77 q = internal::bridge:: 쿼리(q.get_table()).comparison(col_key, rhs); \
78 } \
79 return * this; \
80 }
81
82#define describe_numeric_query(type, 비교) \
83 rbool& comparison(const internal::bridge::col_key& col_key, const type& rhs) { \
84 if (auto lc = m_link_chain) { \
85 q = lc->column<type>(col_key).comparison(:: 영역::serialize(std::optional<type>(rhs))); \
86 m_link_chain = std::nullopt; \
87 } 다른 경우 (m_dictionary_ctx) { \
88 q = q.dictionary_link_subexpr(m_dictionary_ctx->origin_col_key, col_key, m_dictionary_ctx->m_key).comparison(std::optional<type>(rhs)); \
89 m_dictionary_ctx = std::nullopt; \
90 } 기타 { \
91 q = internal::bridge:: 쿼리(q.get_table()).comparison(col_key, rhs); \
92 } \
93 return * this; \
94 }
95
96 describe_query(std::string, equal)
97 describe_query(std::string, not_equal)
98
99 rbool& contains(const internal::bridge::col_key& col_key, const std::string& rhs, bool case_센시티브 = true) {
100 if (auto lc = m_link_chain) {
101 q = lc->column<std::string>(col_key).contains(:: 영역::serialize(std::optional<std::string>(rhs)), 대소문자 구분);
102 m_link_chain = std::nullopt;
103 } 기타 {
104 q = internal::bridge:: 쿼리(q.get_table()).contains(col_key, rhs, 대소문자 구분);
105 }
106 return *this;
107 }
108
109 describe_query(int64_t, equal)
110 describe_query(int64_t, not_equal)
111 describe_numeric_query(int64_t, 보다 큼)
112 describe_numeric_query(int64_t, Less)
113 describe_numeric_query(int64_t,grer_equal)
114 describe_numeric_query(int64_t,less_equal)
115
116 define_query(bool, equal)
117 describe_query(bool, not_equal)
118
119 describe_query(double, equal)
120 describe_query(double, not_equal)
121 describe_numeric_query(double, large)
122 describe_numeric_query(double, Less)
123 describe_numeric_query(double, large_equal)
124 describe_numeric_query(double,less_equal)
125
126 describe_query(std::vector<uint8_t>, equal)
127 describe_query(std::vector<uint8_t>, not_equal)
128
129 describe_query(std::chrono::time_point<std::chrono::system_clock>, equal)
130 describe_query(std::chrono::time_point<std::chrono::system_clock>, not_equal)
131 define_numeric_query(std::chrono::time_point<std::chrono::system_clock>, 그보다 큼)
132 describe_numeric_query(std::chrono::time_point<std::chrono::system_clock>, Less)
133 define_numeric_query(std::chrono::time_point<std::chrono::system_clock>,grer_equal)
134 describe_numeric_query(std::chrono::time_point<std::chrono::system_clock>, Less_equal)
135
136 describe_query(uuid, equal)
137 정의_쿼리(uuid, not_equal)
138
139 define_query(object_id, equal)
140 describe_query(object_id, not_equal)
141
142 describe_query(decimal128, equal)
143 describe_query(decimal128, not_equal)
144 describe_numeric_query(decimal128, 보다 큼)
145 describe_numeric_query(decimal128, 덜)
146 describe_numeric_query(decimal128,grer_equal)
147 describe_numeric_query(decimal128,less_equal)
148
149 rbool& mixed_equal(const internal::bridge::col_key& col_key, const internal::bridge::mixed& rhs) {
150 if (auto lc = m_link_chain) {
151 q = lc->column<std::string>(col_key).mixed_equal(rhs);
152 m_link_chain = std::nullopt;
153 } 기타 {
154 q.equal(col_key, rhs);
155 }
156 return *this;
157 }
158
159 rbool& mixed_not_equal(const internal::bridge::col_key& col_key, const internal::bridge::mixed& rhs) {
160 if (auto lc = m_link_chain) {
161 q = lc->column_mixed(col_key).mixed_not_equal(rhs);
162 m_link_chain = std::nullopt;
163 } 기타 {
164 q.not_equal(col_key, rhs);
165 }
166 return *this;
167 }
168
169 rbool& link_equal(const internal::bridge::col_key& col_key, const std::optional<internal::bridge::obj>& rhs) {
170 if (auto lc = m_link_chain) {
171 q = lc->column<internal::bridge::obj>(col_key).equal(rhs);
172 m_link_chain = std::nullopt;
173 } 기타 {
174 if (rhs) {
175 q.links_to(col_key, *rhs);
176 } 기타 {
177 q.links_to(col_key, internal::bridge::obj());
178 }
179 }
180 return *this;
181 }
182
183 rbool& link_not_equal(const internal::bridge::col_key& col_key, const std::optional<internal::bridge::obj>& rhs) {
184 if (auto lc = m_link_chain) {
185 q = lc->column<internal::bridge::obj>(col_key).not_equal(rhs);
186 m_link_chain = std::nullopt;
187 } 기타 {
188 if (rhs) {
189 q.not_links_to(col_key, *rhs);
190 } 기타 {
191 q.not_links_to(col_key, internal::bridge::obj());
192 }
193 }
194 return *this;
195 }
196
197 // Dictionary
198
199 rbool& dictionary_has_value_for_key_equals(internal::bridge::col_key column_key, const std::string& key, const internal::bridge::mixed& value) {
200 q = internal::bridge:: 쿼리(q.get_table()).dictionary_has_value_for_key_equals(column_key, 키, 값);
201 return *this;
202 }
203
204 rbool& dictionary_has_value_for_key_not_equals(internal::bridge::col_key column_key, const std::string& key, const internal::bridge::mixed& value) {
205 q = internal::bridge:: 쿼리(q.get_table()).dictionary_has_value_for_key_not_equals(column_key, 키, 값);
206 return *this;
207 }
208
209 rbool& dictionary_has_value_for_key_greater_than(internal::bridge::col_key column_key, const std::string& key, const internal::bridge::mixed& value) {
210 q = internal::bridge:: 쿼리(q.get_table()).dictionary_has_value_for_key_greater_than(column_key, 키, 값);
211 return *this;
212 }
213
214 rbool& dictionary_has_value_for_key_less_than(internal::bridge::col_key column_key, const std::string& key, const internal::bridge::mixed& value) {
215 q = internal::bridge:: 쿼리(q.get_table()).dictionary_has_value_for_key_less_than(column_key, 키, 값);
216 return *this;
217 }
218
219 rbool& dictionary_has_value_for_key_greater_than_equals(internal::bridge::col_key column_key, const std::string& key, const internal::bridge::mixed& value) {
220 q = internal::bridge:: 쿼리(q.get_table()).dictionary_has_value_for_key_greater_than_equals(column_key, 키, 값);
221 return *this;
222 }
223
224 rbool& dictionary_has_value_for_key_less_than_equals(internal::bridge::col_key column_key, const std::string& key, const internal::bridge::mixed& value) {
225 q = internal::bridge:: 쿼리(q.get_table()).dictionary_has_value_for_key_less_than_equals(column_key, 키, 값);
226 return *this;
227 }
228
229 rbool& dictionary_contains_string_for_key(internal::bridge::col_key column_key, const std::string& key, const std::string& value) {
230 q = internal::bridge:: 쿼리(q.get_table()).dictionary_contains_string_for_key(column_key, 키, 값);
231 return *this;
232 }
233
234 rbool& add_dictionary_link_chain(dictionary_context&& ctx) {
235 m_dictionary_ctx = ctx;
236 return *this;
237 }
238
239 rbool& dictionary_has_key(internal::bridge::col_key column_key, const std::string& key) {
240 q = internal::bridge:: 쿼리(q.get_table()).dictionary_contains_key(column_key, 키);
241 return *this;
242 }
243
244 ~rbool() {
245 if (is_for_queries)
246 q.~ 쿼리();
247 }
248 연산자 bool() const {
249 b를 반환 합니다.
250 }
251 rbool 연산자!() const {
252 if (is_for_queries) {
253 q.negate();
254 return *this;
255 }
256 return !b;
257 }
258 union {
259 bool b;
260 mutable internal::bridge:: 쿼리 q;
261 };
262
263 rbool(internal::bridge:: 쿼리 &&q) : q(q), is_for_queries(true) {
264 m_table = q.get_table();
265 }
266 rbool(bool b) : b(b) {}
267 rbool(const rbool &r) {
268 if (r.is_for_queries) {
269 new (&q) internal::bridge:: 쿼리(rq);
270 is_for_queries = true;
271 } else
272 b = r.b;
273 }
274
275 private:
276 bool is_for_queries = false;
277 bool is_dictionary_link = false;
278 std::optional<internal::bridge::link_chain> m_link_chain;
279 internal::bridge::table m_table;
280 std::optional<dictionary_context> m_dictionary_ctx;
281
282 템플릿<typename T>
283 친구 구조체 결과
284 친구 rbool 연산자&&(const rbool &lhs, const rbool &rhs);
285 친구 rbool 연산자||(const rbool &lhs, const rbool &rhs);
286 };
287
288 인라인 rbool 연산자 &&(const rbool& lhs, const rbool& rhs) {
289 if (lhs.is_for_queries) {
290 lhs.q.and_query(rhs.q);
291 return lhs;
292 }
293 return lhs.b && rhs.b;
294 }
295 인라인 rbool 연산자 ||(const rbool& lhs, const rbool& rhs) {
296 if (lhs.is_for_queries) {
297 lhs.q = lhs.q || rhs.q;
298 return lhs;
299 }
300 return lhs.b && rhs.b;
301 }
302
304 템플릿<typename T>
305 인라인 rbool truepredicate(const T& o) {
306 // 빈 쿼리 는 모든 결과와 이를 나타내는 한 가지 방법을 반환합니다.
307 // 기능적으로 동일한 TRUEREDICATE를 직렬화하는 것입니다.
308 rbool* rb = internal::get_rbool(o);
309 if (rb == nullptr)
310 throw std::runtime_error("관리되는 객체 가 쿼리 컨텍스트에서 사용되지 않았습니다");
311 auto table = rb->q.get_table();
312 return rbool(table);
313 }
314
316 템플릿<typename T>
317 인라인 rbool falsepredicate(const T& o) {
318 rbool* rb = internal::get_rbool(o);
319 if (rb == nullptr)
320 throw std::runtime_error("관리되는 객체 가 쿼리 컨텍스트에서 사용되지 않았습니다");
321 auto table = rb->q.get_table();
322 auto q = internal::bridge:: 쿼리(table).and_query(internal::bridge:: 쿼리(table).falsepredicate());
323 return rbool(std::move(q));
324 }
325}
326
327#endif //CPPREALM_RBOOL_HPP
정의: rbool.hpp:36
정의: col_key.hpp:28