/// \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_ACTION_SPLIT_HPP #define RANGES_V3_ACTION_SPLIT_HPP #include #include #include #include #include #include #include #include #include #include #include #include namespace ranges { /// \addtogroup group-actions /// @{ namespace actions { struct split_fn { template using split_value_t = meta::if_c<(bool)ranges::container, // uncvref_t, std::vector>>; template(typename T)( requires range) constexpr auto operator()(T & t) const { return make_action_closure( bind_back(split_fn{}, detail::reference_wrapper_(t))); } template constexpr auto operator()(T && t) const { return make_action_closure(bind_back(split_fn{}, static_cast(t))); } // BUGBUG something is not right with the actions. It should be possible // to move a container into a split and have elements moved into the result. template(typename Rng)( requires input_range AND indirectly_comparable< iterator_t, range_value_t const *, ranges::equal_to>) std::vector> // operator()(Rng && rng, range_value_t val) const { return views::split(rng, std::move(val)) | to>>(); } template(typename Rng, typename Pattern)( requires input_range AND viewable_range AND forward_range AND indirectly_comparable< iterator_t, iterator_t, ranges::equal_to> AND (forward_range || detail::tiny_range)) // std::vector> operator()(Rng && rng, Pattern && pattern) const { return views::split(rng, static_cast(pattern)) | to>>(); } /// \cond template invoke_result_t // operator()(Rng && rng, detail::reference_wrapper_ r) const { return (*this)(static_cast(rng), r.get()); } /// \endcond }; /// \relates actions::split_fn RANGES_INLINE_VARIABLE(split_fn, split) } // namespace actions /// @} } // namespace ranges #include #endif