All Classes Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
concepts/iterator.hpp
1 // The MIT License (MIT)
2 
3 // Copyright (c) 2012-2014 Danny Y., Rapptz
4 
5 // Permission is hereby granted, free of charge, to any person obtaining a copy of
6 // this software and associated documentation files (the "Software"), to deal in
7 // the Software without restriction, including without limitation the rights to
8 // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9 // the Software, and to permit persons to whom the Software is furnished to do so,
10 // subject to the following conditions:
11 
12 // The above copyright notice and this permission notice shall be included in all
13 // copies or substantial portions of the Software.
14 
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17 // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18 // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 
22 #ifndef GEARS_CONCEPTS_ITERATOR_HPP
23 #define GEARS_CONCEPTS_ITERATOR_HPP
24 
25 #include "basic.hpp"
26 
27 namespace gears {
28 namespace concepts {
29 namespace detail {
30 struct is_random_access {
31  template<typename It,
32  typename D = typename Bare<It>::difference_type,
33  typename R = typename Bare<It>::reference,
34  TrueIf<std::is_same<decltype(std::declval<It&>() += 2), It&>,
35  std::is_same<decltype(std::declval<It&>() + 2), It>,
36  std::is_same<decltype(2 + std::declval<It&>()), It>,
37  std::is_same<decltype(std::declval<It&>() -= 2), It&>,
38  std::is_same<decltype(std::declval<It&>() - 2), It>,
39  std::is_same<decltype(std::declval<It&>() - (std::declval<It&>() + 2)), D>,
40  std::is_convertible<decltype(std::declval<It&>()[2]), R>>...>
41  static std::true_type test(int);
42  template<typename...>
43  static std::false_type test(...);
44 };
45 } // detail
46 
76 template<typename T>
77 struct Iterator : And<CopyConstructible<T>,
81  Incrementable<T>> {};
82 
96 template<typename T>
97 struct InputIterator : And<Iterator<T>, EqualityComparable<T>> {};
98 
112 template<typename T>
113 struct OutputIterator : And<Iterator<T>, Assignable<T>> {};
114 
128 template<typename T>
129 struct ForwardIterator : And<InputIterator<T>, DefaultConstructible<T>> {};
130 
144 template<typename T>
145 struct MutableForwardIterator : And<ForwardIterator<T>, Assignable<T>> {};
146 
160 template<typename T>
161 struct BidirectionalIterator : And<ForwardIterator<T>, Decrementable<T>> {};
162 
176 template<typename T>
177 struct MutableBidirectionalIterator : And<MutableForwardIterator<T>, Decrementable<T>> {};
178 
207 template<typename T>
208 struct RandomAccessIterator : Or<Pointer<T>,
209  And<BidirectionalIterator<T>,
210  Comparable<T>,
211  TraitOf<detail::is_random_access, T>>> {};
212 
226 template<typename T>
227 struct MutableRandomAccessIterator : And<RandomAccessIterator<T>, Assignable<T>> {};
228 } // concepts
229 } // gears
230 
231 #endif // GEARS_CONCEPTS_ITERATOR_HPP