19#ifndef CPPREALM_SCHEMA_HPP
20#define CPPREALM_SCHEMA_HPP
22#include <cpprealm/link.hpp>
23#include <cpprealm/internal/bridge/lnklst.hpp>
24#include <cpprealm/internal/bridge/object_schema.hpp>
25#include <cprealm/internal/bridge/realm.hpp>
26#include <cprealm/internal/bridge/table.hpp>
27#include <cpprealm/internal/type_info.hpp>
34 enum class ObjectType {
43 template <
typename Resultado,
typename Class>
46 usando class_type = Classe;
47 usando member_type = Resultado;
54 template<
typename... Typescript>
55 constexpr auto get_subpack_tuple(Ts&&... xs)
57 return std::tuple<Ts...>(std::forward<Ts>(xs)...);
68 esquema de
namespace {
69 template <auto Ptr,
bool IsPrimaryKey = false>
72 usando VariantResult =
76 estático constexpr auto ptr = Ptr;
78 internal::bridge::property::type type;
79 const chart* nome =
"";
84 explícito constexpr propriedade(
const caracteres* real_name)
93 se constexpr (std::is_pointer_v<typename Result::value_type>) {
94 propriedade.set_object_link(
gerenciado<std::remove_pointer_t<typename Resultado::value_type>,
void>::schema.name);
97 se constexpr (std::is_pointer_v<typename Result::value_type>) {
98 propriedade.set_object_link(
gerenciado<std::remove_pointer_t<typename Resultado::value_type>,
void>::schema.name);
103 propriedade.set_object_link(
gerenciado<std::remove_pointer_t<typename Resultado::mapped_type::value_type>, null >::
schema.name );
104 propriedade.set_type(type | internal::bridge::property::type::Nullable);
106 }
mais se constexpr (std::is_pointer_v<typename Result::mapped_type>) {
107 propriedade.set_object_link(
gerenciado<std::remove_pointer_t<typename Resultado::
mapped_type>, null >::schema.name);
108 propriedade.set_type(type | internal::bridge::property::type::Nullable);
110 }
mais se constexpr (std::is_pointer_v<Result>) {
111 propriedade.set_object_link(
managed<
typename std::remove_pointer_t<Result>,
void>::schema.name);
112 propriedade.set_type(type | internal::bridge::property::type::Nullable);
121 template <
typename T,
typename ... Types>
126 modelo < modelo nome do
tipoVariant, nome
do tipo... VariantTypes , nome
do tipo NextType ,
nome do tipo ... RemainingTypes>
127 estrutura, estrutura unique_variant<Variant<VariantTypes...> , NextType, RemainingTypes...>
129 std::disjunction< std::is_same<NextType, VariantTypes> ... >::value
130 , unique_variant<Variant<VariantTypes...>, RemainingTypes...>
131 , unique_variant<Variant<VariantTypes..., NextType>, RemainingTypes...>
135 modelo <
typename Classe,
typename ...propriedade>
137 const caracteres *nome;
138 const chart *names[
sizeof...(Properties)] = {};
139 const chart *primary_key_name =
"";
141 estático constexpr std::tuple<Properties...> propriedades{};
145 constexpr auto do_apply_name(
const std::tuple<Properties...> &tup) {
146 se constexpr (N + 1 ==
sizeof...(Properties)) {
147 nomes[N] = std::get<N>(tup).name;
148 if (std::get<N>(tup).is_primary_key) {
149 primary_key_name = std::get<N>(tup).name;
153 nomes[N] = std::get<N>(tup).name;
154 if (std::get<N>(tup).is_primary_key) {
155 primary_key_name = std::get<N>(tup).name;
157 return do_apply_name<N + 1>(tup);
161 constexpr auto apply_name(
const std::tuple<Properties...> &tup) {
162 return do_apply_name<0>(tup);
165 std::tuple<Properties...> ps;
167 explícito constexpr esquema(
const chart *
name_ , Propriedades &&... props)
170 auto tup = std::make_tuple(props...);
173 explícito constexpr schema(
const chart *
name_ , std::tuple<Properties...>&& props)
178 explícito constexpr schema(
const chart *
name_ , ObjectType object_type, std::tuple<Properties...>&& props)
180 , ps(props), m_object_type(object_type) {
183 template<
size_t N,
typename P>
185 se constexpr (P::is_primary_key) {
188 se constexpr (N + 1 ==
sizeof...(Properties)) {
200 usando PrimaryKeyProperty =
decltype(
primary_key());
201 estático constexpr bool HasPrimaryKeyProperty = !std::is_void_v<PrimaryKeyProperty>;
203 bool is_embedded()
const {
204 return m_object_type == ObjectType::Embedded;
212 if (!p.name().empty()) {
216 std::apply([&](
const auto&... p) {
217 (add_property(p), ...);
220 se constexpr (HasPrimaryKeyProperty) {
221 schema.set_primary_key(primary_key_name);
223 se (m_object_type == ObjectType::Embedded) {
224 schema.set_object_type(internal::bridge::object_schema::object_type::Embedded);
226 se (m_object_type == ObjectType::Asymmetric) {
227 schema.set_object_type(internal::bridge::object_schema::object_type::TopLevelAsymmetric);
232 template<
size_t N,
typename P>
233 constexpr auto set(Classe e
objeto, P e
propriedade)
const {
234 se constexpr (N + 1 ==
sizeof...(Properties)) {
235 propriedade.set(
objeto, nomes[N]);
238 propriedade.set(
objeto, nomes[N]);
239 return set<N + 1>(
objeto, std::get<N + 1>(properties));
243 template<
size_t N,
typename P>
245 Property_value_for_name(std::string_view Property_name,
const managed<Class, null> &cls, P &
Property,
bool excluindo_collections =
true)
const {
246 bool is_array = Realm::internal::bridge::property_has_marca(
propriedade.type, Realm::internal::bridge:: propriedade::type::Array);
247 bool is_Dictionary = Realm::internal::bridge::property_has_marca(
propriedade.type, Realm::internal::bridge:: propriedade::type::Dictionary);
248 bool is_set = Realm::internal::bridge::property_has_marca(
propriedade.type, Realm::internal::bridge:: propriedade::type::Set);
249 bool is_collection = is_array || is_Dictionary || is_set;
250 se (excluindo_collections && is_collection) {
251 return variante_t{std::monostate()};
254 se constexpr (N + 1 ==
sizeof...(Properties)) {
255 se (property_name == std::string_view(names[N])) {
257 se constexpr (std::is_pointer_v<typename P::Result>) {
260 return (cls.*ptr).detach();
263 retornar variante_t{};
265 se (property_name == std::string_view(names[N])) {
267 se constexpr (std::is_pointer_v<typename P::Result>) {
270 return (cls.*ptr).detach();
273 retornar Property_value_for_name<N + 1>(property_name, cls, std::get<N + 1>(properties), excluindo_collections);
276 constexpr auto Property_value_for_name(std::string_view Property_name,
const managed<Class, null> &cls,
bool excluindo_collections =
true)
const {
277 retornar Property_value_for_name <0>(property_name, cls, std::get<0>(properties), excluindo_collections);
280 template<
size_t N,
typename T,
typename P>
281 constexpr const caractere*
282 name_for_property(T ptr, P &
Property)
const {
283 se constexpr (N + 1 ==
sizeof...(Properties)) {
284 se constexpr (std::is_same_v<
decltype(ptr), std::remove_const_t<
decltype(
propriedade.ptr)>>) {
286 Método propriedade.name;
291 se constexpr (std::is_same_v<
decltype(ptr), std::remove_const_t<
decltype(
propriedade.ptr)>>) {
293 Método propriedade.name;
296 return name_for_property<N + 1>(ptr, std::get<N + 1>(ps));
300 constexpr const chart *
name_for_property ()
const {
301 return name_for_property<0>(ptr, std::get<0>(ps));
304 constexpr const chart *
name_for_property (T ptr)
const {
305 return name_for_property<0>(ptr, std::get<0>(ps));
308 ObjectType m_object_type = ObjectType::None;
311 template <auto Ptr,
bool IsPrimaryKey = false>
312 estático constexpr propriedade
auto ( caracteres const * nome)
317 modelo <
typename ...T>
318 estático constexpr esquema
automático (
const caracteres * nome,
320 auto tup = internal::make_subpack_tuple(props...);
321 auto i = std::get<0>(tup);
322 usando Cls = nome do tipo
decltype( i)::Class;
323 return schemagen::schema<Cls, T...>(nome, std::move(props)...);
326 modelo <
typename ...T>
327 estático constexpr esquema
automático (
const caracteres * nome,
328 std::tuple<T...>&& props) {
329 auto i = std::get<0>(props);
330 usando Cls = nome do tipo
decltype( i)::Class;
331 return schemagen::schema<Cls, T...>(name, std::move(props));
334 modelo <
typename ...T>
335 estático constexpr esquema
automático (
const caracteres * nome,
336 ObjectType object_type,
337 std::tuple<T...>&& props) {
338 auto i = std::get<0>(props);
339 usando Cls = nome do tipo
decltype( i)::Class;
340 return schemagen::schema<Cls, T...>(name, object_type, std::move(props));
Definição: object_schema.hpp:33
Definição: propriedade.hpp:33
Definição: type_info.hpp:161
Definição: type_info.hpp:145
Definição: type_info.hpp:70
Definição: type_info.hpp:45
Definição: type_info.hpp:297
Definição: type_info.hpp:62
Definição: type_info.hpp:54
Definição: managed_primary_key.hpp:30
Definição: schema.hpp:136
Definição: schema.hpp:122