Horizon
traits.hpp
Go to the documentation of this file.
1 // Range v3 library
3 //
4 // Copyright Eric Niebler 2013-present
5 //
6 // Use, modification and distribution is subject to the
7 // Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10 //
11 // Project home: https://github.com/ericniebler/range-v3
12 //
13 
14 #ifndef RANGES_V3_ITERATOR_TRAITS_HPP
15 #define RANGES_V3_ITERATOR_TRAITS_HPP
16 
17 #include <iterator>
18 #include <type_traits>
19 
20 #include <meta/meta.hpp>
21 
22 #include <concepts/concepts.hpp>
23 
24 #include <range/v3/range_fwd.hpp>
25 
26 #include <range/v3/iterator/access.hpp> // for iter_move, iter_swap
28 
29 #include <range/v3/detail/prologue.hpp>
30 
31 namespace ranges
32 {
35 
37  using input_iterator_tag RANGES_DEPRECATED(
38  "Please switch to the standard iterator tags") = std::input_iterator_tag;
39  using forward_iterator_tag RANGES_DEPRECATED(
40  "Please switch to the standard iterator tags") = std::forward_iterator_tag;
41  using bidirectional_iterator_tag RANGES_DEPRECATED(
42  "Please switch to the standard iterator tags") = std::bidirectional_iterator_tag;
43  using random_access_iterator_tag RANGES_DEPRECATED(
44  "Please switch to the standard iterator tags") = std::random_access_iterator_tag;
46 
47  struct contiguous_iterator_tag : std::random_access_iterator_tag
48  {};
49 
51  namespace detail
52  {
53  template<typename I, typename = iter_reference_t<I>,
54  typename R = decltype(iter_move(std::declval<I &>())), typename = R &>
55  using iter_rvalue_reference_t = R;
56 
57  template<typename I>
58  RANGES_INLINE_VAR constexpr bool has_nothrow_iter_move_v =
59  noexcept(iter_rvalue_reference_t<I>(ranges::iter_move(std::declval<I &>())));
60  } // namespace detail
62 
63  template<typename I>
64  using iter_rvalue_reference_t = detail::iter_rvalue_reference_t<I>;
65 
66  template<typename I>
67  using iter_common_reference_t =
68  common_reference_t<iter_reference_t<I>, iter_value_t<I> &>;
69 
70 #if defined(RANGES_DEEP_STL_INTEGRATION) && RANGES_DEEP_STL_INTEGRATION && \
71  !defined(RANGES_DOXYGEN_INVOKED)
72  template<typename T>
73  using iter_difference_t =
75  std::iterator_traits<uncvref_t<T>>,
76  incrementable_traits<uncvref_t<T>>>::difference_type;
77 #else
78  template<typename T>
79  using iter_difference_t =
80  typename incrementable_traits<uncvref_t<T>>::difference_type;
81 #endif
82 
83  // Defined in <range/v3/iterator/access.hpp>
84  // template<typename T>
85  // using iter_value_t = ...
86 
87  // Defined in <range/v3/iterator/access.hpp>
88  // template<typename R>
89  // using iter_reference_t = detail::iter_reference_t_<R>;
90 
91  // Defined in <range/v3/range_fwd.hpp>:
92  // template<typename S, typename I>
93  // inline constexpr bool disable_sized_sentinel = false;
94 
96  namespace detail
97  {
98  template<typename I>
99  using iter_size_t =
101  std::make_unsigned<iter_difference_t<I>>,
103 
104  template<typename I>
105  using iter_arrow_t = decltype(std::declval<I &>().operator->());
106 
107  template<typename I>
108  using iter_pointer_t =
110  meta::is_trait<meta::defer<iter_arrow_t, I>>::value,
112  std::add_pointer<iter_reference_t<I>>>>;
113 
114  template<typename T>
115  struct difference_type_ : meta::defer<iter_difference_t, T>
116  {};
117 
118  template<typename T>
119  struct value_type_ : meta::defer<iter_value_t, T>
120  {};
121 
122  template<typename T>
123  struct size_type_ : meta::defer<iter_size_t, T>
124  {};
125  } // namespace detail
126 
127  template<typename T>
128  using difference_type_t RANGES_DEPRECATED(
129  "ranges::difference_type_t is deprecated. Please use "
130  "ranges::iter_difference_t instead.") = iter_difference_t<T>;
131 
132  template<typename T>
133  using value_type_t RANGES_DEPRECATED(
134  "ranges::value_type_t is deprecated. Please use "
135  "ranges::iter_value_t instead.") = iter_value_t<T>;
136 
137  template<typename R>
138  using reference_t RANGES_DEPRECATED(
139  "ranges::reference_t is deprecated. Use ranges::iter_reference_t "
140  "instead.") = iter_reference_t<R>;
141 
142  template<typename I>
143  using rvalue_reference_t RANGES_DEPRECATED(
144  "rvalue_reference_t is deprecated; "
145  "use iter_rvalue_reference_t instead") = iter_rvalue_reference_t<I>;
146 
147  template<typename T>
148  struct RANGES_DEPRECATED(
149  "ranges::size_type is deprecated. Iterators do not have an associated "
150  "size_type.") size_type : detail::size_type_<T>
151  {};
152 
153  template<typename I>
154  using size_type_t RANGES_DEPRECATED("size_type_t is deprecated.") =
155  detail::iter_size_t<I>;
157 
158  namespace cpp20
159  {
160  using ranges::iter_common_reference_t;
161  using ranges::iter_difference_t;
162  using ranges::iter_reference_t;
163  using ranges::iter_rvalue_reference_t;
164  using ranges::iter_value_t;
165 
166  // Specialize these in the ranges:: namespace
167  using ranges::disable_sized_sentinel;
168  template<typename T>
169  using incrementable_traits = ranges::incrementable_traits<T>;
170  template<typename T>
171  using indirectly_readable_traits = ranges::indirectly_readable_traits<T>;
172  } // namespace cpp20
174 } // namespace ranges
175 
176 #include <range/v3/detail/epilogue.hpp>
177 
178 #endif // RANGES_V3_ITERATOR_TRAITS_HPP
typename T::type _t
Type alias for T::type.
Definition: meta.hpp:141
typename detail::_cond< If >::template invoke< Then, Else > conditional_t
Select one type or another depending on a compile-time Boolean.
Definition: meta.hpp:1148
_t< detail::is_< T, C > > is
is
Definition: meta.hpp:874
Tiny meta-programming library.
A wrapper that defers the instantiation of a template C with type parameters Ts in a lambda or let ex...
Definition: meta.hpp:787
A trait that always returns its argument T.
Definition: meta.hpp:558
Definition: traits.hpp:48
Definition: associated_types.hpp:166
Definition: associated_types.hpp:236