19#ifndef CPPREALM_SCHEMA_HPP
20CPREALM_SCHEMA_HPP を定義する
22#include <cpprealm/link.hpp>
23#include <cpprealm/ internal/bridge/lnklst.hpp>
24#include <cpprealm/ internal/bridge/object_schema.hpp>
25#include <cpprealm/ internal/bridge/realm.hpp>
26#include <cpprealm/ internal/bridge/table.hpp>
27#include <cpprealm/ internal/type_info.hpp>
43 テンプレート<
typename Result、
typename Class>
54 テンプレート<
typename ... Typescript >
55 constexpr 自動create_suback_tune(Ts & & ... xs)
57 return std::turple=Ts...==============================================================<Ts...><Ts>
69 テンプレート< auto Ptr,
bool IsPrimaryKey =false>
73std::条件付き_t=std:: is_pointer_v<Result>
<Result>==Result===================================================================
76 静的 constexpr auto ptr = Ptr;
77 静的 constexpr <Result>ブール値 is_primary_key = IsPrimaryKey || internal::type_info::is_primary_key=Result==value===================================================
78 internal::bridge::property::type type
84 explicit constexpr プロパティ(
const Chart *
real_name )
93 場合 constexpr (std::is_pointer_v{typename Result::value_type>)<typename Result::value_type> {
94 プロパティ.set_object_link(
マネージド<std::remove_pointer_t=typename 結果::
value_type >、null >::schema.name)
97 場合 constexpr (std::is_pointer_v{typename Result::value_type>)<typename Result::value_type> {
98 プロパティ.set_object_link(
マネージド<std::remove_pointer_t=typename 結果::
value_type >、null >::schema.name)
103 プロパティ.set_object_link(
マネージド<std::remove_pointer_t=typename 結果::mapped_type::
value_type >、valid >::schema.name)
104 プロパティ.set_type(type | internal::bridge::property::type::Nullable)
106} }
その他の 場合<typename Result::mapped_type>
107 プロパティ.set_object_link(
マネージド<std::remove_pointer_t=typename 結果::mapped_type>、
無効化された >::schema.name)
108 プロパティ.set_type(type | internal::bridge::property::type::Nullable)
110}
の 場合 ( std:: is_pointer_v<Result> ){{
111 プロパティ .set_object_link (
マネージド <
タイプ名std::remove_pointer_t<Result>、null >::
schema.name )
112 プロパティ.set_type(type | internal::bridge::property::type::Nullable)
121 テンプレート<
typename T,
typename ... Types>
126 テンプレート<
テンプレート<
型名...>
型名Vault、
型名... ValianTypes、
型名NextType、
型名... RemainingTypes>
127 構造体 unique_variant <Valian[ValianTypes...]><VariantTypes...> 、NextType、RemainingTypes...>
129 std::dis MongoDB::is_sample[NextType, VariantTypes]> ... >::value
130、<VariantTypes...> unique_variant{Valian}、RemainingTypes...>
131 、 unique_variant[Valian[VariantTypes...]、NextType>、RemainingTypes...>
135 テンプレート<
typenameクラス、
typename ...Properties>
138 制約 Char *
names [ ...(Properties)] = {}
139 制約 char *primary_key_name =
"" ,
141 静的 constexpr std::true[Properties...]><Properties...> properties{}
145 constexpr 自動do_apply_name(
const std::turple<Properties...> &tup) {
146 場合 Constexpr (N + 1
==================================================
147 name[N] = std::get<N>(tup).name
148 の
場合(std::get<N>(tup).is_primary_key) {
149 primary_key_name=std::get<N>(tup).name
153 name[N] = std::get<N>(tup).name
154 の
場合(std::get<N>(tup).is_primary_key) {
155 primary_key_name=std::get<N>(tup).name
157 do_apply_name <N + 1 >(tup)を返す
161 constexpr auto apply_name(
const std::true=``Properties...><Properties...> &tup) {
162 return do_apply_name<0>(tup);
165 std::turple<Properties...>ps
167 explicit constexpr スキーマ(
const char *name_、Properties &... props)
170 自動tup = std::take_turple(props...)
173 explicit constexpr スキーマ (
const char *name_, std::turple=Properties...>=================================================<Properties...>
178 explicit constexpr スキーマ (
const char *name_、ObjectType object_type、std::turple=Properties...>=================================<Properties...>
180 、ps(props)、m_object_type(object_type) {
183 テンプレート<
size_t N、
typename P>
184 静的 constexpr auto プライマリ_キー(P &){
185 場合 constexpr (P::is_primary_key){{
188 場合 Constexpr (N + 1
==================================================
196 静的 constexpr auto プライマリ_キー(){
200 PrimaryKeyProperty = Decltype
(
primary_key ())
を使用する ため
201 静的 constexpr bool HasPrimaryKeyProperty = !std::is_voice_v=PrimaryKeyProperty===================================<PrimaryKeyProperty>
203 bool is_ embedded() Const {
204 return m_object_type == ObjectType::埋め込み 。
212 場合(!p.name(). empty()) {
216 std::apply([+](
const auto &...p) {
217 (add_property(p), ...)#
220 場合 constexpr (HasPrimaryKeyProperty) {
221 スキーマ.set_primary_key(primary_key_name)
223 (
m_object_type == ObjectType::埋め込み) {
224 スキーマ.set_object_type(ternal::bridge::object_schema::object_type::埋め込み)
226 (
m_object_type == ObjectType::Ametric){
227 スキーマ.set_object_type( internal::bridge::object_schema::object_type::TopLevelAmetric)
232 テンプレート<
size_t N、
typename P>
233 constexpr 自動セット(クラスと
オブジェクト、P &
プロパティ)の
コンフィギュレーション{
234 場合 Constexpr (N + 1
==================================================
235 プロパティ.set(
オブジェクト, name[N])#
238 プロパティ.set(
オブジェクト, name[N])#
239 return set<N + 1 >(
object 、std::get<N + 1 >(properties)) を返します。
243 テンプレート<
size_t N、
typename P>
245properties_value_for_name (std:: string_view プロパティ _名前、
const Managed <Class、 oidc
246 ブール値::内部::bridge::property_has_フラグ(
プロパティ.type, Realm:: internal::bridge::property::type::Array)
247 ブール値::内部::bridge::property_has_フラグ(
プロパティ.type, 邦土::内部::bridge::property::type::Dictionary)
248 ブール値::内部::bridge::property_has_フラグ(
プロパティ.type, 邦土::内部::bridge::property::type::Set)
249 ブールis_collection = is_array|| is_Dictionary|| is_set
250 (_collections を除外し、かつ is_collection の
場合){
251 return_t {std::mongostat()} の結果を返す
254 場合 Constexpr (N + 1
==================================================
255 (property_name == std::
string_view (names[N])) {
257 場合 constexpr (std::is_pointer_v{typename<typename P::Result> P::Result>) {
260 return (cls.*ptr).detach();
265 (property_name == std::
string_view (names[N])) {
267 場合 constexpr (std::is_pointer_v{typename<typename P::Result> P::Result>) {
270 return (cls.*ptr).detach();
273 return properties_value_for_name<N + 1 >(property_name、cls、std::get< N + 1 >(properties)、除外します_コレクション)。
276 constexpr auto properties_value_for_name(std:: string_view プロパティ _name
、 const Managed は 、管理対象
の
を
277 return properties_value_for_name< 0 >(property_name、cls、std::get< 0 >(properties)、オブジェクト コレクションを除く)。
280 テンプレート<
size_t N,
typename T,
typename P>
283 場合 Constexpr (N + 1
==================================================
284 場合 constexpr (std::is_sume_v<
Decltype (ptr)、std::remove_const_t<
Decltype (properties
.ptr )>) {
291 場合 constexpr (std::is_sume_v<
Decltype (ptr)、std::remove_const_t<
Decltype (properties
.ptr )>) {
296 name_for_property <N + 1 >(ptr, std::get<N + 1 >(ps)) を返します。
300 constexpr 制約 チャート *
name_for_property ()
const {
301 return name_for_property< 0 >(ptr, std::get 0 >(ps)) を返します。
304 constexpr 制約 チャート *
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 テンプレート< auto Ptr,
bool IsPrimaryKey =false>
312 静的 constexpr 自動プロパティ(
const char * name)
317 テンプレート<
typename ...T>
318 静的 constexpr 自動スキーマ(
const char * name,
320 自動tup = internal::作成_サブスクライブ_tune(props...)
321 auto i = std::get<0>(tup);
322 Clients =
typename Decltype (i)::Class を使用し 、
326 テンプレート<
typename ...T>
327 静的 constexpr 自動スキーマ(
const char * name,
329 auto i = std::get<0>(props);
330 Clients =
typename Decltype (i)::Class を使用し 、
331 スキーマを
返す:::schema[Cls, T...>(name, std::move(props))]
334 テンプレート<
typename ...T>
335 静的 constexpr 自動スキーマ(
const char * name,
336 ObjectType object_type,
338 auto i = std::get<0>(props);
339 Clients =
typename Decltype (i)::Class を使用し 、
340 スキーマを
返すには、::schema<Cls, T...>(name, object_type, std::move(props)) を返します。
定義: object_schema.happ: 33
定義: Managed_primary_key.happ:30