Realm C++ SDK Versão C++ v2.2.0

managed_mixed.hpp

1
2//
3// Autores 2024 Realm Inc.
4//
5// Licenciado sob a Licença Apache, Versão 2.0 (a "Licença");
6// você não pode usar este arquivo, exceto em conformidade com a Licença.
7// Você pode obter uma cópia da Licença em
8//
9// http://www.apache.org/license/LICENSE-2.0
10//
11// A menos que exigido pela lei aplicável ou acordado por escrito, o software
12// distribuído sob a Licença é distribuído "Como está",
13// sem garantias ou condições de qualquer tipo, Express ou implícitas.
14// Consulte a Licença para obter as permissões específicas de domínio do idioma e
15// limitações da Licença.
16//
18
19#ifndef CPPREALM_MANAGED_MIXED_HPP
20#define CPPREALM_MANAGED_MIXED_HPP
21
22#include <cprealm/macros.hpp>
23#include <cprealm/rbool.hpp>
24#include <cprealm/types.hpp>
25
26namespace Realm {
27 modelo <typename T>
28 estrutura, estrutura managed<T, std::enable_if_t< Realm::internal::type_info::MixedPersistableConcept<T>::value>> : public managed_base {
29 Usando <T>gerenciado ::managed_base::operator=;
30
31 enumeração stored_type {
32 Int = 0,
33 Bool = 1,
34 string = 2,
35 Binário = 4,
36 Misto = 6,
37 Timestamp = 8,
38 Flutuante = 9,
39 double = 10,
40 Decimais = 11,
41 Link = 12,
42 LinkList = 13,
43 ObjectId = 15,
44 TypedLink = 16,
45 UUID = 17,
46 Nulo = 18,
47 };
48
49 managed& operator =(const T& v) {
50 m_obj->set(m_key, std::visit([](auto&& arg) {
51 usando M = typename internal::type_info::type_info<std::decay_t<decltype(arg)>>::internal_type;
52 Método internal::bridge::mixed(M(arg));
53 }, v));
54 devolva *isto;
55 }
56
57 template<typename U>
58 managed& operator =(const U& v) {
59 m_obj->set(m_key, internal::bridge::mixed(v));
60 devolva *isto;
61 }
62
63 [[nodiscard]] stored_type get_stored_type() const {
64 auto valid = m_obj->get<realm::internal::bridge::mixed>(m_key);
65 if (val.is_null()) {
66 return stored_type::Null;
67 } mais {
68 Método estático_cast <stored_type>(val.type());
69 }
70 }
71
72 [[nodiscard]] T detach() const {
73 return deserialize<T>(m_obj->get<realm::internal::bridge::mixed>(m_key));
74 }
75
76 [[nodiscard]] Operador de T *() const {
77 return desvincular();
78 }
79
80 //Marca: - operadores de comparação
81 rbool operator==(const T& rhs) const noexceto {
82 if (This->query) {
83 return this->m_rbool_query->mixed_equal(m_key, serialize(rhs));
84 }
85 return detach() == rhs;
86 }
87
88 operador rbool !=(const T& rhs) const noexceto {
89 if (This->query) {
90 return this->m_rbool_query->mixed_not_equal(m_key, serialize(rhs));
91 }
92 return detach() != rhs;
93 }
94
95 rbool operator==(const std::nullopt_t&) const noexceto {
96 if (This->query) {
97 return this->m_rbool_query->mixed_equal(m_key, internal::bridge::mixed(std::monostate()));
98 }
99 return detach() == T(std::monostate());
100 }
101
102 operador de rbool !=(const std::nullopt_t&) const noexceto {
103 if (This->query) {
104 return this->m_rbool_query->mixed_not_equal(m_key, internal::bridge::mixed(std::monostate()));
105 }
106 return detach() != T(std::monostate());
107 }
108
109 bool has_link() const {
110 return (get_stored_type() == stored_type::TypedLink);
111 }
112
113 template<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 alternate_key = m_realm->table_for_object_type(managed<std::remove_pointer_t<U>>::schema.name).get_key();
120 uint32_t stored_table = obj.get_obj().get_table().get_key();
121
122 se (alternative_key != stored_table) {
123 lance std::runtime_error("Tipo de link diferente armazenado em tipo misto. Tipo armazenado: " + obj.get_object_schema().get_name());
124 }
125 Método typename managed<U>::ref_type(managed<std::remove_pointer_t<U>>(obj.get_obj(), *m_realm));
126 }
127
128 modelo < typename U>
129 set_link (U &&v) {
130 estático_assert(tamanho(gerenciado<U>), "Deve declarar esquema para T");
131 estático_assert(gerenciado<U>::object_type == ObjectType::TopLevel, "Propidades mistas só podem armazenar objetos de nível superior.");
132 auto table = m_realm->table_for_object_type(managed<U>::schema.name);
134 se constexpr (managed<U>::schema.HasPrimaryKeyProperty) {
135 auto pk = v.*(managed<U>::schema.primary_key().ptr);
136 o = table.create_object_with_primary_key(Realm::internal::bridge::mixed(serialize(pk.value)));
137 } mais {
138 o = table.create_object();
139 }
140
141 std::apply([&o, &v, este](auto && ...p) {
142 (acessador<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 ), ...);
145 }, managed<U>::schema.ps);
146 m_obj->set(m_key, internal::bridge::mixed(o.get_link()));
147 }
148
149 template<typename U>
150 std::enable_if_t<managed<U>::is_object && managed<U>::object_type ==ObjectType::TopLevel, null >
151 set_link(managed<U>& link) {
152 m_obj->set(m_key, internal::bridge::mixed(internal::bridge::obj_link(link.m_obj.get_table().get_key(), link.m_obj.get_key())));
153 }
154
155 privado:
156 managed() = default;
157 managed(const managed&) = delete;
158 managed(managed &&) = delete;
159 managed& operator=(const managed&) = delete;
160 managed& operator=(managed&&) = delete;
161 modelo<typename, typename>
162 amigo estrutura, estrutura managed;
163 };
164
165 template<typename T, typename Types>
166 bool detém_alternative(const Realm::managed<Types>& v) noexceto {
167 auto val = v.get_stored_type();
168 switch (val) {
170 se constexpr (std::is_same_v<T, int64_t>)
171 Método verdadeiro;
172 intervalo;
174 se constexpr (std::is_same_v<T, bool>)
175 Método verdadeiro;
176 intervalo;
178 se constexpr (std::is_same_v<T, std::string>)
179 Método verdadeiro;
180 intervalo;
182 se constexpr (std::is_same_v<T, std::vector<uint8_t>>)
183 Método verdadeiro;
184 intervalo;
186 se constexpr (std::is_same_v<T, Types>)
187 Método verdadeiro;
188 intervalo;
190 se constexpr (std::is_same_v<T, std::chrono::time_point<std::chrono::system_clock>>)
191 Método verdadeiro;
192 intervalo;
194 se constexpr (std::is_same_v<T, float>)
195 Método verdadeiro;
196 intervalo;
198 se constexpr (std::is_same_v<T, double>)
199 Método verdadeiro;
200 intervalo;
202 se constexpr (std::is_same_v<T, realm::decimal128>)
203 Método verdadeiro;
204 intervalo;
206 se constexpr (std::is_same_v<T, realm::object_id>)
207 Método verdadeiro;
208 intervalo;
209
211 se constexpr (std::is_same_v<T, realm::uuid>)
212 Método verdadeiro;
213 intervalo;
215 se constexpr (std::is_same_v<T, std::monostate>)
216 Método verdadeiro;
217 intervalo;
219 se constexpr (std::is_pointer_v<T>) {
220 auto m = v.m_obj->template get<internal::bridge::mixed>(v.m_key);
221 uint32_t alternate_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:: objeto(*v.m_realm, m.operator internal::bridge::obj_link()).get_object_schema().table_key();
223 return alternate_key == stored_key;
224 }
225 intervalo;
226 }
229 intervalo;
230 Padrão:
231 intervalo;
232 }
233
234 Método false;
235 }
236}
237
238#endif//CPPrealm_MANAGED_MIXED_HPP
Definição: rbool.hpp:36
Definição: accessors.hpp:33
Definição: misto.hpp:69
Definição: obj.hpp:123
Definição: object.hpp:154
Definição: macros.hpp:286
Definição: obj.hpp:62