Horizon
Loading...
Searching...
No Matches
drop_while.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_VIEW_DROP_WHILE_HPP
15#define RANGES_V3_VIEW_DROP_WHILE_HPP
16
17#include <utility>
18
19#include <meta/meta.hpp>
20
22
30#include <range/v3/utility/static_const.hpp>
31#include <range/v3/view/all.hpp>
34
35#include <range/v3/detail/prologue.hpp>
36
37namespace 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)(
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)(
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
144 RANGES_INLINE_VARIABLE(drop_while_fn, drop_while)
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>
163RANGES_SATISFY_BOOST_RANGE(::ranges::drop_while_view)
164
165#endif
The indirect_unary_predicate concept.
The input_range concept.
The range concept.
The viewable_range concept.
decltype(begin(declval(Rng &))) iterator_t
Definition access.hpp:698
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