1#ifndef LIBSBX_UTILITY_CONCEPTS_HPP_
2#define LIBSBX_UTILITY_CONCEPTS_HPP_
6namespace sbx::utility {
8template<
typename Type,
typename... TypeList>
11template<
typename Type,
typename... TypeList>
12struct is_one_of<Type, Type, TypeList...> : std::true_type { };
14template<
typename Type,
typename Head,
typename... Rest>
17template<
typename Type,
typename... TypeList>
18inline constexpr auto is_one_of_v =
is_one_of<Type, TypeList...>::value;
20template<
typename Type,
typename... TypeList>
21concept one_of = is_one_of_v<Type, TypeList...>;
23template<
typename Type,
typename... TypeList>
24concept none_of = !is_one_of_v<Type, TypeList...>;
28template<
typename T,
typename... Rest>
29struct are_all_unique : std::bool_constant<!(std::is_same_v<T, Rest> || ...) && are_all_unique<Rest...>::value>{};
34template<
typename... TypeList>
35inline constexpr auto are_all_unique_v =
are_all_unique<TypeList...>::value;
37template<
typename... TypeList>
38concept all_unique = are_all_unique_v<TypeList...>;
42template<
typename Type,
typename... TypeList>
45template<
typename Type,
typename... TypeList>
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...>> { };
51template<
typename Type,
typename... TypeList>
54template<
typename Type,
typename... TypeList>
55concept convertible_to_one_of = is_convertible_to_one_of_v<Type, TypeList...>;
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>;
61template<
typename Type>
62struct is_complete : std::bool_constant<(sizeof(Type) != 0 && !std::is_void_v<Type>)> { };
64template<
typename Type>
67template<
typename Type>
68concept complete = is_complete_v<Type>;
Definition: concepts.hpp:29
Definition: concepts.hpp:62
Definition: concepts.hpp:43
Definition: concepts.hpp:9