StormByte C++ Library 0.0.9999
StormByte is a comprehensive, cross-platform C++ library aimed at easing system programming, configuration management, logging, and database handling tasks. This library provides a unified API that abstracts away the complexities and inconsistencies of different platforms (Windows, Linux).
Loading...
Searching...
No Matches
type_traits.hxx
1#pragma once
2
3#include <concepts>
4#include <optional>
5#include <string>
6#include <type_traits>
7#include <utility>
8#include <variant>
9
17namespace StormByte {
18 // Implementation detail: type traits for internal use only
19 namespace {
20 template<typename T>
21 struct is_string : std::bool_constant<std::is_same_v<T, std::string> || std::is_same_v<T, std::wstring>> {};
22
23 template<typename T, typename _ = void>
24 struct is_container : std::false_type {};
25
26 template<typename T>
27 struct is_container<T, std::void_t<decltype(std::declval<T>().begin()), decltype(std::declval<T>().end()), typename T::value_type>>
28 : std::bool_constant<!is_string<std::decay_t<T>>::value> {};
29
30 template<typename T, typename _ = void>
31 struct is_optional : std::false_type {};
32
33 template<typename T>
34 struct is_optional<T, std::void_t<typename T::value_type>>
35 : std::is_same<T, std::optional<typename T::value_type>> {};
36
37 template<typename T, typename _ = void>
38 struct is_pair : std::false_type {};
39
40 template<typename T>
41 struct is_pair<T, std::void_t<
42 decltype(std::declval<T>().first),
43 decltype(std::declval<T>().second)
44 >> : std::true_type {};
45
46 template<typename T>
47 struct is_variant : std::false_type {};
48
49 template<typename... Ts>
50 struct is_variant<std::variant<Ts...>> : std::true_type {};
51
52 template<typename VariantT, typename U, std::size_t... I>
53 constexpr bool variant_has_type_impl(std::index_sequence<I...>) noexcept {
54 return ((std::is_same_v<std::remove_cvref_t<U>, std::remove_cvref_t<std::variant_alternative_t<I, VariantT>>>) || ...);
55 }
56
57 template<typename VariantT, typename U>
58 struct variant_has_type : std::bool_constant<
59 variant_has_type_impl<VariantT, U>(std::make_index_sequence<std::variant_size_v<VariantT>>())
60 > {};
61 }
62
70 namespace Type {
81 template<typename T>
82 concept String = is_string<T>::value;
83
95 template<typename T>
96 concept Container = is_container<T>::value;
97
108 template<typename T>
109 concept Optional = is_optional<T>::value;
110
121 template<typename T>
122 concept Pair = is_pair<T>::value;
123
134 template<typename T>
135 concept Reference = std::is_reference_v<T>;
136
147 template<typename E>
148 concept Enum = std::is_enum_v<std::remove_cv_t<E>>;
149
160 template<typename E>
161 concept ScopedEnum = std::is_scoped_enum_v<E>;
162
173 template<typename T>
174 concept Pointer = std::is_pointer_v<T>;
175
186 template<typename T>
187 concept Integral = std::is_integral_v<T>;
188
199 template<typename T>
200 concept FloatingPoint = std::is_floating_point_v<T>;
201
212 template<typename T>
213 concept Arithmetic = std::is_arithmetic_v<T>;
214
225 template<typename T>
226 concept Signed = std::is_signed_v<T>;
227
238 template<typename T>
239 concept Unsigned = std::is_unsigned_v<T>;
240
251 template<typename T>
252 concept Const = std::is_const_v<T>;
253
264 template<typename T>
265 concept Class = std::is_class_v<T>;
266
277 template<typename T>
278 concept Variant = is_variant<std::remove_cvref_t<T>>::value;
279
291 template<typename T, typename U>
292 concept VariantHasType = Variant<T> && variant_has_type<std::remove_cvref_t<T>, U>::value;
293
304 template<typename T>
305 concept TriviallyCopyable = std::is_trivially_copyable_v<T>;
306
317 template<typename T>
318 concept TriviallyDestructible = std::is_trivially_destructible_v<T>;
319
330 template<typename T>
331 concept DefaultConstructible = std::is_default_constructible_v<T>;
332
343 template<typename T>
344 concept CopyConstructible = std::is_copy_constructible_v<T>;
345
356 template<typename T>
357 concept MoveConstructible = std::is_move_constructible_v<T>;
358
371 template<typename F, typename... Args>
372 concept Callable = std::is_invocable_v<F, Args...>;
373
386 template<typename T, typename U>
387 concept SameAs = std::is_same_v<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
388
401 template<typename From, typename To>
402 concept ConvertibleTo = std::is_convertible_v<From, To>;
403 }
404}
Concept to check if a type is arithmetic.
Definition type_traits.hxx:213
Concept to check if a type is callable.
Definition type_traits.hxx:372
Concept to check if a type is a class or struct.
Definition type_traits.hxx:265
Concept to check if a type is const-qualified.
Definition type_traits.hxx:252
Concept to check if a type is a container (excluding strings).
Definition type_traits.hxx:96
Concept to check if one type is convertible to another.
Definition type_traits.hxx:402
Concept to check if a type is copy constructible.
Definition type_traits.hxx:344
Concept to check if a type is default constructible.
Definition type_traits.hxx:331
Concept to check if a type is an enumeration.
Definition type_traits.hxx:148
Concept to check if a type is a floating-point type.
Definition type_traits.hxx:200
Concept to check if a type is an integral type.
Definition type_traits.hxx:187
Concept to check if a type is move constructible.
Definition type_traits.hxx:357
Concept to check if a type is an optional.
Definition type_traits.hxx:109
Concept to check if a type is a pair.
Definition type_traits.hxx:122
Concept to check if a type is a pointer.
Definition type_traits.hxx:174
Concept to check if a type is a reference.
Definition type_traits.hxx:135
Concept to check if two types are the same.
Definition type_traits.hxx:387
Concept to check if a type is a scoped enumeration (enum class).
Definition type_traits.hxx:161
Concept to check if a type is signed.
Definition type_traits.hxx:226
Concept to check if a type is std::string or std::wstring.
Definition type_traits.hxx:82
Concept to check if a type is trivially copyable.
Definition type_traits.hxx:305
Concept to check if a type has a trivial destructor.
Definition type_traits.hxx:318
Concept to check if a type is unsigned.
Definition type_traits.hxx:239
Concept to check if a variant type contains a specific type.
Definition type_traits.hxx:292
Concept to check if a type is a variant.
Definition type_traits.hxx:278
Main namespace for the StormByte library.
Modern C++20 concepts for type checking.