Horizon
Loading...
Searching...
No Matches
traits.hpp
Go to the documentation of this file.
1
2// 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
25
26#include <range/v3/iterator/access.hpp> // for iter_move, iter_swap
28
29#include <range/v3/detail/prologue.hpp>
30
31namespace 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
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