Chris@16: // Boost string_algo library iter_find.hpp header file ---------------------------// Chris@16: Chris@16: // Copyright Pavol Droba 2002-2003. Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/ for updates, documentation, and revision history. Chris@16: Chris@16: #ifndef BOOST_STRING_ITER_FIND_HPP Chris@16: #define BOOST_STRING_ITER_FIND_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: /*! \file Chris@16: Defines generic split algorithms. Split algorithms can be Chris@16: used to divide a sequence into several part according Chris@16: to a given criteria. Result is given as a 'container Chris@16: of containers' where elements are copies or references Chris@16: to extracted parts. Chris@16: Chris@16: There are two algorithms provided. One iterates over matching Chris@16: substrings, the other one over the gaps between these matches. Chris@16: */ Chris@16: Chris@16: namespace boost { Chris@16: namespace algorithm { Chris@16: Chris@16: // iterate find ---------------------------------------------------// Chris@16: Chris@16: //! Iter find algorithm Chris@16: /*! Chris@16: This algorithm executes a given finder in iteration on the input, Chris@16: until the end of input is reached, or no match is found. Chris@16: Iteration is done using built-in find_iterator, so the real Chris@16: searching is performed only when needed. Chris@16: In each iteration new match is found and added to the result. Chris@16: Chris@16: \param Result A 'container container' to contain the result of search. Chris@16: Both outer and inner container must have constructor taking a pair Chris@16: of iterators as an argument. Chris@16: Typical type of the result is Chris@16: \c std::vector> Chris@16: (each element of such a vector will container a range delimiting Chris@16: a match). Chris@16: \param Input A container which will be searched. Chris@16: \param Finder A Finder object used for searching Chris@16: \return A reference to the result Chris@16: Chris@16: \note Prior content of the result will be overwritten. Chris@16: */ Chris@16: template< Chris@16: typename SequenceSequenceT, Chris@16: typename RangeT, Chris@16: typename FinderT > Chris@16: inline SequenceSequenceT& Chris@16: iter_find( Chris@16: SequenceSequenceT& Result, Chris@16: RangeT& Input, Chris@16: FinderT Finder ) Chris@16: { Chris@16: BOOST_CONCEPT_ASSERT(( Chris@16: FinderConcept< Chris@16: FinderT, Chris@16: BOOST_STRING_TYPENAME range_iterator::type> Chris@16: )); Chris@16: Chris@16: iterator_range::type> lit_input(::boost::as_literal(Input)); Chris@16: Chris@16: typedef BOOST_STRING_TYPENAME Chris@16: range_iterator::type input_iterator_type; Chris@16: typedef find_iterator find_iterator_type; Chris@16: typedef detail::copy_iterator_rangeF< Chris@16: BOOST_STRING_TYPENAME Chris@16: range_value::type, Chris@16: input_iterator_type> copy_range_type; Chris@16: Chris@16: input_iterator_type InputEnd=::boost::end(lit_input); Chris@16: Chris@16: typedef transform_iterator Chris@16: transform_iter_type; Chris@16: Chris@16: transform_iter_type itBegin= Chris@16: ::boost::make_transform_iterator( Chris@16: find_iterator_type( ::boost::begin(lit_input), InputEnd, Finder ), Chris@16: copy_range_type()); Chris@16: Chris@16: transform_iter_type itEnd= Chris@16: ::boost::make_transform_iterator( Chris@16: find_iterator_type(), Chris@16: copy_range_type()); Chris@16: Chris@16: SequenceSequenceT Tmp(itBegin, itEnd); Chris@16: Chris@16: Result.swap(Tmp); Chris@16: return Result; Chris@16: } Chris@16: Chris@16: // iterate split ---------------------------------------------------// Chris@16: Chris@16: //! Split find algorithm Chris@16: /*! Chris@16: This algorithm executes a given finder in iteration on the input, Chris@16: until the end of input is reached, or no match is found. Chris@16: Iteration is done using built-in find_iterator, so the real Chris@16: searching is performed only when needed. Chris@16: Each match is used as a separator of segments. These segments are then Chris@16: returned in the result. Chris@16: Chris@16: \param Result A 'container container' to contain the result of search. Chris@16: Both outer and inner container must have constructor taking a pair Chris@16: of iterators as an argument. Chris@16: Typical type of the result is Chris@16: \c std::vector> Chris@16: (each element of such a vector will container a range delimiting Chris@16: a match). Chris@16: \param Input A container which will be searched. Chris@16: \param Finder A finder object used for searching Chris@16: \return A reference to the result Chris@16: Chris@16: \note Prior content of the result will be overwritten. Chris@16: */ Chris@16: template< Chris@16: typename SequenceSequenceT, Chris@16: typename RangeT, Chris@16: typename FinderT > Chris@16: inline SequenceSequenceT& Chris@16: iter_split( Chris@16: SequenceSequenceT& Result, Chris@16: RangeT& Input, Chris@16: FinderT Finder ) Chris@16: { Chris@16: BOOST_CONCEPT_ASSERT(( Chris@16: FinderConcept::type> Chris@16: )); Chris@16: Chris@16: iterator_range::type> lit_input(::boost::as_literal(Input)); Chris@16: Chris@16: typedef BOOST_STRING_TYPENAME Chris@16: range_iterator::type input_iterator_type; Chris@16: typedef split_iterator find_iterator_type; Chris@16: typedef detail::copy_iterator_rangeF< Chris@16: BOOST_STRING_TYPENAME Chris@16: range_value::type, Chris@16: input_iterator_type> copy_range_type; Chris@16: Chris@16: input_iterator_type InputEnd=::boost::end(lit_input); Chris@16: Chris@16: typedef transform_iterator Chris@16: transform_iter_type; Chris@16: Chris@16: transform_iter_type itBegin= Chris@16: ::boost::make_transform_iterator( Chris@16: find_iterator_type( ::boost::begin(lit_input), InputEnd, Finder ), Chris@16: copy_range_type() ); Chris@16: Chris@16: transform_iter_type itEnd= Chris@16: ::boost::make_transform_iterator( Chris@16: find_iterator_type(), Chris@16: copy_range_type() ); Chris@16: Chris@16: SequenceSequenceT Tmp(itBegin, itEnd); Chris@16: Chris@16: Result.swap(Tmp); Chris@16: return Result; Chris@16: } Chris@16: Chris@16: } // namespace algorithm Chris@16: Chris@16: // pull names to the boost namespace Chris@16: using algorithm::iter_find; Chris@16: using algorithm::iter_split; Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: #endif // BOOST_STRING_ITER_FIND_HPP