21 struct is_string : std::bool_constant<std::is_same_v<T, std::string> || std::is_same_v<T, std::wstring>> {};
23 template<
typename T,
typename _ =
void>
24 struct is_container : std::false_type {};
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> {};
30 template<
typename T,
typename _ =
void>
31 struct is_optional : std::false_type {};
34 struct is_optional<T, std::void_t<typename T::value_type>>
35 : std::is_same<T, std::optional<typename T::value_type>> {};
37 template<
typename T,
typename _ =
void>
38 struct is_pair : std::false_type {};
41 struct is_pair<T, std::void_t<
42 decltype(std::declval<T>().first),
43 decltype(std::declval<T>().second)
44 >> : std::true_type {};
47 struct is_variant : std::false_type {};
49 template<
typename... Ts>
50 struct is_variant<std::variant<Ts...>> : std::true_type {};
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>>>) || ...);
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>>())
69 constexpr U swap_endian(U val)
noexcept {
72 unsigned char bytes[
sizeof(U)];
76 for (std::size_t i = 0; i <
sizeof(U); ++i) {
77 dest.bytes[i] = src.bytes[
sizeof(U) - 1 - i];
151 template<
typename C,
typename U>
202 concept Pair = is_pair<T>::value;
228 concept Enum = std::is_enum_v<std::remove_cv_t<E>>;
243 std::is_unsigned_v<std::underlying_type_t<std::remove_cv_t<E>>>;
267 using UnderlyingType = std::underlying_type_t<std::remove_cv_t<E>>;
274 constexpr UnderlyingType<E> ToUnderlying(E e)
noexcept {
275 return static_cast<UnderlyingType<E>
>(e);
393 concept Variant = is_variant<std::remove_cvref_t<T>>::value;
406 template<
typename T,
typename U>
486 template<
typename F,
typename... Args>
487 concept Callable = std::is_invocable_v<F, Args...>;
501 template<
typename T,
typename U>
502 concept SameAs = std::is_same_v<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
516 template<
typename From,
typename To>
Concept to check if a type is arithmetic.
Definition type_traits.hxx:328
Concept to check if a type is callable.
Definition type_traits.hxx:487
Concept to check if a type is a class or struct.
Definition type_traits.hxx:380
Concept to check if a type is const-qualified.
Definition type_traits.hxx:367
Concept to check if a type is a container (excluding strings).
Definition type_traits.hxx:116
Concept to check if one type is convertible to another.
Definition type_traits.hxx:517
Concept to check if a type is copy constructible.
Definition type_traits.hxx:459
Concept to check if a type is default constructible.
Definition type_traits.hxx:446
Concept to check if a type is an enumeration.
Definition type_traits.hxx:228
Concept to check if a type is a floating-point type.
Definition type_traits.hxx:315
Concept that checks whether a container supports insert with a value.
Definition type_traits.hxx:141
Concept to check if a container has a key_type member type.
Definition type_traits.hxx:167
Concept to check if a container has a mapped_type member type.
Definition type_traits.hxx:176
Concept that checks whether a container supports push_back.
Definition type_traits.hxx:125
Concept that checks whether a container supports push_front.
Definition type_traits.hxx:133
Concept that checks whether a container supports operator[] for a given key/index type U.
Definition type_traits.hxx:152
Concept to check if a type is an integral type.
Definition type_traits.hxx:302
Concept to check if a type is move constructible.
Definition type_traits.hxx:472
Concept to check if a type is an optional.
Definition type_traits.hxx:189
Concept to check if a type is a pair.
Definition type_traits.hxx:202
Concept to check if a type is a pointer.
Definition type_traits.hxx:289
Concept to check if a type is a reference.
Definition type_traits.hxx:215
Concept to check if two types are the same.
Definition type_traits.hxx:502
Concept to check if a type is a scoped enumeration (enum class).
Definition type_traits.hxx:256
Concept to check if a type is signed.
Definition type_traits.hxx:341
Concept to check if a type is std::string or std::wstring.
Definition type_traits.hxx:102
Concept to check if a type is trivially copyable.
Definition type_traits.hxx:420
Concept to check if a type has a trivial destructor.
Definition type_traits.hxx:433
Concept to check if a type is an unsigned enumeration.
Definition type_traits.hxx:241
Concept to check if a type is unsigned.
Definition type_traits.hxx:354
Concept to check if a variant type contains a specific type.
Definition type_traits.hxx:407
Concept to check if a type is a variant.
Definition type_traits.hxx:393
Main namespace for the StormByte library.
Modern C++20 concepts for type checking.