LeechCraft 0.6.70-18808-g3467692359
Modular cross-platform feature rich live environment.
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
15namespace LC
16{
17namespace Util
18{
19namespace 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,
35 }
36
37 template<typename T, typename Concrete>
39 {
40 constexpr static bool IsIndirect = true;
41
42 using base_type = T;
44
46
47 IndirectHolderBase () = default;
48
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>
126
127 template<typename T>
128 struct NotNull : IndirectHolderBase<T, NotNull<T>>
129 {
130 using NotNull::IndirectHolderBase::IndirectHolderBase;
131 };
132
133 template<typename T>
135
136 template<typename 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
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>
164 {
165 }
166
167 template<typename T, typename... Tags>
169 {
170 this->Val_ = key;
171 return *this;
172 }
173 };
174
175 template<auto Ptr>
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
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}
std::conditional_t< Indirect< T >, T, WrapDirect< T > >::value_type UnwrapIndirect_t
Definition oraltypes.h:32
Typelist< Args... > Constraints
Definition oraltypes.h:185
Typelist< Args... > Indices
Definition oraltypes.h:191
References< Ptr >::value_type ReferencesValue_t
Definition oraltypes.h:176
Unique< T >::value_type UniqueValue_t
Definition oraltypes.h:125
PKey< T, Args... >::value_type PKeyValue_t
Definition oraltypes.h:116
NotNull< T >::value_type NotNullValue_t
Definition oraltypes.h:134
Unique< NotNull< T > > UniqueNotNull
Definition oraltypes.h:137
MemberTypeType_t< decltype(Ptr)> MemberPtrType_t
Definition typegetter.h:79
Definition constants.h:15
Concrete & operator=(value_type val)
Definition oraltypes.h:62
IndirectHolderBase(Arg &&arg, Args &&... args)
Definition oraltypes.h:57
friend constexpr auto operator<=>(const Concrete &c1, const Concrete &c2)
Definition oraltypes.h:96
const value_type & operator*() const
Definition oraltypes.h:73
detail::UnwrapIndirect_t< T > value_type
Definition oraltypes.h:43
friend constexpr bool operator==(const Concrete &c1, const Concrete &c2)
Definition oraltypes.h:86
static constexpr bool IsIndirect
Definition oraltypes.h:40
static constexpr struct LC::Util::oral::InsertAction::Replace::WholeType Whole
static constexpr FieldsType< Ptrs... > Fields
Definition oraltypes.h:207
static constexpr struct LC::Util::oral::InsertAction::IgnoreTag Ignore
static constexpr struct LC::Util::oral::InsertAction::DefaultTag Default
References(const PKey< T, Tags... > &key)
Definition oraltypes.h:162
static constexpr bool IsReferences
Definition oraltypes.h:154
MemberPtrType_t< Ptr > member_type
Definition oraltypes.h:156
References & operator=(const PKey< T, Tags... > &key)
Definition oraltypes.h:168