13 #ifndef CXXUTILS_CONCEPTS_H
14 #define CXXUTILS_CONCEPTS_H
17 #include <type_traits>
29 template <
class HASHER,
class T>
31 std::destructible<HASHER> &&
32 std::copy_constructible<HASHER> &&
35 {
h(
x) } -> std::same_as<std::size_t>;
40 template <
class PRED,
class ARG1,
class ARG2=ARG1>
42 std::copy_constructible<PRED> &&
43 std::predicate<PRED, ARG1, ARG2>;
46 template <
class CONTAINER>
50 requires std::contiguous_iterator<decltype(
c.begin())>;
54 template <
class ITERATOR,
class VAL>
56 std::input_iterator<ITERATOR> &&
57 std::convertible_to<std::iter_value_t<ITERATOR>, VAL>;
59 template <
typename SET>
61 typename SET::value_type;
62 typename SET::key_type;
64 typename SET::const_iterator;
66 typename SET::const_reference;
67 typename SET::const_pointer;
69 {
s.find(
k) } -> std::convertible_to<typename SET::const_iterator>;
70 {
s.insert(
k) } -> std::convertible_to<std::pair<typename SET::iterator, bool>>;
73 template <
typename MAP>
75 typename MAP::value_type;
76 typename MAP::key_type;
77 typename MAP::mapped_type;
79 {
m[
k] } -> std::convertible_to<typename MAP::mapped_type>;
80 {
m.find(
k) } -> std::convertible_to<typename MAP::iterator>;
81 {
m.insert(std::make_pair(
k,
v)) } -> std::same_as<std::pair<typename MAP::iterator, bool>>;
86 template <
typename F,
typename T>
88 std::invocable<F> && std::convertible_to<std::invoke_result_t<F>, T*>;
106 #endif // not CXXUTILS_CONCEPTS_H