2#ifndef LIBSBX_UTILITY_CONCEPTS_HPP_
3#define LIBSBX_UTILITY_CONCEPTS_HPP_
7namespace sbx::utility {
9template<
typename Type,
typename... TypeList>
12template<
typename Type,
typename... TypeList>
13struct is_one_of<Type, Type, TypeList...> : std::true_type { };
15template<
typename Type,
typename Head,
typename... Rest>
18template<
typename Type,
typename... TypeList>
19inline constexpr auto is_one_of_v =
is_one_of<Type, TypeList...>::value;
21template<
typename Type,
typename... TypeList>
22concept one_of = is_one_of_v<Type, TypeList...>;
24template<
typename Type,
typename... TypeList>
25concept none_of = !is_one_of_v<Type, TypeList...>;
27template<
typename T,
typename... Rest>
28struct are_all_unique : std::bool_constant<!(std::is_same_v<T, Rest> || ...) && are_all_unique<Rest...>::value>{};
33template<
typename... TypeList>
34inline constexpr auto are_all_unique_v =
are_all_unique<TypeList...>::value;
36template<
typename... TypeList>
37concept all_unique = are_all_unique_v<TypeList...>;
39template<
typename Type,
typename... TypeList>
42template<
typename Type,
typename... TypeList>
45template<
typename Type,
typename Head,
typename... Rest>
46struct is_convertible_to_one_of<Type, Head, Rest...> : std::conditional_t<std::is_convertible_v<Type, Head>, std::true_type, is_convertible_to_one_of<Type, Rest...>> { };
48template<
typename Type,
typename... TypeList>
51template<
typename Type,
typename... TypeList>
52concept convertible_to_one_of = is_convertible_to_one_of_v<Type, TypeList...>;
55template<
typename Type,
typename Base>
56concept implements = !std::is_abstract_v<Type> && std::has_virtual_destructor_v<Base> && std::is_base_of_v<Base, Type>;
58template<
typename Type>
59struct is_complete : std::bool_constant<(sizeof(Type) != 0 && !std::is_void_v<Type>)> { };
61template<
typename Type>
64template<
typename Type>
65concept complete = is_complete_v<Type>;
67template<
typename To,
typename From>
69 using type = std::remove_const_t<To>;
72template<
typename To,
typename From>
74 using type =
const To;
77template<
typename To,
typename From>
78using constness_as_t =
typename constness_as<To, From>::type;
Definition: concepts.hpp:28
Definition: concepts.hpp:68
Definition: concepts.hpp:59
Definition: concepts.hpp:40
Definition: concepts.hpp:10