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