|
- /// \file
- // Range v3 library
- //
- // Copyright Eric Niebler 2014-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_FOR_EACH_HPP
- #define RANGES_V3_VIEW_FOR_EACH_HPP
-
- #include <utility>
-
- #include <meta/meta.hpp>
-
- #include <range/v3/range_fwd.hpp>
-
- #include <range/v3/functional/bind_back.hpp>
- #include <range/v3/functional/invoke.hpp>
- #include <range/v3/utility/static_const.hpp>
- #include <range/v3/view/all.hpp>
- #include <range/v3/view/generate_n.hpp>
- #include <range/v3/view/join.hpp>
- #include <range/v3/view/repeat_n.hpp>
- #include <range/v3/view/single.hpp>
- #include <range/v3/view/transform.hpp>
- #include <range/v3/view/view.hpp>
-
- namespace ranges
- {
- namespace views
- {
- /// Lazily applies an unary function to each element in the source
- /// range that returns another range (possibly empty), flattening
- /// the result.
- struct for_each_fn
- {
- private:
- friend view_access;
- template<typename Fun>
- static constexpr auto bind(for_each_fn for_each, Fun fun)
- {
- return make_pipeable(bind_back(for_each, std::move(fun)));
- }
-
- public:
- template<typename Rng, typename Fun>
- constexpr auto CPP_fun(operator())(Rng && rng, Fun fun)(
- const requires viewable_range<Rng> && transformable_range<Rng, Fun> &&
- joinable_range<transform_view<all_t<Rng>, Fun>>)
- {
- return join(transform(static_cast<Rng &&>(rng), std::move(fun)));
- }
- };
-
- /// \relates for_each_fn
- /// \ingroup group-views
- RANGES_INLINE_VARIABLE(view<for_each_fn>, for_each)
- } // namespace views
-
- struct yield_fn
- {
- template<typename V>
- auto operator()(V v) const -> CPP_ret(single_view<V>)( //
- requires copy_constructible<V>)
- {
- return views::single(std::move(v));
- }
- };
-
- /// \relates yield_fn
- /// \ingroup group-views
- RANGES_INLINE_VARIABLE(yield_fn, yield)
-
- struct yield_from_fn
- {
- template<typename Rng>
- auto operator()(Rng rng) const -> CPP_ret(Rng)( //
- requires view_<Rng>)
- {
- return rng;
- }
- };
-
- /// \relates yield_from_fn
- /// \ingroup group-views
- RANGES_INLINE_VARIABLE(yield_from_fn, yield_from)
-
- struct yield_if_fn
- {
- template<typename V>
- repeat_n_view<V> operator()(bool b, V v) const
- {
- return views::repeat_n(std::move(v), b ? 1 : 0);
- }
- };
-
- /// \relates yield_if_fn
- /// \ingroup group-views
- RANGES_INLINE_VARIABLE(yield_if_fn, yield_if)
-
- struct lazy_yield_if_fn
- {
- template<typename F>
- auto operator()(bool b, F f) const -> CPP_ret(generate_n_view<F>)( //
- requires invocable<F &>)
- {
- return views::generate_n(std::move(f), b ? 1 : 0);
- }
- };
-
- /// \relates lazy_yield_if_fn
- /// \ingroup group-views
- RANGES_INLINE_VARIABLE(lazy_yield_if_fn, lazy_yield_if)
- /// @}
-
- /// \cond
- CPP_template(typename Rng, typename Fun)( //
- requires viewable_range<Rng> && views::transformable_range<Rng, Fun> &&
- input_range<invoke_result_t<Fun &, range_reference_t<Rng>>>) //
- auto
- operator>>=(Rng && rng, Fun fun)
- {
- return views::for_each(static_cast<Rng &&>(rng), std::move(fun));
- }
- /// \endcond
- } // namespace ranges
-
- #endif
|