Realm C++ SDK 버전 v2.2.0

managed_mixed.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_MIXED_HPP
20#define CPPRALM_MANAGED_MIXED_HPP
21
22#include <cpprealm/macros.hpp>
23#include <cpprealm/rbool.hpp>
24#include <cpprealm/types.hpp>
25
26네임스페이스 영역 {
27 템플릿 <typename T>
28 구조체 managed<T, std::enable_if_t< 영역::internal::type_info::MixedPersistableConcept<T>::value>> : public managed_base {
29 사용 managed<T>::managed_base:: 연산자=;
30
31 열거형 stored_type {
32 Int = 0,
33 Bool = 1,
34 string = 2,
35 바이너리 = 4,
36 혼합 = 6,
37 타임스탬프 = 8,
38 Float = 9,
39 double = 10,
40 10진수 = 11,
41 링크 = 12,
42 LinkList = 13,
43 ObjectId = 15,
44 TypedLink = 16,
45 UUID = 17,
46 Null = 18,
47 };
48
49 관리형& 연산자 =(const T& v) {
50 m_obj-> 설정하다(m_key, std::visit([](auto&& arg) {
51 using M = typename internal::type_info::type_info<std::decay_t<decltype(arg)>>::internal_type;
52 반환 internal::bridge::mixed(M(arg));
53 }, v));
54 return *this;
55 }
56
57 템플릿<typename U>
58 managed& 연산자 =(const U& v) {
59 m_obj->set(m_key, internal::bridge::mixed(v));
60 return *this;
61 }
62
63 [[nodiscard]] stored_type get_stored_type() const {
64 auto val = m_obj->get<realm::internal::bridge::mixed>(m_key);
65 if (val.is_null()) {
66 반환 stored_type::Null;
67 } 기타 {
68 반환 static_cast<stored_type>(val.type());
69 }
70 }
71
72 [[nodiscard]] T fetch() const {
73 return deserialize<T>(m_obj->get<realm::internal::bridge::mixed>(m_key)));
74 }
75
76 [[nodiscard]] T 연산자 *() const {
77 return fetch();
78 }
79
80 //MARK: - 비교 연산자
81 rbool 연산자==(const T& rhs) const noException {
82 if (This->m_rbool_query) {
83 return this->m_rbool_query->mixed_equal(m_key, serialize(rhs));
84 }
85 return detach() == rhs;
86 }
87
88 rbool 연산자!=(const T& rhs) const no exception {
89 if (This->m_rbool_query) {
90 return this->m_rbool_query->mixed_not_equal(m_key, serialize(rhs));
91 }
92 return detach() != rhs;
93 }
94
95 rbool 연산자==(const std::nullopt_t&) const noException {
96 if (This->m_rbool_query) {
97 return this->m_rbool_query->mixed_equal(m_key, internal::bridge::mixed(std::monostate()));
98 }
99 return Debug() == T(std::monostate());
100 }
101
102 rbool 연산자!=(const std::nullopt_t&) const noException {
103 if (This->m_rbool_query) {
104 return this->m_rbool_query->mixed_not_equal(m_key, internal::bridge::mixed(std::monostate()));
105 }
106 return Debug() != T(std::monostate());
107 }
108
109 bool has_link() const {
110 return (get_stored_type() == stored_type::TypedLink);
111 }
112
113 템플릿<typename U>
114 typename managed<U>::ref_type get_stored_link() const {
115 m_realm->read_group();
117
118 auto obj = internal::bridge::object(*m_realm, m.operator internal::bridge::obj_link());
119 uint32_t Alternative_key = m_realm->table_for_object_type(managed<std::remove_pointer_t<U>>:: 스키마.name).get_key();
120 uint32_t stored_table = obj.get_obj().get_table().get_key();
121
122 if (alternative_key != stored_table) {
123 throw std::runtime_error("다른 링크 유형이 혼합 유형에 저장되었습니다. Stored type: " + obj.get_object_schema().get_name());
124 }
125 반환 typename managed<U>::ref_type(managed<std::remove_pointer_t<U>>(obj.get_obj(), *m_realm));
126 }
127
128 템플릿 <typename U>
129 set_link (U &&v) {
130 static_assert(sizeof(managed<U>), "Must explain schema for T");
131 static_assert(managed<U>::object_type == ObjectType::TopLevel, "혼합 속성은 최상위 객체만 저장할 수 있습니다.");
132 자동 테이블 = m_realm->table_for_object_type(managed<U>:: 스키마.name);
134 만약 constexpr (managed<U>::schema.HasPrimaryKeyProperty) {
135 auto pk = v.*(managed<U>:: 스키마.primary_key().ptr);
136 o = table.create_object_with_primary_key(영역::internal::bridge::mixed(serialize(pk.value)));
137 } 기타 {
138 o = table.create_object();
139 }
140
141 std:: 적용([&o, &v, this](auto && ...p) {
142 (접근자 <typename std::decay_t<decltype(p)>::Result>::set(
143 o, o.get_table().get_column_key(p.name), * this->m_realm, v.*(std::decay_t<decltype(p)>::ptr)
144 ), ...);
146 m_obj-> 설정하다(m_key, internal::bridge::mixed(o.get_link()));
147 }
148
149 템플릿<typename U>
150 std::enable_if_t< managed<U>::is_object && managed<U>::object_type == ObjectType::TopLevel, oid>
151 set_link(managed<U>& 링크) {
152 m_obj-> 설정하다(m_key, internal::bridge::mixed(internal::bridge::obj_link(link.m_obj.get_table().get_key(), link.m_obj.get_key())));
153 }
154
155 private:
156 managed() = 기본값;
157 managed(const managed&) = delete;
158 managed ( managed &&) = delete ;
159 managed& 연산자=(const managed&) = delete;
160 managed& 연산자=(managed&&) = delete;
161 템플릿<typename, typename>
162 친구 구조체 managed 됨 ;
163 };
164
165 템플릿<typename T, typename types>
166 bool 홀드_alternative(const 영역:: managed<Types>& v) noex {
167 auto val = v.get_stored_type();
168 switch (val) {
170 만약 constexpr (std::is_same_v<T, int64_t>)
171 반환 true;
172 중단;
174 만약 constexpr (std::is_same_v<T, bool>)
175 반환 true;
176 중단;
178 만약 constexpr (std::is_same_v<T, std::string>)
179 반환 true;
180 중단;
182 만약 constexpr (std::is_same_v<T, std::vector<uint8_t>>)
183 반환 true;
184 중단;
186 만약 constexpr (std::is_same_v<T, Types>)
187 반환 true;
188 중단;
190 만약 constexpr (std::is_same_v<T, std::chrono::time_point<std::chrono::system_clock>>)
191 반환 true;
192 중단;
194 만약 constexpr (std::is_same_v<T, float>)
195 반환 true;
196 중단;
198 만약 constexpr (std::is_same_v<T, double>)
199 반환 true;
200 중단;
202 만약 constexpr (std::is_same_v<T, realm::decimal128>)
203 반환 true;
204 중단;
206 만약 constexpr (std::is_same_v<T, realm::object_id>)
207 반환 true;
208 중단;
209
211 만약 constexpr (std::is_same_v<T, realm::uuid>)
212 반환 true;
213 중단;
215 만약 constexpr (std::is_same_v<T, std::monostate>)
216 반환 true;
217 중단;
219 만약 constexpr (std::is_pointer_v<T>) {
220 auto m = v.m_obj-> Template get<internal::bridge::mixed>(v.m_key);
221 uint32_t Alternative_key = v.m_realm->table_for_object_type(managed<std::remove_pointer_t<T>>::schema.name).get_key();
222 uint32_t stored_key = internal::bridge:: 객체(*v.m_realm, m. 연산자 internal::bridge::obj_link()).get_object_schema().table_key();
223 return Alternative_key == stored_key;
224 }
225 중단;
226 }
229 중단;
230 기본값:
231 중단;
232 }
233
234 반환 false;
235 }
236}
237
238#endif//CPPREALM_MANAGED_MIXED_HPP
정의: rbool.hpp:36
정의: accessors.hpp:33
정의: object.hpp:154
정의: 매크로.hpp:286
정의: obj.hpp:62