Advertisement
Guest User

Untitled

a guest
Feb 20th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1. #ifndef TTR_H
  2. #define TTR_H
  3.  
  4. #include  <functional>
  5. #include <type_traits>
  6. #include    <iterator>
  7.  
  8. namespace detail {
  9.  
  10.     template<class ...>
  11.     struct param_tester
  12.     {
  13.         using type = void;
  14.     };
  15.  
  16.     template<class... Args>
  17.     using void_t = typename param_tester<Args...>::type;
  18.    
  19.     namespace dispatch {
  20.  
  21.         using std::swap;
  22.  
  23.         template<class T, class X = T, std::size_t N = 0, class voider = void_t<>>
  24.         struct has_member_swap : private std::false_type { };
  25.  
  26.         template<class T, class X>
  27.         struct has_member_swap<T, X, 0,
  28.             void_t<decltype(swap(std::declval<T&>(), std::declval<X&>()))>
  29.         > : private std::integral_constant<bool,
  30.             std::is_move_assignable<T>::value &&
  31.             std::is_move_constructible<T>::value
  32.         > { };
  33.  
  34.         template<class T, class X, std::size_t N>
  35.         struct has_member_swap<T[N], X[N], N,
  36.             void_t<decltype(swap(std::declval<T[N]&>(), std::declval<X[N]&>()))>
  37.         > : private std::integral_constant<bool,
  38.             std::is_move_assignable<T>::value &&
  39.             std::is_move_constructible<T>::value
  40.         > { };
  41.     }
  42.    
  43.     template<class Iter>
  44.     struct has_iterator
  45.     {
  46.         enum {
  47.             value = std::is_copy_constructible<Iter>::value &&
  48.                     std::is_copy_assignable<Iter>::value    &&
  49.                     std::is_destructible<Iter>::value       &&
  50.                     dispatch::has_member_swap<Iter>::value
  51.         };
  52.     };
  53.  
  54.     template<class It, class voider = void_t<>>
  55.     struct is_iterator : private std::false_type { };
  56.  
  57.     template<class It>
  58.     struct is_iterator<It,
  59.         void_t
  60.         <
  61.         decltype(++std::declval<It&>()),
  62.         decltype(--std::declval<It&>()),
  63.         decltype(* std::declval<It&>()),
  64.         decltype(std::ptrdiff_t(std::declval<It&>().operator[](std::declval<std::ptrdiff_t>()))),
  65.         decltype(std::declval<It&>() +  std::declval<std::ptrdiff_t>()),
  66.         decltype(std::declval<It&>() -  std::declval<std::ptrdiff_t>()),
  67.         decltype(std::ptrdiff_t(std::declval<It&>() - std::declval<It const&>())),
  68.         decltype(std::declval<It&>() += std::declval<std::ptrdiff_t>()),
  69.         decltype(std::declval<It&>() -= std::declval<std::ptrdiff_t>()),
  70.         decltype(std::declval<It&>() == std::declval<It const&>()),
  71.         decltype(std::declval<It&>() =  std::declval<It const&>())
  72.         >
  73.     > : private std::integral_constant<bool,
  74.         has_iterator<It>::value ||
  75.         std::is_pointer<It>::value> { };
  76.  
  77.     template<class It>
  78.     struct is_iterator<It*> : std::true_type { };
  79.  
  80.     template<class It>
  81.     struct is_iterator<It const*> : std::true_type { };
  82.  
  83.     template<class It>
  84.     struct is_iterator<It* volatile> : std::true_type { };
  85.  
  86.     template<class It>
  87.     struct is_iterator<It const* volatile> : std::true_type { };
  88.    
  89.     template<class It>
  90.     using is_iterator_t = typename is_iterator<It>::type;
  91.    
  92.     template<class It>
  93.     using is_iterator_v = typename is_iterator<It>::value;
  94. }
  95. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement