14 #ifndef RANGES_V3_VIEW_TRIM_HPP
15 #define RANGES_V3_VIEW_TRIM_HPP
22 #include <range/v3/detail/config.hpp>
36 #include <range/v3/detail/prologue.hpp>
42 template<
typename Rng,
typename Pred>
47 semiregular_box_t<Pred> pred_;
48 detail::non_propagating_cache<iterator_t<Rng>> begin_;
49 detail::non_propagating_cache<iterator_t<Rng>> end_;
57 : rng_(std::move(rng))
58 , pred_(std::move(pred))
64 begin_ = find_if_not(rng_, std::ref(pred_));
71 const auto first = begin();
72 auto last = ranges::end(rng_);
74 if(!
invoke(pred_, *--last))
79 end_ = std::move(last);
90 template<
typename Rng,
typename Pred>
91 RANGES_INLINE_VAR constexpr
bool enable_borrowed_range<trim_view<Rng, Pred>> =
92 enable_borrowed_range<Rng>;
94 #if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17
95 template<
typename Rng,
typename Pred>
100 template<
typename Rng,
typename Pred>
101 RANGES_INLINE_VAR constexpr
bool disable_sized_range<trim_view<Rng, Pred>> =
true;
107 template(
typename Rng,
typename Pred)(
108 requires viewable_range<Rng> AND bidirectional_range<Rng> AND
112 operator()(Rng && rng, Pred pred)
const
114 return {all(
static_cast<Rng &&
>(rng)), std::move(pred)};
116 template(
typename Rng,
typename Pred,
typename Proj)(
117 requires viewable_range<Rng> AND bidirectional_range<Rng> AND
121 operator()(Rng && rng, Pred pred, Proj proj)
const
123 return {all(
static_cast<Rng &&
>(rng)),
124 compose(std::move(pred), std::move(proj))};
130 template<
typename Pred>
131 constexpr
auto operator()(Pred pred)
const
135 template(
typename Pred,
typename Proj)(
136 requires (!range<Pred>))
137 constexpr
auto operator()(Pred && pred, Proj proj)
const
140 trim_base_fn{},
static_cast<Pred &&
>(pred), std::move(proj)));
147 using trim_base_fn::operator();
148 using trim_bind_fn::operator();
158 #include <range/v3/detail/epilogue.hpp>
159 #include <range/v3/detail/satisfy_boost_range.hpp>
CPP_concept indirect_unary_predicate
\concept indirect_unary_predicate
Definition: concepts.hpp:632
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
typename Fn::template invoke< Args... > invoke
Evaluate the invocable Fn with the arguments Args.
Definition: meta.hpp:541
defer< bind_back, Fn, Ts... > bind_back
Definition: meta.hpp:994
front< Pair > first
Retrieve the first element of the pair Pair.
Definition: meta.hpp:2251
Definition: compose.hpp:33
Definition: interface.hpp:129