adapting to new range interface

[SVN r38125]
This commit is contained in:
Pavol Droba
2007-07-01 22:23:55 +00:00
parent 614cc2ebab
commit b94a3fbfba
15 changed files with 206 additions and 190 deletions

View File

@ -14,9 +14,11 @@
#include <algorithm> #include <algorithm>
#include <locale> #include <locale>
#include <boost/range/value_type.hpp> #include <boost/range/value_type.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/algorithm/string/detail/classification.hpp> #include <boost/algorithm/string/detail/classification.hpp>
#include <boost/algorithm/string/predicate_facade.hpp> #include <boost/algorithm/string/predicate_facade.hpp>
/*! \file /*! \file
Classification predicates are included in the library to give Classification predicates are included in the library to give
some more convenience when using algorithms like \c trim() and \c all(). some more convenience when using algorithms like \c trim() and \c all().
@ -201,7 +203,7 @@ namespace boost {
is_any_of( const RangeT& Set ) is_any_of( const RangeT& Set )
{ {
return detail::is_any_ofF< return detail::is_any_ofF<
BOOST_STRING_TYPENAME range_value<RangeT>::type>(Set); BOOST_STRING_TYPENAME range_value<RangeT>::type>(as_literal(Set));
} }
//! is_from_range predicate //! is_from_range predicate

View File

@ -27,20 +27,17 @@ namespace boost {
template< template<
typename OutputIteratorT, typename OutputIteratorT,
typename InputT, typename InputT,
typename FinderT,
typename FormatterT, typename FormatterT,
typename FindResultT > typename FindResultT >
inline OutputIteratorT find_format_copy_impl( inline OutputIteratorT find_format_copy_impl(
OutputIteratorT Output, OutputIteratorT Output,
const InputT& Input, const InputT& Input,
FinderT Finder,
FormatterT Formatter, FormatterT Formatter,
const FindResultT& FindResult ) const FindResultT& FindResult )
{ {
return find_format_copy_impl2( return find_format_copy_impl2(
Output, Output,
Input, Input,
Finder,
Formatter, Formatter,
FindResult, FindResult,
Formatter(FindResult) ); Formatter(FindResult) );
@ -49,14 +46,12 @@ namespace boost {
template< template<
typename OutputIteratorT, typename OutputIteratorT,
typename InputT, typename InputT,
typename FinderT,
typename FormatterT, typename FormatterT,
typename FindResultT, typename FindResultT,
typename FormatResultT > typename FormatResultT >
inline OutputIteratorT find_format_copy_impl2( inline OutputIteratorT find_format_copy_impl2(
OutputIteratorT Output, OutputIteratorT Output,
const InputT& Input, const InputT& Input,
FinderT Finder,
FormatterT Formatter, FormatterT Formatter,
const FindResultT& FindResult, const FindResultT& FindResult,
const FormatResultT& FormatResult ) const FormatResultT& FormatResult )
@ -92,18 +87,15 @@ namespace boost {
template< template<
typename InputT, typename InputT,
typename FinderT,
typename FormatterT, typename FormatterT,
typename FindResultT > typename FindResultT >
inline InputT find_format_copy_impl( inline InputT find_format_copy_impl(
const InputT& Input, const InputT& Input,
FinderT Finder,
FormatterT Formatter, FormatterT Formatter,
const FindResultT& FindResult) const FindResultT& FindResult)
{ {
return find_format_copy_impl2( return find_format_copy_impl2(
Input, Input,
Finder,
Formatter, Formatter,
FindResult, FindResult,
Formatter(FindResult) ); Formatter(FindResult) );
@ -111,13 +103,11 @@ namespace boost {
template< template<
typename InputT, typename InputT,
typename FinderT,
typename FormatterT, typename FormatterT,
typename FindResultT, typename FindResultT,
typename FormatResultT > typename FormatResultT >
inline InputT find_format_copy_impl2( inline InputT find_format_copy_impl2(
const InputT& Input, const InputT& Input,
FinderT Finder,
FormatterT Formatter, FormatterT Formatter,
const FindResultT& FindResult, const FindResultT& FindResult,
const FormatResultT& FormatResult) const FormatResultT& FormatResult)
@ -152,18 +142,15 @@ namespace boost {
template< template<
typename InputT, typename InputT,
typename FinderT,
typename FormatterT, typename FormatterT,
typename FindResultT > typename FindResultT >
inline void find_format_impl( inline void find_format_impl(
InputT& Input, InputT& Input,
FinderT Finder,
FormatterT Formatter, FormatterT Formatter,
const FindResultT& FindResult) const FindResultT& FindResult)
{ {
find_format_impl2( find_format_impl2(
Input, Input,
Finder,
Formatter, Formatter,
FindResult, FindResult,
Formatter(FindResult) ); Formatter(FindResult) );
@ -171,13 +158,11 @@ namespace boost {
template< template<
typename InputT, typename InputT,
typename FinderT,
typename FormatterT, typename FormatterT,
typename FindResultT, typename FindResultT,
typename FormatResultT > typename FormatResultT >
inline void find_format_impl2( inline void find_format_impl2(
InputT& Input, InputT& Input,
FinderT,
FormatterT Formatter, FormatterT Formatter,
const FindResultT& FindResult, const FindResultT& FindResult,
const FormatResultT& FormatResult) const FormatResultT& FormatResult)

View File

@ -19,6 +19,7 @@
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/empty.hpp> #include <boost/range/empty.hpp>
#include <boost/range/as_literal.hpp>
namespace boost { namespace boost {
namespace algorithm { namespace algorithm {

View File

@ -19,6 +19,7 @@
#include <boost/range/iterator.hpp> #include <boost/range/iterator.hpp>
#include <boost/range/const_iterator.hpp> #include <boost/range/const_iterator.hpp>
#include <boost/range/result_iterator.hpp> #include <boost/range/result_iterator.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/algorithm/string/finder.hpp> #include <boost/algorithm/string/finder.hpp>
#include <boost/algorithm/string/compare.hpp> #include <boost/algorithm/string/compare.hpp>
@ -52,16 +53,18 @@ namespace boost {
BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type>
find( find(
RangeT& Input, RangeT& Input,
FinderT Finder) const FinderT& Finder)
{ {
return Finder(begin(Input),end(Input)); iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input));
return Finder(begin(lit_input),end(lit_input));
} }
// find_first -----------------------------------------------// // find_first -----------------------------------------------//
//! Find first algorithm //! Find first algorithm
/*! /*!
Search for the first occurence of the substring in the input. Search for the first occurrence of the substring in the input.
\param Input A string which will be searched. \param Input A string which will be searched.
\param Search A substring to be searched for. \param Search A substring to be searched for.
@ -80,8 +83,7 @@ namespace boost {
Range1T& Input, Range1T& Input,
const Range2T& Search) const Range2T& Search)
{ {
return first_finder(Search)( return find(Input, first_finder(Search));
begin(Input),end(Input));
} }
//! Find first algorithm ( case insensitive ) //! Find first algorithm ( case insensitive )
@ -108,15 +110,14 @@ namespace boost {
const Range2T& Search, const Range2T& Search,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
return first_finder(Search,is_iequal(Loc))( return find(Input, first_finder(Search,is_iequal(Loc)));
begin(Input),end(Input));
} }
// find_last -----------------------------------------------// // find_last -----------------------------------------------//
//! Find last algorithm //! Find last algorithm
/*! /*!
Search for the last occurence of the substring in the input. Search for the last occurrence of the substring in the input.
\param Input A string which will be searched. \param Input A string which will be searched.
\param Search A substring to be searched for. \param Search A substring to be searched for.
@ -135,8 +136,7 @@ namespace boost {
Range1T& Input, Range1T& Input,
const Range2T& Search) const Range2T& Search)
{ {
return last_finder(Search)( return find(Input, last_finder(Search));
begin(Input),end(Input));
} }
//! Find last algorithm ( case insensitive ) //! Find last algorithm ( case insensitive )
@ -163,15 +163,14 @@ namespace boost {
const Range2T& Search, const Range2T& Search,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
return last_finder(Search, is_iequal(Loc))( return find(Input, last_finder(Search, is_iequal(Loc)));
begin(Input),end(Input));
} }
// find_nth ----------------------------------------------------------------------// // find_nth ----------------------------------------------------------------------//
//! Find n-th algorithm //! Find n-th algorithm
/*! /*!
Search for the n-th (zero-indexed) occurence of the substring in the Search for the n-th (zero-indexed) occurrence of the substring in the
input. input.
\param Input A string which will be searched. \param Input A string which will be searched.
@ -192,8 +191,7 @@ namespace boost {
const Range2T& Search, const Range2T& Search,
int Nth) int Nth)
{ {
return nth_finder(Search,Nth)( return find(Input, nth_finder(Search,Nth));
begin(Input),end(Input));
} }
//! Find n-th algorithm ( case insensitive ). //! Find n-th algorithm ( case insensitive ).
@ -224,8 +222,7 @@ namespace boost {
int Nth, int Nth,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
return nth_finder(Search,Nth,is_iequal(Loc))( return find(Input, nth_finder(Search,Nth,is_iequal(Loc)));
begin(Input),end(Input));
} }
// find_head ----------------------------------------------------------------------// // find_head ----------------------------------------------------------------------//
@ -255,8 +252,7 @@ namespace boost {
RangeT& Input, RangeT& Input,
int N) int N)
{ {
return head_finder(N)( return find(Input, head_finder(N));
begin(Input),end(Input));
} }
// find_tail ----------------------------------------------------------------------// // find_tail ----------------------------------------------------------------------//
@ -287,8 +283,7 @@ namespace boost {
RangeT& Input, RangeT& Input,
int N) int N)
{ {
return tail_finder(N)( return find(Input, tail_finder(N));
begin(Input),end(Input));
} }
// find_token --------------------------------------------------------------------// // find_token --------------------------------------------------------------------//
@ -318,8 +313,7 @@ namespace boost {
PredicateT Pred, PredicateT Pred,
token_compress_mode_type eCompress=token_compress_off) token_compress_mode_type eCompress=token_compress_off)
{ {
return token_finder(Pred, eCompress)( return find(Input, token_finder(Pred, eCompress));
begin(Input),end(Input));
} }
} // namespace algorithm } // namespace algorithm

View File

@ -69,12 +69,13 @@ namespace boost {
FormatterT, FormatterT,
FinderT,BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >(); FinderT,BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >();
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(as_literal(Input));
return detail::find_format_copy_impl( return detail::find_format_copy_impl(
Output, Output,
Input, lit_input,
Finder,
Formatter, Formatter,
Finder( begin(Input), end(Input) ) ); Finder( begin(lit_input), end(lit_input) ) );
} }
//! Generic replace algorithm //! Generic replace algorithm
@ -101,7 +102,6 @@ namespace boost {
return detail::find_format_copy_impl( return detail::find_format_copy_impl(
Input, Input,
Finder,
Formatter, Formatter,
Finder(begin(Input), end(Input))); Finder(begin(Input), end(Input)));
} }
@ -135,7 +135,6 @@ namespace boost {
detail::find_format_impl( detail::find_format_impl(
Input, Input,
Finder,
Formatter, Formatter,
Finder(begin(Input), end(Input))); Finder(begin(Input), end(Input)));
} }
@ -180,12 +179,14 @@ namespace boost {
FormatterT, FormatterT,
FinderT,BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >(); FinderT,BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >();
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(as_literal(Input));
return detail::find_format_all_copy_impl( return detail::find_format_all_copy_impl(
Output, Output,
Input, lit_input,
Finder, Finder,
Formatter, Formatter,
Finder(begin(Input), end(Input))); Finder(begin(lit_input), end(lit_input)));
} }
//! Generic replace all algorithm //! Generic replace all algorithm

View File

@ -19,6 +19,7 @@
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/result_iterator.hpp> #include <boost/range/result_iterator.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/algorithm/string/detail/find_iterator.hpp> #include <boost/algorithm/string/detail/find_iterator.hpp>
@ -116,10 +117,12 @@ namespace boost {
find_iterator( find_iterator(
RangeT& Col, RangeT& Col,
FinderT Finder ) : FinderT Finder ) :
detail::find_iterator_base<IteratorT>(Finder,0), detail::find_iterator_base<IteratorT>(Finder,0)
m_Match(begin(Col),begin(Col)),
m_End(end(Col))
{ {
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(as_literal(Col));
m_Match=make_iterator_range(begin(lit_col), begin(lit_col));
m_End=end(lit_col);
increment(); increment();
} }
@ -188,7 +191,7 @@ namespace boost {
FinderT Finder) FinderT Finder)
{ {
return find_iterator<BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type>( return find_iterator<BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type>(
begin(Collection), end(Collection), Finder); Collection, Finder);
} }
// split iterator -----------------------------------------------// // split iterator -----------------------------------------------//
@ -280,11 +283,13 @@ namespace boost {
RangeT& Col, RangeT& Col,
FinderT Finder ) : FinderT Finder ) :
detail::find_iterator_base<IteratorT>(Finder,0), detail::find_iterator_base<IteratorT>(Finder,0),
m_Match(begin(Col),begin(Col)),
m_Next(begin(Col)),
m_End(end(Col)),
m_bEof(false) m_bEof(false)
{ {
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(as_literal(Col));
m_Match=make_iterator_range(begin(lit_col), begin(lit_col));
m_Next=begin(lit_col);
m_End=end(lit_col);
increment(); increment();
} }
@ -364,7 +369,7 @@ namespace boost {
FinderT Finder) FinderT Finder)
{ {
return split_iterator<BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type>( return split_iterator<BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type>(
begin(Collection), end(Collection), Finder); Collection, Finder);
} }

View File

@ -46,35 +46,35 @@ namespace boost {
\param Comp An element comparison predicate \param Comp An element comparison predicate
\return An instance of the \c first_finder object \return An instance of the \c first_finder object
*/ */
template<typename ContainerT> template<typename RangeT>
inline detail::first_finderF< inline detail::first_finderF<
BOOST_STRING_TYPENAME range_const_iterator<ContainerT>::type, BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type,
is_equal> is_equal>
first_finder( const ContainerT& Search ) first_finder( const RangeT& Search )
{ {
return return
detail::first_finderF< detail::first_finderF<
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
range_const_iterator<ContainerT>::type, range_const_iterator<RangeT>::type,
is_equal>( Search, is_equal() ) ; is_equal>( as_literal(Search), is_equal() ) ;
} }
//! "First" finder //! "First" finder
/*! /*!
\overload \overload
*/ */
template<typename ContainerT,typename PredicateT> template<typename RangeT,typename PredicateT>
inline detail::first_finderF< inline detail::first_finderF<
BOOST_STRING_TYPENAME range_const_iterator<ContainerT>::type, BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type,
PredicateT> PredicateT>
first_finder( first_finder(
const ContainerT& Search, PredicateT Comp ) const RangeT& Search, PredicateT Comp )
{ {
return return
detail::first_finderF< detail::first_finderF<
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
range_const_iterator<ContainerT>::type, range_const_iterator<RangeT>::type,
PredicateT>( Search, Comp ); PredicateT>( as_literal(Search), Comp );
} }
//! "Last" finder //! "Last" finder
@ -87,33 +87,33 @@ namespace boost {
\param Comp An element comparison predicate \param Comp An element comparison predicate
\return An instance of the \c last_finder object \return An instance of the \c last_finder object
*/ */
template<typename ContainerT> template<typename RangeT>
inline detail::last_finderF< inline detail::last_finderF<
BOOST_STRING_TYPENAME range_const_iterator<ContainerT>::type, BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type,
is_equal> is_equal>
last_finder( const ContainerT& Search ) last_finder( const RangeT& Search )
{ {
return return
detail::last_finderF< detail::last_finderF<
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
range_const_iterator<ContainerT>::type, range_const_iterator<RangeT>::type,
is_equal>( Search, is_equal() ); is_equal>( as_literal(Search), is_equal() );
} }
//! "Last" finder //! "Last" finder
/*! /*!
\overload \overload
*/ */
template<typename ContainerT, typename PredicateT> template<typename RangeT, typename PredicateT>
inline detail::last_finderF< inline detail::last_finderF<
BOOST_STRING_TYPENAME range_const_iterator<ContainerT>::type, BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type,
PredicateT> PredicateT>
last_finder( const ContainerT& Search, PredicateT Comp ) last_finder( const RangeT& Search, PredicateT Comp )
{ {
return return
detail::last_finderF< detail::last_finderF<
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
range_const_iterator<ContainerT>::type, range_const_iterator<RangeT>::type,
PredicateT>( Search, Comp ) ; PredicateT>( as_literal(Search), Comp ) ;
} }
//! "Nth" finder //! "Nth" finder
@ -127,38 +127,38 @@ namespace boost {
\param Comp An element comparison predicate \param Comp An element comparison predicate
\return An instance of the \c nth_finder object \return An instance of the \c nth_finder object
*/ */
template<typename ContainerT> template<typename RangeT>
inline detail::nth_finderF< inline detail::nth_finderF<
BOOST_STRING_TYPENAME range_const_iterator<ContainerT>::type, BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type,
is_equal> is_equal>
nth_finder( nth_finder(
const ContainerT& Search, const RangeT& Search,
int Nth) int Nth)
{ {
return return
detail::nth_finderF< detail::nth_finderF<
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
range_const_iterator<ContainerT>::type, range_const_iterator<RangeT>::type,
is_equal>( Search, Nth, is_equal() ) ; is_equal>( as_literal(Search), Nth, is_equal() ) ;
} }
//! "Nth" finder //! "Nth" finder
/*! /*!
\overload \overload
*/ */
template<typename ContainerT, typename PredicateT> template<typename RangeT, typename PredicateT>
inline detail::nth_finderF< inline detail::nth_finderF<
BOOST_STRING_TYPENAME range_const_iterator<ContainerT>::type, BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type,
PredicateT> PredicateT>
nth_finder( nth_finder(
const ContainerT& Search, const RangeT& Search,
int Nth, int Nth,
PredicateT Comp ) PredicateT Comp )
{ {
return return
detail::nth_finderF< detail::nth_finderF<
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
range_const_iterator<ContainerT>::type, range_const_iterator<RangeT>::type,
PredicateT>( Search, Nth, Comp ); PredicateT>( as_literal(Search), Nth, Comp );
} }
//! "Head" finder //! "Head" finder

View File

@ -14,6 +14,7 @@
#include <boost/detail/iterator.hpp> #include <boost/detail/iterator.hpp>
#include <boost/range/value_type.hpp> #include <boost/range/value_type.hpp>
#include <boost/range/iterator_range.hpp> #include <boost/range/iterator_range.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/algorithm/string/detail/formatter.hpp> #include <boost/algorithm/string/detail/formatter.hpp>
@ -42,10 +43,14 @@ namespace boost {
\return An instance of the \c const_formatter object. \return An instance of the \c const_formatter object.
*/ */
template<typename RangeT> template<typename RangeT>
inline detail::const_formatF<RangeT> inline detail::const_formatF<
iterator_range<
BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >
const_formatter(const RangeT& Format) const_formatter(const RangeT& Format)
{ {
return detail::const_formatF<RangeT>(Format); return detail::const_formatF<
iterator_range<
BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >(as_literal(Format));
} }
//! Identity formatter //! Identity formatter
@ -56,10 +61,14 @@ namespace boost {
\return An instance of the \c identity_formatter object. \return An instance of the \c identity_formatter object.
*/ */
template<typename RangeT> template<typename RangeT>
inline detail::identity_formatF<RangeT> inline detail::identity_formatF<
iterator_range<
BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >
identity_formatter() identity_formatter()
{ {
return detail::identity_formatF<RangeT>(); return detail::identity_formatF<
iterator_range<
BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >();
} }
//! Empty formatter //! Empty formatter

View File

@ -21,6 +21,7 @@
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/result_iterator.hpp> #include <boost/range/result_iterator.hpp>
#include <boost/range/value_type.hpp> #include <boost/range/value_type.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/algorithm/string/concept.hpp> #include <boost/algorithm/string/concept.hpp>
#include <boost/algorithm/string/find_iterator.hpp> #include <boost/algorithm/string/find_iterator.hpp>
@ -77,6 +78,8 @@ namespace boost {
FinderConcept<FinderT, FinderConcept<FinderT,
BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> >(); BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> >();
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input));
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_result_iterator<RangeT>::type input_iterator_type; range_result_iterator<RangeT>::type input_iterator_type;
typedef find_iterator<input_iterator_type> find_iterator_type; typedef find_iterator<input_iterator_type> find_iterator_type;
@ -85,14 +88,14 @@ namespace boost {
range_value<SequenceSequenceT>::type, range_value<SequenceSequenceT>::type,
input_iterator_type> copy_range_type; input_iterator_type> copy_range_type;
input_iterator_type InputEnd=end(Input); input_iterator_type InputEnd=end(lit_input);
typedef transform_iterator<copy_range_type, find_iterator_type> typedef transform_iterator<copy_range_type, find_iterator_type>
transform_iter_type; transform_iter_type;
transform_iter_type itBegin= transform_iter_type itBegin=
make_transform_iterator( make_transform_iterator(
find_iterator_type( begin(Input), InputEnd, Finder ), find_iterator_type( begin(lit_input), InputEnd, Finder ),
copy_range_type()); copy_range_type());
transform_iter_type itEnd= transform_iter_type itEnd=
@ -144,6 +147,8 @@ namespace boost {
FinderConcept<FinderT, FinderConcept<FinderT,
BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> >(); BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> >();
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input));
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_result_iterator<RangeT>::type input_iterator_type; range_result_iterator<RangeT>::type input_iterator_type;
typedef split_iterator<input_iterator_type> find_iterator_type; typedef split_iterator<input_iterator_type> find_iterator_type;
@ -152,14 +157,14 @@ namespace boost {
range_value<SequenceSequenceT>::type, range_value<SequenceSequenceT>::type,
input_iterator_type> copy_range_type; input_iterator_type> copy_range_type;
input_iterator_type InputEnd=end(Input); input_iterator_type InputEnd=end(lit_input);
typedef transform_iterator<copy_range_type, find_iterator_type> typedef transform_iterator<copy_range_type, find_iterator_type>
transform_iter_type; transform_iter_type;
transform_iter_type itBegin= transform_iter_type itBegin=
make_transform_iterator( make_transform_iterator(
find_iterator_type( begin(Input), InputEnd, Finder ), find_iterator_type( begin(lit_input), InputEnd, Finder ),
copy_range_type() ); copy_range_type() );
transform_iter_type itEnd= transform_iter_type itEnd=

View File

@ -45,7 +45,7 @@ namespace boost {
inline typename range_value<SequenceSequenceT>::type inline typename range_value<SequenceSequenceT>::type
join( join(
const SequenceSequenceT& Input, const SequenceSequenceT& Input,
Range1T& Separator) const Range1T& Separator)
{ {
// Define working types // Define working types
typedef typename range_value<SequenceSequenceT>::type ResultT; typedef typename range_value<SequenceSequenceT>::type ResultT;
@ -68,7 +68,7 @@ namespace boost {
for(;itBegin!=itEnd; ++itBegin) for(;itBegin!=itEnd; ++itBegin)
{ {
// Add separator // Add separator
detail::insert(Result, end(Result), Separator); detail::insert(Result, end(Result), as_literal(Separator));
// Add element // Add element
detail::insert(Result, end(Result), *itBegin); detail::insert(Result, end(Result), *itBegin);
} }
@ -95,7 +95,7 @@ namespace boost {
inline typename range_value<SequenceSequenceT>::type inline typename range_value<SequenceSequenceT>::type
join_if( join_if(
const SequenceSequenceT& Input, const SequenceSequenceT& Input,
Range1T& Separator, const Range1T& Separator,
PredicateT Pred) PredicateT Pred)
{ {
// Define working types // Define working types
@ -123,7 +123,7 @@ namespace boost {
if(Pred(*itBegin)) if(Pred(*itBegin))
{ {
// Add separator // Add separator
detail::insert(Result, end(Result), Separator); detail::insert(Result, end(Result), as_literal(Separator));
// Add element // Add element
detail::insert(Result, end(Result), *itBegin); detail::insert(Result, end(Result), *itBegin);
} }

View File

@ -16,6 +16,8 @@
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/iterator.hpp> #include <boost/range/iterator.hpp>
#include <boost/range/const_iterator.hpp> #include <boost/range/const_iterator.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/range/iterator_range.hpp>
#include <boost/algorithm/string/compare.hpp> #include <boost/algorithm/string/compare.hpp>
#include <boost/algorithm/string/find.hpp> #include <boost/algorithm/string/find.hpp>
@ -57,16 +59,19 @@ namespace boost {
const Range2T& Test, const Range2T& Test,
PredicateT Comp) PredicateT Comp)
{ {
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(as_literal(Input));
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(as_literal(Test));
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_const_iterator<Range1T>::type Iterator1T; range_const_iterator<Range1T>::type Iterator1T;
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_const_iterator<Range2T>::type Iterator2T; range_const_iterator<Range2T>::type Iterator2T;
Iterator1T InputEnd=end(Input); Iterator1T InputEnd=end(lit_input);
Iterator2T TestEnd=end(Test); Iterator2T TestEnd=end(lit_test);
Iterator1T it=begin(Input); Iterator1T it=begin(lit_input);
Iterator2T pit=begin(Test); Iterator2T pit=begin(lit_test);
for(; for(;
it!=InputEnd && pit!=TestEnd; it!=InputEnd && pit!=TestEnd;
++it,++pit) ++it,++pit)
@ -136,6 +141,9 @@ namespace boost {
const Range2T& Test, const Range2T& Test,
PredicateT Comp) PredicateT Comp)
{ {
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(as_literal(Input));
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(as_literal(Test));
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_const_iterator<Range1T>::type Iterator1T; range_const_iterator<Range1T>::type Iterator1T;
typedef BOOST_STRING_TYPENAME boost::detail:: typedef BOOST_STRING_TYPENAME boost::detail::
@ -143,10 +151,10 @@ namespace boost {
return detail:: return detail::
ends_with_iter_select( ends_with_iter_select(
begin(Input), begin(lit_input),
end(Input), end(lit_input),
begin(Test), begin(lit_test),
end(Test), end(lit_test),
Comp, Comp,
category()); category());
} }
@ -207,14 +215,17 @@ namespace boost {
const Range2T& Test, const Range2T& Test,
PredicateT Comp) PredicateT Comp)
{ {
if (empty(Test)) iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(as_literal(Input));
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(as_literal(Test));
if (empty(lit_test))
{ {
// Empty range is contained always // Empty range is contained always
return true; return true;
} }
// Use the temporary variable to make VACPP happy // Use the temporary variable to make VACPP happy
bool bResult=(first_finder(Test,Comp)(begin(Input), end(Input))); bool bResult=(first_finder(lit_test,Comp)(begin(lit_input), end(lit_input)));
return bResult; return bResult;
} }
@ -275,16 +286,19 @@ namespace boost {
const Range2T& Test, const Range2T& Test,
PredicateT Comp) PredicateT Comp)
{ {
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(as_literal(Input));
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(as_literal(Test));
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_const_iterator<Range1T>::type Iterator1T; range_const_iterator<Range1T>::type Iterator1T;
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_const_iterator<Range2T>::type Iterator2T; range_const_iterator<Range2T>::type Iterator2T;
Iterator1T InputEnd=end(Input); Iterator1T InputEnd=end(lit_input);
Iterator2T TestEnd=end(Test); Iterator2T TestEnd=end(lit_test);
Iterator1T it=begin(Input); Iterator1T it=begin(lit_input);
Iterator2T pit=begin(Test); Iterator2T pit=begin(lit_test);
for(; for(;
it!=InputEnd && pit!=TestEnd; it!=InputEnd && pit!=TestEnd;
++it,++pit) ++it,++pit)
@ -358,11 +372,14 @@ namespace boost {
const Range2T& Arg2, const Range2T& Arg2,
PredicateT Pred) PredicateT Pred)
{ {
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_arg1(as_literal(Arg1));
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_arg2(as_literal(Arg2));
return std::lexicographical_compare( return std::lexicographical_compare(
begin(Arg1), begin(lit_arg1),
end(Arg1), end(lit_arg1),
begin(Arg2), begin(lit_arg2),
end(Arg2), end(lit_arg2),
Pred); Pred);
} }
@ -375,12 +392,7 @@ namespace boost {
const Range1T& Arg1, const Range1T& Arg1,
const Range2T& Arg2) const Range2T& Arg2)
{ {
return std::lexicographical_compare( return lexicographical_compare(Arg1, Arg2, is_less());
begin(Arg1),
end(Arg1),
begin(Arg2),
end(Arg2),
is_less());
} }
//! Lexicographical compare predicate (case-insensitive) //! Lexicographical compare predicate (case-insensitive)
@ -394,6 +406,7 @@ namespace boost {
\param Arg1 First argument \param Arg1 First argument
\param Arg2 Second argument \param Arg2 Second argument
\param Loc A locale used for case insensitive comparison
\return The result of the test \return The result of the test
\note This function provides the strong exception-safety guarantee \note This function provides the strong exception-safety guarantee
@ -401,14 +414,10 @@ namespace boost {
template<typename Range1T, typename Range2T> template<typename Range1T, typename Range2T>
inline bool ilexicographical_compare( inline bool ilexicographical_compare(
const Range1T& Arg1, const Range1T& Arg1,
const Range2T& Arg2) const Range2T& Arg2,
const std::locale& Loc=std::locale())
{ {
return std::lexicographical_compare( return lexicographical_compare(Arg1, Arg2, is_iless(Loc));
begin(Arg1),
end(Arg1),
begin(Arg2),
end(Arg2),
is_iless());
} }
@ -430,11 +439,13 @@ namespace boost {
const RangeT& Input, const RangeT& Input,
PredicateT Pred) PredicateT Pred)
{ {
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(as_literal(Input));
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_const_iterator<RangeT>::type Iterator1T; range_const_iterator<RangeT>::type Iterator1T;
Iterator1T InputEnd=end(Input); Iterator1T InputEnd=end(lit_input);
for( Iterator1T It=begin(Input); It!=InputEnd; ++It) for( Iterator1T It=begin(lit_input); It!=InputEnd; ++It)
{ {
if (!Pred(*It)) if (!Pred(*It))
return false; return false;

View File

@ -18,6 +18,7 @@
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/result_iterator.hpp> #include <boost/range/result_iterator.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/algorithm/string/find_format.hpp> #include <boost/algorithm/string/find_format.hpp>
#include <boost/algorithm/string/regex_find_format.hpp> #include <boost/algorithm/string/regex_find_format.hpp>
@ -59,8 +60,10 @@ namespace boost {
const basic_regex<CharT, RegexTraitsT>& Rx, const basic_regex<CharT, RegexTraitsT>& Rx,
match_flag_type Flags=match_default ) match_flag_type Flags=match_default )
{ {
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input));
return regex_finder(Rx,Flags)( return regex_finder(Rx,Flags)(
begin(Input), end(Input) ); begin(lit_input), end(lit_input) );
} }
// replace_regex --------------------------------------------------------------------// // replace_regex --------------------------------------------------------------------//
@ -503,7 +506,7 @@ namespace boost {
inline typename range_value<SequenceSequenceT>::type inline typename range_value<SequenceSequenceT>::type
join_if( join_if(
const SequenceSequenceT& Input, const SequenceSequenceT& Input,
Range1T& Separator, const Range1T& Separator,
const basic_regex<CharT, RegexTraitsT>& Rx, const basic_regex<CharT, RegexTraitsT>& Rx,
match_flag_type Flags=match_default ) match_flag_type Flags=match_default )
{ {
@ -536,7 +539,7 @@ namespace boost {
if(regex_match(begin(*itBegin), end(*itBegin), Rx, Flags)) if(regex_match(begin(*itBegin), end(*itBegin), Rx, Flags))
{ {
// Add separator // Add separator
detail::insert(Result, end(Result), Separator); detail::insert(Result, end(Result), as_literal(Separator));
// Add element // Add element
detail::insert(Result, end(Result), *itBegin); detail::insert(Result, end(Result), *itBegin);
} }
@ -571,7 +574,7 @@ namespace boost {
inline typename range_value<SequenceSequenceT>::type inline typename range_value<SequenceSequenceT>::type
join_if_regex( join_if_regex(
const SequenceSequenceT& Input, const SequenceSequenceT& Input,
Range1T& Separator, const Range1T& Separator,
const basic_regex<CharT, RegexTraitsT>& Rx, const basic_regex<CharT, RegexTraitsT>& Rx,
match_flag_type Flags=match_default ) match_flag_type Flags=match_default )
{ {
@ -604,7 +607,7 @@ namespace boost {
if(regex_match(begin(*itBegin), end(*itBegin), Rx, Flags)) if(regex_match(begin(*itBegin), end(*itBegin), Rx, Flags))
{ {
// Add separator // Add separator
detail::insert(Result, end(Result), Separator); detail::insert(Result, end(Result), as_literal(Separator));
// Add element // Add element
detail::insert(Result, end(Result), *itBegin); detail::insert(Result, end(Result), *itBegin);
} }