libbmb
Modern implementation of STL
Loading...
Searching...
No Matches
type_traits.h
Go to the documentation of this file.
1#pragma once
7namespace bmb {
8
10template <typename T>
12 static_assert(false, "declval isn't implemented to call it");
13}
14
15// This type forces non-deduced context.
16// It works because compiler's not able to deduce "qualifed name"
17// like "type_identity<MyType>::value".
18//
19// It useful for forcing a client to call a function with
20// explicitly given template types.
21// For more explanation see https://stackoverflow.com/a/25245676
22
24template <typename T>
26 using type = T;
27};
28
30template <typename T>
32
34template <auto val>
36 using value_type = decltype(val);
37 static constexpr auto value = val;
38};
39
41template <bool val>
43
48
50template <typename... Types>
52 static constexpr bool value = (Types::value && ...);
53};
54
56template <typename... Types>
57constexpr bool conjunction_v = conjunction<Types...>::value;
58
60template <typename... Types>
62 static constexpr bool value = (Types::value || ...);
63};
64
66template <typename... Types>
67constexpr bool disjunction_v = disjunction<Types...>::value;
68
70template <typename T, typename U>
71struct is_same : false_type {};
72
73template <typename T>
74struct is_same<T, T> : true_type {};
75
77template <typename T, typename U>
79
81template <typename T>
83
84template <typename T>
86
88template <typename T>
90
92template <typename T>
94
95template <typename T>
96struct is_rvalue_ref<T&&> : true_type {};
97
99template <typename T>
101
103template <typename T>
105
106template <typename T>
108
110template <typename T>
112
113namespace detail {
114
115// Only classes and unions can have pointers to members, even if
116// there is no such member in the class.
117template <typename T>
119
120template <typename>
122
123} // namespace detail
124
125// WARNING: this implementation of is_class detects unions as classes
126// because union is the same as struct/class but fields size.
127// Also it's impossible to differentiate class and union without
128// using compiler internal information.
129
131template <typename T>
132struct is_class : decltype(detail::test_is_class<T>(nullptr)) {};
133
135template <typename T>
137
139template <typename T>
141
142template <typename T>
143struct is_pointer<T*> : true_type {};
144
146template <typename T>
148
150template <typename T>
152 using type = T;
153};
154
155template <typename T>
157 using type = T;
158};
159
161template <typename T>
163
165template <typename T>
167 using type = T;
168};
169
170template <typename T>
171struct remove_ref<T&> {
172 using type = T;
173};
174
175template <typename T>
176struct remove_ref<T&&> {
177 using type = T;
178};
179
181template <typename T>
183
185template <bool Cond, typename IfTrue, typename IfFalse>
187 using type = IfTrue;
188};
189
190template <typename IfTrue, typename IfFalse>
192 using type = IfFalse;
193};
194
196template <bool Cond, typename IfTrue, typename IfFalse>
198
200template <bool Cond, typename T = void>
201struct enable_if {};
202
203template <typename T>
204struct enable_if<true, T> {
205 using type = T;
206};
207
209template <bool Cond, typename T = void>
211
212namespace detail {
213
214// NOTE: here we need another one level of redirection,
215// because without it SFINAE won't work: test_ptr_cast(const B*) is
216// a valid declaration, thefore, the compiler choose it over others overloads,
217// and only then it checks avalability/accessibility, which causes CE in case of
218// private/disambiguous inheritance. However the 'decltype' below enables SFINAE.
219
220template <typename B>
222
223template <typename>
225
226template <typename B, typename D>
227auto test_is_base_of(int) -> decltype(test_ptr_cast<B>(static_cast<D*>(nullptr)));
228
229template <typename, typename>
230auto test_is_base_of(...) -> true_type; // private/disambiguous base
231
232} // namespace detail
233
235template <typename Base, typename Derived>
237 is_class<Base>,
238 is_class<Derived>,
239 decltype(detail::test_is_base_of<Base, Derived>(0))> {};
240
242template <typename Base, typename Derived>
244
257template <typename...> using void_t = void;
258
259namespace detail {
260// TODO: add pointers to members support
261
262template <typename F, typename... Args>
263auto invoke() -> decltype(declval<F>()(declval<Args>()...));
264
265template <typename F, typename... Args>
267
268template <typename...>
270
271// can't use void_t as default parameter
272template <typename AlwaysVoid, typename F, typename... Args>
274
275template <typename F, typename... Args>
276struct invoke_result_impl<decltype(void(invoke<F, Args...>())), // just try to call 'invoke'
277 F,
278 Args...> {
279 using type = decltype(invoke<F, Args...>());
280};
281
282} // namespace detail
283
285template <typename F, typename... Args>
286struct is_invocable : decltype(detail::test_is_invocable<F, Args...>(0)) {};
287
289template <typename F, typename... Args>
290constexpr bool is_invocable_v = is_invocable<F, Args...>::value;
291
293template <typename F, typename... Args>
294struct invoke_result : detail::invoke_result_impl<void, F, Args...> {};
295
297template <typename F, typename... Args>
299
300} // namespace bmb
true_type test_is_invocable(decltype(invoke< F, Args... >(), 0))
true_type test_is_class(int T::*)
auto invoke() -> decltype(declval< F >()(declval< Args >()...))
true_type test_ptr_cast(const B *)
auto test_is_base_of(int) -> decltype(test_ptr_cast< B >(static_cast< D * >(nullptr)))
Definition algo_base.h:14
constexpr bool conjunction_v
Logical AND metafunction.
Definition type_traits.h:57
constexpr bool is_lvalue_ref_v
is_lvalue_ref_v
Definition type_traits.h:89
void void_t
Definition type_traits.h:257
constexpr bool is_same_v
is_same_v
Definition type_traits.h:78
enable_if< Cond, T >::type enable_if_t
enable_if_t
Definition type_traits.h:210
type_identity< T >::type type_identity_t
type_identity_t
Definition type_traits.h:31
bool_constant< true > true_type
true_type
Definition type_traits.h:45
constexpr bool is_class_v
is_class_v
Definition type_traits.h:136
invoke_result< F, Args... >::type invoke_result_t
invoke_result_t
Definition type_traits.h:298
conditional< Cond, IfTrue, IfFalse >::type conditional_t
conditional_t
Definition type_traits.h:197
constexpr bool is_invocable_v
is_invocable_v
Definition type_traits.h:290
constexpr bool is_const_v
is_const_v
Definition type_traits.h:111
remove_const< T >::type remove_const_t
remove_const_t
Definition type_traits.h:162
constexpr bool disjunction_v
Logical OR metafunction.
Definition type_traits.h:67
remove_ref< T >::type remove_ref_t
remove_ref_t
Definition type_traits.h:182
constexpr bool is_base_of_v
is_base_of_v
Definition type_traits.h:243
constexpr T && forward(remove_ref_t< T > &value) noexcept
Forward a lvalue.
Definition move.h:33
constexpr bool is_pointer_v
is_pointer_v
Definition type_traits.h:147
constexpr bool is_rvalue_ref_v
is_rvalue_ref_v
Definition type_traits.h:100
T && declval()
declval
Definition type_traits.h:11
IfFalse type
Definition type_traits.h:192
conditional
Definition type_traits.h:186
IfTrue type
Definition type_traits.h:187
Logical AND metafunction.
Definition type_traits.h:51
static constexpr bool value
Definition type_traits.h:52
decltype(invoke< F, Args... >()) type
Definition type_traits.h:279
Definition type_traits.h:273
Logical OR metafunction.
Definition type_traits.h:61
static constexpr bool value
Definition type_traits.h:62
T type
Definition type_traits.h:205
enable_if
Definition type_traits.h:201
integral_constant
Definition type_traits.h:35
decltype(val) value_type
Definition type_traits.h:36
static constexpr auto value
Definition type_traits.h:37
invoke_result
Definition type_traits.h:294
is_base_of
Definition type_traits.h:239
is_class
Definition type_traits.h:132
is_const
Definition type_traits.h:104
is_invocable
Definition type_traits.h:286
is_lvalue_ref
Definition type_traits.h:82
is_pointer
Definition type_traits.h:140
is_lvalue_ref
Definition type_traits.h:93
is_same
Definition type_traits.h:71
T type
Definition type_traits.h:157
remove_const
Definition type_traits.h:151
T type
Definition type_traits.h:152
T type
Definition type_traits.h:172
T type
Definition type_traits.h:177
remove_ref
Definition type_traits.h:166
T type
Definition type_traits.h:167
type_identity
Definition type_traits.h:25
T type
Definition type_traits.h:26