/// \file // Range v3 library // // Copyright Eric Niebler 2013-present // // Use, modification and distribution is subject to the // Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Project home: https://github.com/ericniebler/range-v3 // #ifndef RANGES_V3_VIEW_TAKE_WHILE_HPP #define RANGES_V3_VIEW_TAKE_WHILE_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace ranges { /// \addtogroup group-views /// @{ template struct iter_take_while_view : view_adaptor, Rng, is_finite::value ? finite : unknown> { private: friend range_access; RANGES_NO_UNIQUE_ADDRESS semiregular_box_t pred_; template struct sentinel_adaptor : adaptor_base { private: friend struct sentinel_adaptor; using CRng = meta::const_if_c; RANGES_NO_UNIQUE_ADDRESS semiregular_box_ref_or_val_t pred_; public: sentinel_adaptor() = default; sentinel_adaptor(semiregular_box_ref_or_val_t pred) : pred_(std::move(pred)) {} template(bool Other)( requires IsConst AND CPP_NOT(Other)) // sentinel_adaptor(sentinel_adaptor that) : pred_(std::move(that.pred_)) {} bool empty(iterator_t const & it, sentinel_t const & last) const { return it == last || !invoke(pred_, it); } }; sentinel_adaptor end_adaptor() { return {pred_}; } template(bool Const = true)( requires Const AND range> AND invocable>>) sentinel_adaptor end_adaptor() const { return {pred_}; } public: iter_take_while_view() = default; constexpr iter_take_while_view(Rng rng, Pred pred) : iter_take_while_view::view_adaptor{std::move(rng)} , pred_(std::move(pred)) {} }; template struct take_while_view : iter_take_while_view> { take_while_view() = default; constexpr take_while_view(Rng rng, Pred pred) : iter_take_while_view>{std::move(rng), indirect(std::move(pred))} {} }; #if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17 template(typename Rng, typename Fun)( requires copy_constructible) take_while_view(Rng &&, Fun) -> take_while_view, Fun>; #endif namespace views { struct iter_take_while_base_fn { template(typename Rng, typename Pred)( requires viewable_range AND input_range AND predicate> AND copy_constructible) constexpr iter_take_while_view, Pred> // operator()(Rng && rng, Pred pred) const { return {all(static_cast(rng)), std::move(pred)}; } }; struct iter_take_while_fn : iter_take_while_base_fn { using iter_take_while_base_fn::operator(); template constexpr auto operator()(Pred pred) const { return make_view_closure( bind_back(iter_take_while_base_fn{}, std::move(pred))); } }; struct take_while_base_fn { template(typename Rng, typename Pred)( requires viewable_range AND input_range AND indirect_unary_predicate>) constexpr take_while_view, Pred> // operator()(Rng && rng, Pred pred) const { return {all(static_cast(rng)), std::move(pred)}; } template(typename Rng, typename Pred, typename Proj)( requires viewable_range AND input_range AND indirect_unary_predicate &, iterator_t>) constexpr take_while_view, composed> // operator()(Rng && rng, Pred pred, Proj proj) const { return {all(static_cast(rng)), compose(std::move(pred), std::move(proj))}; } }; struct take_while_bind_fn { template constexpr auto operator()(Pred pred) const // TODO: underconstrained { return make_view_closure( bind_back(take_while_base_fn{}, std::move(pred))); } template(typename Pred, typename Proj)( requires (!range)) // TODO: underconstrained constexpr auto operator()(Pred && pred, Proj proj) const { return make_view_closure(bind_back( take_while_base_fn{}, static_cast(pred), std::move(proj))); } }; struct RANGES_EMPTY_BASES take_while_fn : take_while_base_fn, take_while_bind_fn { using take_while_base_fn::operator(); using take_while_bind_fn::operator(); }; /// \relates iter_take_while_fn /// \ingroup group-views RANGES_INLINE_VARIABLE(iter_take_while_fn, iter_take_while) /// \relates take_while_fn /// \ingroup group-views RANGES_INLINE_VARIABLE(take_while_fn, take_while) } // namespace views namespace cpp20 { namespace views { using ranges::views::take_while; } template(typename Rng, typename Pred)( requires viewable_range AND input_range AND predicate> AND copy_constructible) using take_while_view = ranges::take_while_view; } // namespace cpp20 /// @} } // namespace ranges #include #include RANGES_SATISFY_BOOST_RANGE(::ranges::iter_take_while_view) RANGES_SATISFY_BOOST_RANGE(::ranges::take_while_view) #endif