Advertisement
Guest User

concepts.h

a guest
May 12th, 2017
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <algorithm>
  4. #include <functional>
  5. #include <type_traits>
  6.  
  7. using namespace std;
  8.  
  9. template<typename T>
  10. concept bool CopyConstructible = is_copy_constructible<T>::value;
  11.  
  12.  
  13. template<typename T>
  14. concept bool Swappable = requires(T a, T b) {
  15.     { swap(a, b) } -> void;
  16. };
  17.  
  18. template<typename T>
  19. concept bool Destructible = requires(T a) {
  20.     { (&a)->~T() } -> void;
  21. };
  22.  
  23. template<typename T>
  24. concept bool Iterable = requires (T a) {
  25.     { begin(a) } -> typename T::iterator;
  26.     { end(a) } -> typename T::iterator;
  27. };
  28.  
  29. template<typename T>
  30. concept bool ConstIterable = requires (T a) {
  31.     { cbegin(a) } -> typename T::const_iterator;
  32.     { cend(a) } -> typename T::const_iterator;
  33. };
  34.  
  35. template<typename T>
  36. concept bool EqualityComparable = requires (T a, T b) {
  37.     { a == b } -> bool;
  38.     { a != b } -> bool;
  39. };
  40.  
  41. template<typename T>
  42. concept bool Incrementable = requires (T a) {
  43.     { a++ } -> T;
  44. };
  45.  
  46. template<typename T>
  47. concept bool Decrementable = requires (T a) {
  48.     { a-- } -> T;
  49. };
  50.  
  51. template<typename T>
  52. concept bool Container = CopyConstructible<T> &&
  53.                          Destructible<T> &&
  54.                          EqualityComparable<T> &&
  55.                          Swappable<T> &&
  56.                          Iterable<T> &&
  57.                          ConstIterable<T>;
  58.  
  59. template<typename T, typename V = typename T::value_type, typename I = typename T::iterator>
  60. concept bool Insertable = requires (T a, V v, I it) {
  61.     { a.insert(it, v) } -> I;
  62. };
  63.  
  64. template<typename T, typename V = typename T::value_type, typename I = typename T::iterator>
  65. concept bool InsertableContainer = Container<T> && Insertable<T, V, I>;
  66.  
  67. template<typename P, typename ... A>
  68. concept bool Predicate = requires(P p, A ... args) {
  69.     { p(args...) } -> bool;
  70. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement