sandbox
Loading...
Searching...
No Matches
concepts.hpp
1#ifndef LIBSBX_UTILITY_CONCEPTS_HPP_
2#define LIBSBX_UTILITY_CONCEPTS_HPP_
3
4#include <type_traits>
5
6namespace sbx::utility {
7
8template<typename Type, typename... TypeList>
9struct is_one_of : std::false_type { };
10
11template<typename Type, typename... TypeList>
12struct is_one_of<Type, Type, TypeList...> : std::true_type { };
13
14template<typename Type, typename Head, typename... Rest>
15struct is_one_of<Type, Head, Rest...> : is_one_of<Type, Rest...> { };
16
17template<typename Type, typename... TypeList>
18inline constexpr auto is_one_of_v = is_one_of<Type, TypeList...>::value;
19
20template<typename Type, typename... TypeList>
21concept one_of = is_one_of_v<Type, TypeList...>;
22
23template<typename Type, typename... TypeList>
24concept none_of = !is_one_of_v<Type, TypeList...>;
25
26template<typename T, typename... Rest>
27struct are_all_unique : std::bool_constant<!(std::is_same_v<T, Rest> || ...) && are_all_unique<Rest...>::value>{};
28
29template<typename T>
30struct are_all_unique<T> : std::true_type {};
31
32template<typename... TypeList>
33inline constexpr auto are_all_unique_v = are_all_unique<TypeList...>::value;
34
35template<typename... TypeList>
36concept all_unique = are_all_unique_v<TypeList...>;
37
38template<typename Type, typename... TypeList>
39struct is_convertible_to_one_of : std::false_type{ };
40
41template<typename Type, typename... TypeList>
42struct is_convertible_to_one_of<Type, Type, TypeList...> : std::true_type{ };
43
44template<typename Type, typename Head, typename... Rest>
45struct 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...>> { };
46
47template<typename Type, typename... TypeList>
48inline constexpr auto is_convertible_to_one_of_v = is_convertible_to_one_of<Type, TypeList...>::value;
49
50template<typename Type, typename... TypeList>
51concept convertible_to_one_of = is_convertible_to_one_of_v<Type, TypeList...>;
52
53
54template<typename Type, typename Base>
55concept implements = !std::is_abstract_v<Type> && std::has_virtual_destructor_v<Base> && std::is_base_of_v<Base, Type>;
56
57template<typename Type>
58struct is_complete : std::bool_constant<(sizeof(Type) != 0 && !std::is_void_v<Type>)> { };
59
60template<typename Type>
61inline constexpr auto is_complete_v = is_complete<Type>::value;
62
63template<typename Type>
64concept complete = is_complete_v<Type>;
65
66template<typename To, typename From>
68 using type = std::remove_const_t<To>;
69}; // struct constness_as
70
71template<typename To, typename From>
72struct constness_as<To, const From> {
73 using type = const To;
74}; // struct constness_as
75
76template<typename To, typename From>
77using constness_as_t = typename constness_as<To, From>::type;
78
79} // namespace sbx::utility
80
81#endif // LIBSBX_UTILITY_CONCEPTS_HPP_
Definition: concepts.hpp:27
Definition: concepts.hpp:67
Definition: concepts.hpp:58
Definition: concepts.hpp:39
Definition: concepts.hpp:9