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_RANGE_TRAITS_HPP
15#define RANGES_V3_RANGE_TRAITS_HPP
16
17#include <array>
18#include <iterator>
19#include <type_traits>
20#include <utility>
21
22#include <meta/meta.hpp>
23
25
28
29#include <range/v3/detail/prologue.hpp>
30
31namespace ranges
32{
34 namespace detail
35 {
36 template<typename I, typename S>
37 using common_iterator_impl_t =
38 enable_if_t<(bool)(input_or_output_iterator<I> && sentinel_for<S, I>),
39 common_iterator<I, S>>;
40 }
42
45 template<typename I, typename S>
46 using common_iterator_t = meta::conditional_t<std::is_same<I, S>::value, I,
47 detail::common_iterator_impl_t<I, S>>;
48
50 namespace detail
51 {
52 template<typename I, typename S>
53 using cpp17_iterator_t =
55 common_iterator_t<I, S>, cpp17_iterator<common_iterator_t<I, S>>>;
56 }
58
59 // Aliases (SFINAE-able)
60 template<typename Rng>
61 using range_difference_t = iter_difference_t<iterator_t<Rng>>;
62
63 template<typename Rng>
64 using range_value_t = iter_value_t<iterator_t<Rng>>;
65
66 template<typename Rng>
67 using range_reference_t = iter_reference_t<iterator_t<Rng>>;
68
69 template<typename Rng>
70 using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<Rng>>;
71
72 template<typename Rng>
73 using range_common_reference_t = iter_common_reference_t<iterator_t<Rng>>;
74
75 template<typename Rng>
76 using range_size_t = decltype(ranges::size(std::declval<Rng &>()));
77
79 template<typename Rng>
80 using range_difference_type_t RANGES_DEPRECATED(
81 "range_difference_type_t is deprecated. Use the range_difference_t instead.") =
82 iter_difference_t<iterator_t<Rng>>;
83
84 template<typename Rng>
85 using range_value_type_t RANGES_DEPRECATED(
86 "range_value_type_t is deprecated. Use the range_value_t instead.") =
87 iter_value_t<iterator_t<Rng>>;
88
89 template<typename Rng>
90 using range_category_t RANGES_DEPRECATED(
91 "range_category_t is deprecated. Use the range concepts instead.") =
93
94 template<typename Rng>
95 using range_size_type_t RANGES_DEPRECATED(
96 "range_size_type_t is deprecated. Use range_size_t instead.") =
97 detail::iter_size_t<iterator_t<Rng>>;
99
100 template<typename Rng>
101 using range_common_iterator_t = common_iterator_t<iterator_t<Rng>, sentinel_t<Rng>>;
102
104 namespace detail
105 {
106 template<typename Rng>
107 using range_cpp17_iterator_t = cpp17_iterator_t<iterator_t<Rng>, sentinel_t<Rng>>;
108
109 std::integral_constant<cardinality, finite> test_cardinality(void *);
110 template<cardinality Card>
111 std::integral_constant<cardinality, Card> test_cardinality(basic_view<Card> *);
112 template<typename T, std::size_t N>
113 std::integral_constant<cardinality, static_cast<cardinality>(N)> test_cardinality(
114 T (*)[N]);
115 template<typename T, std::size_t N>
116 std::integral_constant<cardinality, static_cast<cardinality>(N)> test_cardinality(
117 std::array<T, N> *);
118 } // namespace detail
120
121 // User customization point for specifying the cardinality of ranges:
122 template<typename Rng, typename Void /*= void*/>
124 : meta::conditional_t<RANGES_IS_SAME(Rng, uncvref_t<Rng>),
125 decltype(detail::test_cardinality(
126 static_cast<uncvref_t<Rng> *>(nullptr))),
127 range_cardinality<uncvref_t<Rng>>>
128 {};
129
131 namespace cpp20
132 {
133 using ranges::range_difference_t;
134 using ranges::range_reference_t;
135 using ranges::range_rvalue_reference_t;
136 using ranges::range_value_t;
137 } // namespace cpp20
138} // namespace ranges
139
140#include <range/v3/detail/epilogue.hpp>
141
142#endif
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.
Definition traits.hpp:128