Horizon
drop_while.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_VIEW_DROP_WHILE_HPP
15 #define RANGES_V3_VIEW_DROP_WHILE_HPP
16 
17 #include <utility>
18 
19 #include <meta/meta.hpp>
20 
21 #include <range/v3/range_fwd.hpp>
22 
30 #include <range/v3/utility/static_const.hpp>
31 #include <range/v3/view/all.hpp>
33 #include <range/v3/view/view.hpp>
34 
35 #include <range/v3/detail/prologue.hpp>
36 
37 namespace ranges
38 {
41  template<typename Rng, typename Pred>
43  : view_interface<drop_while_view<Rng, Pred>,
44  is_finite<Rng>::value ? finite : unknown>
45  {
46  private:
47  Rng rng_;
48  RANGES_NO_UNIQUE_ADDRESS semiregular_box_t<Pred> pred_;
49  detail::non_propagating_cache<iterator_t<Rng>> begin_;
50 
51  iterator_t<Rng> get_begin_()
52  {
53  if(!begin_)
54  begin_ = find_if_not(rng_, std::ref(pred_));
55  return *begin_;
56  }
57 
58  public:
59  drop_while_view() = default;
60  drop_while_view(Rng rng, Pred pred)
61  : rng_(std::move(rng))
62  , pred_(std::move(pred))
63  {}
64  iterator_t<Rng> begin()
65  {
66  return get_begin_();
67  }
68  sentinel_t<Rng> end()
69  {
70  return ranges::end(rng_);
71  }
72  Rng base() const
73  {
74  return rng_;
75  }
76  };
77 
78  // unlike take_while_view, drop_while_view is transparently safe because we only
79  // need the predicate to find begin()
80  template<typename Rng, typename Pred>
81  RANGES_INLINE_VAR constexpr bool enable_borrowed_range<drop_while_view<Rng, Pred>> =
82  enable_borrowed_range<Rng>;
83 
84 #if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17
85  template(typename Rng, typename Fun)(
86  requires copy_constructible<Fun>)
87  drop_while_view(Rng &&, Fun)
89 #endif
90 
91  template<typename Rng, typename Pred>
92  RANGES_INLINE_VAR constexpr bool disable_sized_range<drop_while_view<Rng, Pred>> =
93  true;
94 
95  namespace views
96  {
98  {
99  template(typename Rng, typename Pred)(
100  requires viewable_range<Rng> AND input_range<Rng> AND
102  auto operator()(Rng && rng, Pred pred) const
104  {
105  return {all(static_cast<Rng &&>(rng)), std::move(pred)};
106  }
107  template(typename Rng, typename Pred, typename Proj)(
108  requires viewable_range<Rng> AND input_range<Rng> AND
110  auto operator()(Rng && rng, Pred pred, Proj proj) const
112  {
113  return {all(static_cast<Rng &&>(rng)),
114  compose(std::move(pred), std::move(proj))};
115  }
116  };
117 
119  {
120  template<typename Pred>
121  constexpr auto operator()(Pred pred) const // TODO: underconstrained
122  {
123  return make_view_closure(
124  bind_back(drop_while_base_fn{}, std::move(pred)));
125  }
126  template(typename Pred, typename Proj)(
127  requires (!range<Pred>)) // TODO: underconstrained
128  constexpr auto operator()(Pred && pred, Proj proj) const
129  {
130  return make_view_closure(bind_back(
131  drop_while_base_fn{}, static_cast<Pred &&>(pred), std::move(proj)));
132  }
133  };
134 
135  struct RANGES_EMPTY_BASES drop_while_fn
137  {
138  using drop_while_base_fn::operator();
139  using drop_while_bind_fn::operator();
140  };
141 
145  } // namespace views
146 
147  namespace cpp20
148  {
149  namespace views
150  {
151  using ranges::views::drop_while;
152  }
153  template(typename Rng, typename Pred)(
154  requires viewable_range<Rng> AND input_range<Rng> AND
155  indirect_unary_predicate<Pred, iterator_t<Rng>>)
156  using drop_while_view = ranges::drop_while_view<Rng, Pred>;
157  } // namespace cpp20
159 } // namespace ranges
160 
161 #include <range/v3/detail/epilogue.hpp>
162 #include <range/v3/detail/satisfy_boost_range.hpp>
163 RANGES_SATISFY_BOOST_RANGE(::ranges::drop_while_view)
164 
165 #endif
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
defer< bind_back, Fn, Ts... > bind_back
Definition: meta.hpp:994
Tiny meta-programming library.
Definition: compose.hpp:33
Definition: drop_while.hpp:45
Definition: interface.hpp:129
Definition: drop_while.hpp:98
Definition: drop_while.hpp:119
Definition: drop_while.hpp:137