14 #ifndef RANGES_V3_VIEW_TAIL_HPP
15 #define RANGES_V3_VIEW_TAIL_HPP
17 #include <type_traits>
27 #include <range/v3/utility/static_const.hpp>
32 #include <range/v3/detail/prologue.hpp>
39 constexpr T prev_or_zero_(T n)
41 return n == 0 ? T(0) : T(n - 1);
47 template<
typename Rng>
50 (range_cardinality<Rng>::value >= 0)
51 ? detail::prev_or_zero_(range_cardinality<Rng>::value)
60 : rng_(
static_cast<Rng &&
>(rng))
62 CPP_assert(input_range<Rng>);
66 return next(ranges::begin(rng_), 1, ranges::end(rng_));
68 template(
bool Const =
true)(
69 requires Const AND
range<meta::const_if_c<Const, Rng>>)
72 return next(ranges::begin(rng_), 1, ranges::end(rng_));
76 return ranges::end(rng_);
78 template(
bool Const =
true)(
79 requires Const AND
range<meta::const_if_c<Const, Rng>>)
80 sentinel_t<meta::const_if_c<Const, Rng>> end()
const
82 return ranges::end(rng_);
86 constexpr
auto CPP_fun(size)()(
87 requires(
bool(sized_range<Rng>)))
89 using size_type = range_size_t<Rng>;
95 constexpr
auto CPP_fun(size)()(
const
96 requires(
bool(sized_range<Rng const>)))
98 using size_type = range_size_t<Rng>;
109 template<
typename Rng>
110 RANGES_INLINE_VAR constexpr
bool enable_borrowed_range<tail_view<Rng>> =
111 enable_borrowed_range<Rng>;
113 #if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17
114 template(
typename Rng)(
115 requires viewable_range<Rng>)
117 ->tail_view<views::all_t<Rng>>;
124 template(
typename Rng)(
125 requires viewable_range<Rng> AND input_range<Rng>)
126 meta::if_c<range_cardinality<Rng>::value == 0,
129 operator()(Rng && rng)
const
131 return all(
static_cast<Rng &&
>(rng));
142 #include <range/v3/detail/epilogue.hpp>
143 #include <range/v3/detail/satisfy_boost_range.hpp>
CPP_concept range
\concept range
Definition: concepts.hpp:69
decltype(begin(declval(Rng &))) iterator_t
Definition: access.hpp:698
RANGES_INLINE_VARIABLE(detail::to_container_fn< detail::from_range< std::vector >>, to_vector) template< template< typename... > class ContT > auto to(RANGES_HIDDEN_DETAIL(detail
For initializing a container of the specified type with the elements of an Range.
Definition: conversion.hpp:399
meta::size_t< L::size()> size
An integral constant wrapper that is the size of the meta::list L.
Definition: meta.hpp:1696
Definition: traits.hpp:128
Definition: interface.hpp:129