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
26
27
28template<typename T, typename... Rest>
29struct are_all_unique : std::bool_constant<!(std::is_same_v<T, Rest> || ...) && are_all_unique<Rest...>::value>{};
30
31template<typename T>
32struct are_all_unique<T> : std::true_type {};
33
34template<typename... TypeList>
35inline constexpr auto are_all_unique_v = are_all_unique<TypeList...>::value;
36
37template<typename... TypeList>
38concept all_unique = are_all_unique_v<TypeList...>;
39
40
41
42template<typename Type, typename... TypeList>
43struct is_convertible_to_one_of : std::false_type{ };
44
45template<typename Type, typename... TypeList>
46struct is_convertible_to_one_of<Type, Type, TypeList...> : std::true_type{ };
47
48template<typename Type, typename Head, typename... Rest>
49struct 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...>> { };
50
51template<typename Type, typename... TypeList>
52inline constexpr auto is_convertible_to_one_of_v = is_convertible_to_one_of<Type, TypeList...>::value;
53
54template<typename Type, typename... TypeList>
55concept convertible_to_one_of = is_convertible_to_one_of_v<Type, TypeList...>;
56
57
58template<typename Type, typename Base>
59concept implements = !std::is_abstract_v<Type> && std::has_virtual_destructor_v<Base> && std::is_base_of_v<Base, Type>;
60
61template<typename Type>
62struct is_complete : std::bool_constant<(sizeof(Type) != 0 && !std::is_void_v<Type>)> { };
63
64template<typename Type>
65inline constexpr auto is_complete_v = is_complete<Type>::value;
66
67template<typename Type>
68concept complete = is_complete_v<Type>;
69
70} // namespace sbx::utility
71
72#endif // LIBSBX_UTILITY_CONCEPTS_HPP_
Definition: concepts.hpp:29
Definition: concepts.hpp:62
Definition: concepts.hpp:43
Definition: concepts.hpp:9