halcheck 1.0
Loading...
Searching...
No Matches
type_traits.hpp
1#ifndef HALCHECK_LIB_ITERATOR_TYPE_TRAITS_HPP
2#define HALCHECK_LIB_ITERATOR_TYPE_TRAITS_HPP
3
4// IWYU pragma: private, include <halcheck/lib/iterator.hpp>
5
6#include <halcheck/lib/iterator/base.hpp>
7#include <halcheck/lib/type_traits.hpp>
8
9#include <iterator>
10
11namespace halcheck { namespace lib {
12
14template<typename I>
15using iterator = lib::void_t<
16 lib::copy_constructible<I>,
17 lib::copy_assignable<I>,
18 lib::destructible<I>,
19 lib::swappable<I>,
23 decltype(*std::declval<I &>()),
24 lib::same<decltype(++std::declval<I &>()), I &>>;
25
33template<typename I>
34struct is_iterator : lib::is_detected<lib::iterator, I> {};
35
37template<typename I>
38using input_iterator = lib::void_t<
39 lib::iterator<I>,
40 lib::equality_comparable<I>,
41 lib::same<decltype(*std::declval<I &>()), lib::iter_reference_t<I>>,
42 lib::convertible<lib::iter_reference_t<I>, const lib::iter_value_t<I> &>,
43 lib::convertible<decltype(*std::declval<I &>()++), const lib::iter_value_t<I> &>,
45
53template<typename I>
54struct is_input_iterator : lib::is_detected<lib::input_iterator, I> {};
55
57template<typename I, typename T>
58using output_iterator = lib::void_t<
59 lib::iterator<I>,
61 lib::convertible<decltype(std::declval<I &>()++), const I &>,
64
72template<typename I, typename T>
73struct is_output_iterator : lib::is_detected<lib::output_iterator, I, T> {};
74
76template<typename I>
77using forward_iterator = lib::void_t<
78 lib::input_iterator<I>,
79 lib::default_constructible<I>,
80 lib::convertible<decltype(std::declval<I &>()++), const I &>,
81 lib::same<decltype(*std::declval<I &>()++), lib::iter_reference_t<I>>,
83
91template<typename I>
92struct is_forward_iterator : lib::is_detected<lib::forward_iterator, I> {};
93
95template<typename I>
96using bidirectional_iterator = lib::void_t<
97 lib::forward_iterator<I>,
98 lib::same<decltype(*std::declval<I &>()--), lib::iter_reference_t<I>>,
99 lib::same<decltype(--std::declval<I &>()), I &>,
100 lib::convertible<decltype(std::declval<I &>()--), const I &>,
102
110template<typename I>
111struct is_bidirectional_iterator : lib::is_detected<lib::bidirectional_iterator, I> {};
112
114template<typename I>
115using random_access_iterator = lib::void_t<
116 lib::bidirectional_iterator<I>,
117 lib::same<decltype(std::declval<I &>() += std::declval<const lib::iter_difference_t<I> &>()), I &>,
120 lib::same<decltype(std::declval<I &>() -= std::declval<const lib::iter_difference_t<I> &>()), I &>,
121 lib::same<decltype(std::declval<const I &>() - std::declval<const lib::iter_difference_t<I> &>()), I>,
122 lib::same<decltype(std::declval<const I &>() - std::declval<const I &>()), lib::iter_difference_t<I>>,
123 lib::convertible<
126 lib::boolean_testable<decltype(std::declval<const I &>() < std::declval<const I &>())>,
127 lib::boolean_testable<decltype(std::declval<const I &>() > std::declval<const I &>())>,
128 lib::boolean_testable<decltype(std::declval<const I &>() <= std::declval<const I &>())>,
129 lib::boolean_testable<decltype(std::declval<const I &>() >= std::declval<const I &>())>,
131
139template<typename I>
140struct is_random_access_iterator : lib::is_detected<lib::random_access_iterator, I> {};
141
142}} // namespace halcheck::lib
143
144#endif
T declval(T... args)
T forward(T... args)
typename std::iterator_traits< I >::value_type iter_value_t
The type of value pointed to by an iterator.
Definition base.hpp:16
typename std::iterator_traits< I >::difference_type iter_difference_t
The return type of operator- for an iterator.
Definition base.hpp:32
typename std::iterator_traits< I >::reference iter_reference_t
The return type of operator* for an iterator.
Definition base.hpp:24
typename std::iterator_traits< I >::iterator_category iter_category_t
A tag type indicating the level of supported iterator options a type provides.
Definition base.hpp:40
typename std::enable_if< Cond, T >::type enable_if_t
An implementation of std::enable_if_t.
Definition type_traits.hpp:93
void void_t
An implementation of std::void_t.
Definition type_traits.hpp:43
Determines whether a type satisfies the LegacyBidirectionalIterator concept.
Definition type_traits.hpp:111
An implementation of std::experimental::is_detected.
Definition type_traits.hpp:247
Determines whether a type satisfies the LegacyForwardIterator concept.
Definition type_traits.hpp:92
Determines whether a type satisfies the LegacyInputIterator concept.
Definition type_traits.hpp:54
Determines whether a type satisfies the LegacyIterator concept.
Definition type_traits.hpp:34
Determines whether a type satisfies the LegacyOutputIterator concept.
Definition type_traits.hpp:73
Determines whether a type satisfies the LegacyRandomAccessIterator concept.
Definition type_traits.hpp:140