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