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_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 
24 #include <range/v3/range_fwd.hpp>
25 
28 
29 #include <range/v3/detail/prologue.hpp>
30 
31 namespace 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
meta::size_t< L::size()> size
An integral constant wrapper that is the size of the meta::list L.
Definition: meta.hpp:1696
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