/// \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_TOKENIZE_HPP #define RANGES_V3_VIEW_TOKENIZE_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace ranges { /// \addtogroup group-views /// @{ template struct tokenize_view : view_interface, is_finite::value ? finite : range_cardinality::value> { private: CPP_assert(bidirectional_range && view_ && common_range); CPP_assert(semiregular); CPP_assert(semiregular); Rng rng_; Regex rex_; SubMatchRange subs_; std::regex_constants::match_flag_type flags_; template using iterator_t = std::regex_token_iterator>>; public: tokenize_view() = default; tokenize_view(Rng rng, Regex rex, SubMatchRange subs, std::regex_constants::match_flag_type flags) : rng_(std::move(rng)) , rex_(std::move(rex)) , subs_(std::move(subs)) , flags_(flags) {} iterator_t()> begin() { meta::const_if_c(), Rng> & rng = rng_; return {ranges::begin(rng), ranges::end(rng), rex_, subs_, flags_}; } template(bool Const = true)( requires range) iterator_t begin() const { return {ranges::begin(rng_), ranges::end(rng_), rex_, subs_, flags_}; } iterator_t()> end() { return {}; } template(bool Const = true)( requires range) iterator_t end() const { return {}; } Rng base() const { return rng_; } }; #if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17 template(typename Rng, typename Regex, typename SubMatchRange)( requires copy_constructible AND copy_constructible) tokenize_view(Rng &&, Regex, SubMatchRange) ->tokenize_view, Regex, SubMatchRange>; #endif namespace views { struct tokenize_base_fn { template(typename Rng, typename Regex)( requires bidirectional_range AND common_range AND same_as< // range_value_t, // typename detail::decay_t::value_type>) tokenize_view, detail::decay_t, int> // operator()(Rng && rng, Regex && rex, int sub = 0, std::regex_constants::match_flag_type flags = std::regex_constants::match_default) const // { return {all(static_cast(rng)), static_cast(rex), sub, flags}; } template(typename Rng, typename Regex)( requires bidirectional_range AND common_range AND same_as, typename detail::decay_t::value_type>) tokenize_view, detail::decay_t, std::vector> // operator()(Rng && rng, Regex && rex, std::vector subs, std::regex_constants::match_flag_type flags = std::regex_constants::match_default) const // { return {all(static_cast(rng)), static_cast(rex), std::move(subs), flags}; } template(typename Rng, typename Regex)( requires bidirectional_range AND common_range AND same_as, typename detail::decay_t::value_type>) tokenize_view, detail::decay_t, std::initializer_list> // operator()(Rng && rng, Regex && rex, std::initializer_list subs, std::regex_constants::match_flag_type flags = std::regex_constants::match_default) const // { return {all(static_cast(rng)), static_cast(rex), std::move(subs), flags}; } }; struct tokenize_fn : tokenize_base_fn { using tokenize_base_fn::operator(); template constexpr auto operator()(Regex && rex, int sub = 0, std::regex_constants::match_flag_type flags = std::regex_constants::match_default) const { return make_view_closure(bind_back( tokenize_base_fn{}, static_cast(rex), sub, flags)); } template auto operator()(Regex && rex, std::vector subs, std::regex_constants::match_flag_type flags = std::regex_constants::match_default) const { return bind_back(tokenize_base_fn{}, static_cast(rex), std::move(subs), flags); } template constexpr auto operator()(Regex && rex, std::initializer_list subs, std::regex_constants::match_flag_type flags = std::regex_constants::match_default) const { return make_view_closure(bind_back( tokenize_base_fn{}, static_cast(rex), subs, flags)); } }; /// \relates tokenize_fn /// \ingroup group-views RANGES_INLINE_VARIABLE(tokenize_fn, tokenize) } // namespace views /// @} } // namespace ranges #include #include RANGES_SATISFY_BOOST_RANGE(::ranges::tokenize_view) #endif