// 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.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 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 container 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 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 |