Realm C++ SDK 버전 v2.2.0

types.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_TYPES_HPP
20#define CPPREALM_TYPES_HPP
21
22#include <array>
23#include <optional>
24#include <set>
25#include <stdexcept>
26
27#include <cpprealm/internal/bridge/realm.hpp>
28#include <cpprealm/internal/bridge/schema.hpp>
29#include <cpprealm/internal/type_info.hpp>
30
31네임스페이스 영역 {
32
33 const size_t not_in_collection = -1;
34
35 구조체 uuid {
36 명시적 uuid(const std::string &);
37 uuid(const std:: 배열<uint8_t, 16>&);
38 uuid() = default;
39 [[nodiscard]] std::string to_string() const;
40 [[nodiscard]] std::string to_base64() const;
41 [[nodiscard]] std::array<uint8_t, 16> to_bytes() const;
44 친구 구조체 internal::bridge::uuid;
45 템플릿 <typename mapping_type>
46 친구 구조체 Box_base;
47 };
48
49 인라인 bool 연산자 ==(const uuid& lhs, const uuid& rhs) { return lhs.m_uuid == rhs.m_uuid; }
50 인라인 bool 연산자 !=(const uuid& lhs, const uuid& rhs) { return lhs.m_uuid != rhs.m_uuid; }
51 인라인 bool 연산자 >(const uuid& lhs, const uuid& rhs) { return lhs.m_uuid > rhs.m_uuid; }
52 인라인 bool 연산자 >=(const uuid& lhs, const uuid& rhs) { return lhs.m_uuid >= rhs.m_uuid; }
53 인라인 bool 연산자 <(const uuid& lhs, const uuid& rhs) { return lhs.m_uuid < rhs.m_uuid; }
54 인라인 bool 연산자 <=(const uuid& lhs, const uuid& rhs) { return lhs.m_uuid <= rhs.m_uuid; }
55
56 구조체 object_id {
57 명시적 object_id(const std::string &);
58 object_id() = 기본값;
59 [[nodiscard]] static object_id generate();
60 [[nodiscard]] std::string to_string() const;
63 친구 구조체 internal::bridge::object_id;
64 템플릿 <typename mapping_type>
65 친구 구조체 Box_base;
66 };
67
68 인라인 bool 연산자 ==(const object_id& lhs, const object_id& rhs) { return lhs.m_object_id == rhs.m_object_id; }
69 인라인 bool 연산자 !=(const object_id& lhs, const object_id& rhs) { return lhs.m_object_id != rhs.m_object_id; }
70 인라인 bool 연산자 <(const object_id& lhs, const object_id& rhs) { return lhs.m_object_id < rhs.m_object_id; }
71 인라인 bool 연산자 >(const object_id& lhs, const object_id& rhs) { return lhs.m_object_id > rhs.m_object_id; }
72 인라인 bool 연산자 <=(const object_id& lhs, const object_id& rhs) { return lhs.m_object_id <= rhs.m_object_id; }
73 인라인 bool 연산자 >=(const object_id& lhs, const object_id& rhs) { return lhs.m_object_id >= rhs.m_object_id; }
74
75 구조체 십진수128 {
76 명시적 십진수128(const std::string &);
77 십진수128(const double &);
78 십진수128() = 기본값;
79 [[nodiscard]] std::string to_string() const;
80 [[nodiscard]] bool is_NaN() const;
83 친구 구조체 internal::bridge::decimal128;
84 템플릿 <typename mapping_type>
85 친구 구조체 Box_base;
86
87 십진수128 연산자-(const decimal128& o);
88 십진수128 연산자+(const 십진수128& o);
89 decimal128 operator*(const decimal128& o);
90 십진수128 연산자/(const 십진수128& o);
91
92 십진수128& 연산자-=(const decimal128& o);
93 decimal128& operator+=(const decimal128& o);
94 decimal128& operator*=(const decimal128& o);
95 decimal128& operator/=(const decimal128& o);
96 };
97
98 인라인 bool 연산자 >(const decimal128& lhs, const decimal128& rhs) { return lhs.m_decimal > rhs.m_decimal; }
99 인라인 bool 연산자 >=(const decimal128& lhs, const decimal128& rhs) { return lhs.m_decimal >= rhs.m_decimal; }
100 인라인 bool 연산자 <(const decimal128& lhs, const decimal128& rhs) { return lhs.m_decimal < rhs.m_decimal; }
101 인라인 bool 연산자 <=(const decimal128& lhs, const decimal128& rhs) { return lhs.m_decimal <= rhs.m_decimal; }
102 인라인 bool 연산자 ==(const decimal128& lhs, const decimal128& rhs) { return lhs.m_decimal == rhs.m_decimal; }
103 인라인 bool 연산자 !=(const decimal128& lhs, const decimal128& rhs) { return lhs.m_decimal != rhs.m_decimal; }
104}
105
106네임스페이스 영역 {
107
108 static 인라인 int64_t serialize(int64_t v, const std::optional<internal::bridge::realm>& = std::nullopt) {
109 return v;
110 }
111 static 인라인 int64_t deserialize(int64_t v) {
112 return v;
113 }
114
115 static inline std::optional<int64_t> serialize(const std::optional<int64_t>& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
116 return v;
117 }
118 static inline std::optional<int64_t> deserialize(const std::optional<int64_t>& v) {
119 return v;
120 }
121
122 static 인라인 double serialize(const double& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
123 return v;
124 }
125 static 인라인 double deserialize(const double& v) {
126 return v;
127 }
128
129 static inline std::optional<double> serialize(const std::optional<double>& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
130 return v;
131 }
132 static 인라인 std::optional<double> deserialize(const std::optional<double>& v) {
133 return v;
134 }
135
136 static 인라인 bool serialize(bool v, const std::optional<internal::bridge::realm>& = std::nullopt) {
137 return v;
138 }
139 static 인라인 bool deserialize(bool v) {
140 return v;
141 }
142
143 static 인라인 std::optional<bool> serialize(std::optional<bool> v, const std::optional<internal::bridge::realm>& = std::nullopt) {
144 return v;
145 }
146 static 인라인 std::optional<bool> deserialize(std::optional<bool> v) {
147 return v;
148 }
149
150 템플릿<typename T>
151 static 인라인 typename std::enable_if_t<std::is_enum_v,<T> int64_t> serialize(const T& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
152 반환 static_cast<int64_t>(v);
153 }
154 템플릿<typename T, std::enable_if_t<std::is_enum_v<T>>>
155 static 인라인 T deserialize(int64_t v) {
156 반환 static_cast<T>(v);
157 }
158
159 템플릿<typename T>
160 static inline std::enable_if_t<std::is_enum_v,<typename T::value_type> std::optional<int64_t>> serialize(const T& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
161 if (v) {
162 반환 static_cast<int64_t>(*v);
163 } 기타 {
164 return std::nullopt;
165 }
166 }
167 템플릿<typename T, std::enable_if_t<std::is_enum_v<typename T::value_type>>>
168 static 인라인 std::optional<int64_t> deserialize(std::optional<int64_t> v) {
169 if (v) {
170 반환 static_cast<T>(*v);
171 } 기타 {
172 return std::nullopt;
173 }
174 }
175
176 static inline std::string serialize(const std::string& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
177 return v;
178 }
179 static 인라인 std::string deserialize(const std::string& v) {
180 return v;
181 }
182
183 static inline std::optional<std::string> serialize(const std::optional<std::string>& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
184 return v;
185 }
186 static 인라인 std::optional<std::string> deserialize(const std::optional<std::string>& v) {
187 return v;
188 }
189
190 static inline internal::bridge::uuid serialize(const uuid& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
191 return v;
192 }
193 static 인라인 uuid deserialize(const internal::bridge::uuid& v) {
194 return v. 연산자 :: 영역::uuid();
195 }
196
197 static inline std::optional<internal::bridge::uuid> serialize(const std::optional<uuid>& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
198 return v;
199 }
200 static 인라인 std::optional<uuid> deserialize(const std::optional<internal::bridge::uuid>& v) {
201 if (v) {
202 v->연산자 반환 ::realm::uuid();
203 } 기타 {
204 return std::nullopt;
205 }
206 }
207
208 static inline internal::bridge::binary serialize(const std::vector<uint8_t>& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
209 return v;
210 }
211 static 인라인 std::vector<uint8_t> deserialize(const internal::bridge::binary& v) {
212 return v.operator std::vector<uint8_t>();
213 }
214
215 static inline std::optional<internal::bridge::binary> serialize(const std::optional<std::vector<uint8_t>>& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
216 return v;
217 }
218 static inline std::optional<std::vector<uint8_t>> deserialize(const std::optional<internal::bridge::binary>& v) {
219 if (v) {
220 return v->operator std::vector<uint8_t>();
221 } 기타 {
222 return std::nullopt;
223 }
224 }
225
226 static inline internal::bridge::timestamp serialize(const std::chrono::time_point<std::chrono::system_clock>& v, const std::optional<internal::bridge::realm>& = std::nullopt ) {
227 return v;
228 }
229 static 인라인 std::chrono::time_point<std::chrono::system_clock> deserialize(const internal::bridge::timestamp& v) {
230 return 대 연산자 std::chrono::time_point<std::chrono::system_clock>();
231 }
232
233 static inline std::optional<internal::bridge::timestamp> serialize(const std::optional<std::chrono::time_point<std::chrono::system_clock>>& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
234 return v;
235 }
236 static inline std::optional<std::chrono::time_point<std::chrono::system_clock>> deserialize(const std::optional<internal::bridge::timestamp>& v) {
237 if (v) {
238 return v->operator std::chrono::time_point<std::chrono::system_clock>();
239 } 기타 {
240 return std::nullopt;
241 }
242 }
243
244 static inline internal::bridge::object_id serialize(const 영역::object_id& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
245 return v;
246 }
247 static 인라인 realm::object_id deserialize(const internal::bridge::object_id& v) {
248 return v. 연산자 :: 영역::object_id();
249 }
250
251 static inline std::optional<internal::bridge::object_id> serialize(const std::optional<realm::object_id>& v, const std::optional<internal::bridge::realm>& = std::nullopt ) {
252 return v;
253 }
254 static inline std::optional<realm::object_id> deserialize(const std::optional<internal::bridge::object_id>& v) {
255 if (v) {
256 return v->연산자::Realm 객체;
257 } 기타 {
258 return std::nullopt;
259 }
260 }
261
262 static inline internal::bridge::decimal128 serialize(const realm::decimal128& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
263 return v;
264 }
265 static 인라인 realm::decimal128 deserialize(const internal::bridge::decimal128& v) {
266 return v.operator ::realm::decimal128();
267 }
268
269 static inline std::optional<internal::bridge::decimal128> serialize(const std::optional< 영역::decimal128>& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
270 return v;
271 }
272 static inline std::optional< 영역::decimal128> deserialize(const std::optional<internal::bridge::decimal128>& v) {
273 if (v) {
274 return v-> 연산자 :: 영역::decimal128();
275 } 기타 {
276 return std::nullopt;
277 }
278 }
279
280 템플릿 <typename T>
281 static 인라인 typename std::enable_if_t<internal::type_info::MixedPersistableConcept::value,<T> internal::bridge::mixed> serialize(const T& v, const std::optional<internal::bridge::realm>& = std::nullopt) {
282 return std::visit([&](auto&& arg) {
283 using StoredType = std::decay_t<decltype(arg)>;
284 using M = typename internal::type_info::type_info<StoredType>::internal_type;
285 return internal::bridge::mixed(M(arg));
286 }, v);
287 }
288
289 템플릿 <typename T>
290 static 인라인 typename std::enable_if_t<!internal::type_info::MixedPersistableConcept<T>::value, T>
291 deserialize(const internal::bridge::mixed& value) {
292 만약 constexpr (internal::type_info::is_optional<T>::value) {
293 return std::nullopt;
294 } else if constexpr (std::is_same_v<T, int64_t>) {
295 반환 값. 연산자 int64_t();
296 } 다른 경우 if constexpr (std::is_same_v<T, bool>) {
297 return value.operator bool();
298 } else if constexpr (std::is_same_v<T, std::string>) {
299 반환 static_cast<std::string>(value);
300 } else if constexpr (std::is_same_v<T, std::vector<uint8_t>>) {
301 반환 static_cast<std::vector<uint8_t>>(static_cast<internal::bridge::binary>(value));
302 } else if constexpr (std::is_same_v<T, std::chrono::time_point<std::chrono::system_clock>>) {
303 반환 static_cast<internal::bridge::timestamp>(value);
304 } 다른 경우 if constexpr (std::dis Junction_v<std::is_same<T, double>, std::is_same<T, float>>) {
305 반환 static_cast<double>(값);
306 } else if constexpr (std::is_same_v<T, realm::uuid>) {
307 반환 값. 연산자 internal::bridge::uuid(). 연산자 :: 영역::uuid();
308 } else if constexpr (std::is_same_v<T, realm::object_id>) {
309 반환 값. 연산자 internal::bridge::object_id(). 연산자 :: 영역::object_id();
310 } other if constexpr ( std::is_same_v<T, realm::decimal128>) {
311 반환 값. 연산자 internal::bridge::decimal128() . 연산자 :: 영역::decimal128();
312 } else if constexpr (std::is_enum_v<T>) {
313 반환 static_cast<T>(value. 연산자 int64_t());
314 } 기타 {
315 abort();
316 }
317 }
318
319 템플릿 <typename T>
320 static 인라인 typename std::enable_if_t<internal::type_info::MixedPersistableConcept<T>::value, T>
321 deserialize(const internal::bridge::mixed& value) {
322 if (value.is_null()) {
323 return std::monostate();
324 }
325
326 switch (value.type()) {
327 case internal::bridge::data_type::Int:
328 반환 값. 연산자 int64_t();
329 case internal::bridge::data_type::Bool:
330 return value.operator bool();
331 case internal::bridge::data_type::String:
332 반환 static_cast<std::string>(value);
333 case internal::bridge::data_type::Binary:
334 반환 static_cast<std::vector<uint8_t>>(static_cast<internal::bridge::binary>(value));
335 case internal::bridge::data_type::Timestamp:
336 반환 static_cast<internal::bridge::timestamp>(value);
337 case internal::bridge::data_type::Float:
338 case internal::bridge::data_type::Double:
339 반환 static_cast<double>(값);
340 case internal::bridge::data_type::UUID:
341 반환 값. 연산자 internal::bridge::uuid(). 연산자 :: 영역::uuid();
342 case internal::bridge::data_type::ObjectId:
343 반환 값. 연산자 internal::bridge::object_id(). 연산자 :: 영역::object_id();
344 case internal::bridge::data_type::Decimal:
345 반환 값. 연산자 internal::bridge::decimal128(). 연산자 :: 영역::decimal128();
346 case internal::bridge::data_type::TypedLink:
347 throw std::runtime_error("혼합 속성에 저장된 객체는 `get_object_value()`를 통해 액세스해야 합니다.");
348 기본값:
349 throw std::runtime_error("혼합 속성을 역직렬화하는 동안 알 수 없는 데이터 유형입니다.");
350 }
351 }
352
353} // 네임스페이스 영역
354
355
356#endif//CPPREALM_TYPES_HPP
정의: managed_dictionary.hpp:31
정의: types.hpp:75
정의: 십진수128.hpp:30
정의: object_id.hpp:31
정의: types.hpp:56
정의: types.hpp:35