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