LeechCraft
0.6.70-18808-g3467692359
Modular cross-platform feature rich live environment.
Toggle main menu visibility
Loading...
Searching...
No Matches
oraltypes.h
Go to the documentation of this file.
1
/**********************************************************************
2
* LeechCraft - modular cross-platform feature rich internet client.
3
* Copyright (C) 2006-2014 Georg Rudoy
4
*
5
* Distributed under the Boost Software License, Version 1.0.
6
* (See accompanying file LICENSE or copy at https://www.boost.org/LICENSE_1_0.txt)
7
**********************************************************************/
8
9
#pragma once
10
11
#include <type_traits>
12
#include <
util/sll/typelist.h
>
13
#include <
util/sll/typegetter.h
>
14
15
namespace
LC
16
{
17
namespace
Util
18
{
19
namespace
oral
20
{
21
struct
NoAutogen;
22
23
template
<
typename
T>
24
concept
Indirect
= T::IsIndirect;
25
26
namespace
detail
27
{
28
template
<
typename
T>
29
struct
WrapDirect
{
using
value_type
= T; };
30
31
template
<
typename
T>
32
using
UnwrapIndirect_t
= std::conditional_t<Indirect<T>,
33
T,
34
WrapDirect<T>
>
::value_type
;
35
}
36
37
template
<
typename
T,
typename
Concrete>
38
struct
IndirectHolderBase
39
{
40
constexpr
static
bool
IsIndirect
=
true
;
41
42
using
base_type
= T;
43
using
value_type
=
detail::UnwrapIndirect_t<T>
;
44
45
T
Val_
;
46
47
IndirectHolderBase
() =
default
;
48
49
IndirectHolderBase
(
value_type
val)
50
:
Val_
{ std::move (val) }
51
{
52
}
53
54
template
<
typename
Arg,
typename
... Args>
55
requires
std::constructible_from<
value_type
, Arg&&, Args&&...> &&
56
(
sizeof
... (Args) > 0 || !std::derived_from<std::decay_t<Arg>,
IndirectHolderBase
>)
57
IndirectHolderBase
(Arg&& arg, Args&&... args)
58
:
Val_
{ std::forward<Arg> (arg), std::forward<Args> (args)... }
59
{
60
}
61
62
Concrete&
operator=
(
value_type
val)
63
{
64
Val_
= std::move (val);
65
return
static_cast<
Concrete&
>
(*this);
66
}
67
68
explicit
(
false
)
operator
value_type
()
const
69
{
70
return
Val_
;
71
}
72
73
const
value_type
&
operator*
()
const
74
{
75
if
constexpr
(
Indirect<T>
)
76
return
*
Val_
;
77
else
78
return
Val_
;
79
}
80
81
auto
operator->
()
const
82
{
83
return
&
Val_
;
84
}
85
86
friend
constexpr
bool
operator==
(
const
Concrete& c1,
const
Concrete& c2)
87
{
88
return
c1.Val_ == c2.Val_;
89
}
90
91
friend
constexpr
bool
operator==
(
const
Concrete& c,
const
value_type
& v)
92
{
93
return
c.Val_ == v;
94
}
95
96
friend
constexpr
auto
operator<=>
(
const
Concrete& c1,
const
Concrete& c2)
97
requires
std::three_way_comparable<T>
98
{
99
return
c1.Val_ <=> c2.Val_;
100
}
101
102
friend
constexpr
auto
operator<=>
(
const
Concrete& c,
const
value_type
& v)
103
requires
std::three_way_comparable<T>
104
{
105
return
c.Val_ <=> v;
106
}
107
};
108
109
template
<
typename
T,
typename
...
Tags
>
110
struct
PKey
:
IndirectHolderBase
<T, PKey<T, Tags...>>
111
{
112
using
PKey::IndirectHolderBase::IndirectHolderBase;
113
};
114
115
template
<
typename
T,
typename
... Args>
116
using
PKeyValue_t
=
PKey
<T, Args...>
::value_type
;
117
118
template
<
typename
T>
119
struct
Unique
:
IndirectHolderBase
<T, Unique<T>>
120
{
121
using
Unique::IndirectHolderBase::IndirectHolderBase;
122
};
123
124
template
<
typename
T>
125
using
UniqueValue_t
=
Unique<T>::value_type
;
126
127
template
<
typename
T>
128
struct
NotNull
:
IndirectHolderBase
<T, NotNull<T>>
129
{
130
using
NotNull::IndirectHolderBase::IndirectHolderBase;
131
};
132
133
template
<
typename
T>
134
using
NotNullValue_t
=
NotNull<T>::value_type
;
135
136
template
<
typename
T>
137
using
UniqueNotNull
=
Unique<NotNull<T>
>;
138
139
namespace
detail
140
{
141
template
<
typename
T>
142
struct
IsReferencesTarget
: std::false_type {};
143
144
template
<
typename
U,
typename
...
Tags
>
145
struct
IsReferencesTarget
<
PKey
<U,
Tags
...>> : std::true_type {};
146
147
template
<
typename
U>
148
struct
IsReferencesTarget
<
Unique
<U>> : std::true_type {};
149
}
150
151
template
<auto Ptr>
152
struct
References
:
IndirectHolderBase
<typename MemberPtrType_t<Ptr>::value_type, References<Ptr>>
153
{
154
constexpr
static
bool
IsReferences
=
true
;
155
156
using
member_type
=
MemberPtrType_t<Ptr>
;
157
static_assert
(
detail::IsReferencesTarget<member_type>::value
,
"References<> element must refer to a PKey<> element"
);
158
159
using
References::IndirectHolderBase::IndirectHolderBase;
160
161
template
<
typename
T,
typename
...
Tags
>
162
References
(
const
PKey<T, Tags...>
& key)
163
:
References
::
IndirectHolderBase
(key)
164
{
165
}
166
167
template
<
typename
T,
typename
...
Tags
>
168
References
&
operator=
(
const
PKey<T, Tags...>
& key)
169
{
170
this->Val_ = key;
171
return
*
this
;
172
}
173
};
174
175
template
<auto Ptr>
176
using
ReferencesValue_t
=
References<Ptr>::value_type
;
177
178
template
<
auto
... Fields>
179
struct
PrimaryKey
{};
180
181
template
<
auto
... Fields>
182
struct
UniqueSubset
{};
183
184
template
<
typename
... Args>
185
using
Constraints
=
Typelist
<Args...>;
186
187
template
<
auto
... Fields>
188
struct
Index
{};
189
190
template
<
typename
... Args>
191
using
Indices
=
Typelist
<Args...>;
192
193
template
<
typename
T>
194
concept
ForeignKey
= T::IsReferences;
195
196
struct
InsertAction
197
{
198
constexpr
static
struct
DefaultTag {}
Default
{};
199
constexpr
static
struct
IgnoreTag {}
Ignore
{};
200
201
struct
Replace
202
{
203
template
<
auto
... Ptrs>
204
struct
FieldsType
{};
205
206
template
<
auto
... Ptrs>
207
constexpr
static
FieldsType
<Ptrs...>
Fields
{};
208
209
constexpr
static
struct
WholeType {}
Whole
{};
210
};
211
};
212
}
213
}
214
}
LC::Util::oral::ForeignKey
Definition
oraltypes.h:194
LC::Util::oral::Indirect
Definition
oraltypes.h:24
LC::Util::Tags
Definition
xmlnode.cpp:106
LC::Util::oral::detail
Definition
migrate.h:17
LC::Util::oral::detail::UnwrapIndirect_t
std::conditional_t< Indirect< T >, T, WrapDirect< T > >::value_type UnwrapIndirect_t
Definition
oraltypes.h:32
LC::Util::oral
Definition
migrate.h:15
LC::Util::oral::Constraints
Typelist< Args... > Constraints
Definition
oraltypes.h:185
LC::Util::oral::Indices
Typelist< Args... > Indices
Definition
oraltypes.h:191
LC::Util::oral::ReferencesValue_t
References< Ptr >::value_type ReferencesValue_t
Definition
oraltypes.h:176
LC::Util::oral::UniqueValue_t
Unique< T >::value_type UniqueValue_t
Definition
oraltypes.h:125
LC::Util::oral::PKeyValue_t
PKey< T, Args... >::value_type PKeyValue_t
Definition
oraltypes.h:116
LC::Util::oral::NotNullValue_t
NotNull< T >::value_type NotNullValue_t
Definition
oraltypes.h:134
LC::Util::oral::UniqueNotNull
Unique< NotNull< T > > UniqueNotNull
Definition
oraltypes.h:137
LC::Util
Definition
icoreproxy.h:34
LC::Util::MemberPtrType_t
MemberTypeType_t< decltype(Ptr)> MemberPtrType_t
Definition
typegetter.h:79
LC
Definition
constants.h:15
LC::Util::Typelist
Definition
typelist.h:19
LC::Util::oral::Index
Definition
oraltypes.h:188
LC::Util::oral::IndirectHolderBase
Definition
oraltypes.h:39
LC::Util::oral::IndirectHolderBase::operator=
Concrete & operator=(value_type val)
Definition
oraltypes.h:62
LC::Util::oral::IndirectHolderBase::IndirectHolderBase
IndirectHolderBase(Arg &&arg, Args &&... args)
Definition
oraltypes.h:57
LC::Util::oral::IndirectHolderBase::operator->
auto operator->() const
Definition
oraltypes.h:81
LC::Util::oral::IndirectHolderBase::Val_
T Val_
Definition
oraltypes.h:45
LC::Util::oral::IndirectHolderBase::operator<=>
friend constexpr auto operator<=>(const Concrete &c1, const Concrete &c2)
Definition
oraltypes.h:96
LC::Util::oral::IndirectHolderBase::base_type
T base_type
Definition
oraltypes.h:42
LC::Util::oral::IndirectHolderBase::operator*
const value_type & operator*() const
Definition
oraltypes.h:73
LC::Util::oral::IndirectHolderBase::IndirectHolderBase
IndirectHolderBase()=default
LC::Util::oral::IndirectHolderBase::value_type
detail::UnwrapIndirect_t< T > value_type
Definition
oraltypes.h:43
LC::Util::oral::IndirectHolderBase::operator==
friend constexpr bool operator==(const Concrete &c1, const Concrete &c2)
Definition
oraltypes.h:86
LC::Util::oral::IndirectHolderBase::IndirectHolderBase
IndirectHolderBase(value_type val)
Definition
oraltypes.h:49
LC::Util::oral::IndirectHolderBase::IsIndirect
static constexpr bool IsIndirect
Definition
oraltypes.h:40
LC::Util::oral::InsertAction::Replace::FieldsType
Definition
oraltypes.h:204
LC::Util::oral::InsertAction::Replace
Definition
oraltypes.h:202
LC::Util::oral::InsertAction::Replace::Whole
static constexpr struct LC::Util::oral::InsertAction::Replace::WholeType Whole
LC::Util::oral::InsertAction::Replace::Fields
static constexpr FieldsType< Ptrs... > Fields
Definition
oraltypes.h:207
LC::Util::oral::InsertAction
Definition
oraltypes.h:197
LC::Util::oral::InsertAction::Ignore
static constexpr struct LC::Util::oral::InsertAction::IgnoreTag Ignore
LC::Util::oral::InsertAction::Default
static constexpr struct LC::Util::oral::InsertAction::DefaultTag Default
LC::Util::oral::NotNull
Definition
oraltypes.h:129
LC::Util::oral::value_type
LC::Util::oral::PrimaryKey
Definition
oraltypes.h:179
LC::Util::oral::References::References
References(const PKey< T, Tags... > &key)
Definition
oraltypes.h:162
LC::Util::oral::value_type::IsReferences
static constexpr bool IsReferences
Definition
oraltypes.h:154
LC::Util::oral::References::member_type
MemberPtrType_t< Ptr > member_type
Definition
oraltypes.h:156
LC::Util::oral::References::operator=
References & operator=(const PKey< T, Tags... > &key)
Definition
oraltypes.h:168
LC::Util::oral::Unique
Definition
oraltypes.h:120
LC::Util::oral::UniqueSubset
Definition
oraltypes.h:182
LC::Util::oral::detail::IsReferencesTarget
Definition
oraltypes.h:142
LC::Util::oral::detail::WrapDirect
Definition
oraltypes.h:29
LC::Util::oral::detail::WrapDirect::value_type
T value_type
Definition
oraltypes.h:29
typegetter.h
typelist.h
src
util
db
oral
oraltypes.h
Generated by
1.17.0