Compare commits

..

2 Commits

Author SHA1 Message Date
8512c9dd12 Update 'more' links.
[SVN r44996]
2008-05-01 21:34:42 +00:00
d18cfff5fb Create a branch for documentation work.
[SVN r44584]
2008-04-19 14:48:18 +00:00
26 changed files with 169 additions and 364 deletions

View File

@ -21,7 +21,6 @@
#include <boost/algorithm/string/predicate.hpp> #include <boost/algorithm/string/predicate.hpp>
#include <boost/algorithm/string/find.hpp> #include <boost/algorithm/string/find.hpp>
#include <boost/algorithm/string/split.hpp> #include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/join.hpp>
#include <boost/algorithm/string/replace.hpp> #include <boost/algorithm/string/replace.hpp>
#include <boost/algorithm/string/erase.hpp> #include <boost/algorithm/string/erase.hpp>
#include <boost/algorithm/string/classification.hpp> #include <boost/algorithm/string/classification.hpp>

View File

@ -202,8 +202,8 @@ namespace boost {
BOOST_STRING_TYPENAME range_value<RangeT>::type> BOOST_STRING_TYPENAME range_value<RangeT>::type>
is_any_of( const RangeT& Set ) is_any_of( const RangeT& Set )
{ {
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_set(as_literal(Set)); return detail::is_any_ofF<
return detail::is_any_ofF<BOOST_STRING_TYPENAME range_value<RangeT>::type>(lit_set); BOOST_STRING_TYPENAME range_value<RangeT>::type>(as_literal(Set));
} }
//! is_from_range predicate //! is_from_range predicate

View File

@ -65,8 +65,8 @@ namespace boost {
void constraints() void constraints()
{ {
// Operation // Operation
::boost::begin((*pFo)( (*pF)(i,i) )); begin((*pFo)( (*pF)(i,i) ));
::boost::end((*pFo)( (*pF)(i,i) )); end((*pFo)( (*pF)(i,i) ));
} }
private: private:
IteratorT i; IteratorT i;

View File

@ -21,11 +21,6 @@ namespace boost {
// case conversion functors -----------------------------------------------// // case conversion functors -----------------------------------------------//
#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
#pragma warning(push)
#pragma warning(disable:4512) //assignment operator could not be generated
#endif
// a tolower functor // a tolower functor
template<typename CharT> template<typename CharT>
struct to_lowerF : public std::unary_function<CharT, CharT> struct to_lowerF : public std::unary_function<CharT, CharT>
@ -66,10 +61,6 @@ namespace boost {
const std::locale& m_Loc; const std::locale& m_Loc;
}; };
#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
#pragma warning(pop)
#endif
// algorithm implementation ------------------------------------------------------------------------- // algorithm implementation -------------------------------------------------------------------------
// Transform a range // Transform a range
@ -80,8 +71,8 @@ namespace boost {
FunctorT Functor) FunctorT Functor)
{ {
return std::transform( return std::transform(
::boost::begin(Input), begin(Input),
::boost::end(Input), end(Input),
Output, Output,
Functor); Functor);
} }
@ -93,9 +84,9 @@ namespace boost {
FunctorT Functor) FunctorT Functor)
{ {
std::transform( std::transform(
::boost::begin(Input), begin(Input),
::boost::end(Input), end(Input),
::boost::begin(Input), begin(Input),
Functor); Functor);
} }
@ -106,10 +97,10 @@ namespace boost {
{ {
return SequenceT( return SequenceT(
make_transform_iterator( make_transform_iterator(
::boost::begin(Input), begin(Input),
Functor), Functor),
make_transform_iterator( make_transform_iterator(
::boost::end(Input), end(Input),
Functor)); Functor));
} }

View File

@ -15,6 +15,7 @@
#include <algorithm> #include <algorithm>
#include <functional> #include <functional>
#include <locale> #include <locale>
#include <set>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
@ -28,7 +29,7 @@ namespace boost {
// classification functors -----------------------------------------------// // classification functors -----------------------------------------------//
// is_classified functor // is_classified functor
struct is_classifiedF : struct is_classifiedF :
public predicate_facade<is_classifiedF> public predicate_facade<is_classifiedF>
{ {
@ -38,6 +39,7 @@ namespace boost {
// Constructor from a locale // Constructor from a locale
is_classifiedF(std::ctype_base::mask Type, std::locale const & Loc = std::locale()) : is_classifiedF(std::ctype_base::mask Type, std::locale const & Loc = std::locale()) :
m_Type(Type), m_Locale(Loc) {} m_Type(Type), m_Locale(Loc) {}
// Operation // Operation
template<typename CharT> template<typename CharT>
bool operator()( CharT Ch ) const bool operator()( CharT Ch ) const
@ -54,11 +56,10 @@ namespace boost {
#endif #endif
private: private:
std::ctype_base::mask m_Type; const std::ctype_base::mask m_Type;
std::locale m_Locale; const std::locale m_Locale;
}; };
// is_any_of functor // is_any_of functor
/* /*
returns true if the value is from the specified set returns true if the value is from the specified set
@ -67,181 +68,25 @@ namespace boost {
struct is_any_ofF : struct is_any_ofF :
public predicate_facade<is_any_ofF<CharT> > public predicate_facade<is_any_ofF<CharT> >
{ {
private:
// set cannot operate on const value-type
typedef typename ::boost::remove_const<CharT>::type set_value_type;
public:
// Boost.Lambda support // Boost.Lambda support
template <class Args> struct sig { typedef bool type; }; template <class Args> struct sig { typedef bool type; };
// Constructor // Constructor
template<typename RangeT> template<typename RangeT>
is_any_ofF( const RangeT& Range ) : m_Size(0) is_any_ofF( const RangeT& Range ) :
{ m_Set( begin(Range), end(Range) ) {}
// Prepare storage
m_Storage.m_dynSet=0;
std::size_t Size=::boost::distance(Range);
m_Size=Size;
set_value_type* Storage=0;
if(use_fixed_storage(m_Size))
{
// Use fixed storage
Storage=&m_Storage.m_fixSet[0];
}
else
{
// Use dynamic storage
m_Storage.m_dynSet=new set_value_type[m_Size];
Storage=m_Storage.m_dynSet;
}
// Use fixed storage
::std::copy(::boost::begin(Range), ::boost::end(Range), Storage);
::std::sort(Storage, Storage+m_Size);
}
// Copy constructor
is_any_ofF(const is_any_ofF& Other) : m_Size(Other.m_Size)
{
// Prepare storage
m_Storage.m_dynSet=0;
const set_value_type* SrcStorage=0;
set_value_type* DestStorage=0;
if(use_fixed_storage(m_Size))
{
// Use fixed storage
DestStorage=&m_Storage.m_fixSet[0];
SrcStorage=&Other.m_Storage.m_fixSet[0];
}
else
{
// Use dynamic storage
m_Storage.m_dynSet=new set_value_type[m_Size];
DestStorage=m_Storage.m_dynSet;
SrcStorage=Other.m_Storage.m_dynSet;
}
// Use fixed storage
::memcpy(DestStorage, SrcStorage, sizeof(set_value_type)*m_Size);
}
// Destructor
~is_any_ofF()
{
if(!use_fixed_storage(m_Size) && m_Storage.m_dynSet!=0)
{
delete [] m_Storage.m_dynSet;
}
}
// Assignment
is_any_ofF& operator=(const is_any_ofF& Other)
{
// Handle self assignment
if(this==&Other) return *this;
// Prepare storage
const set_value_type* SrcStorage;
set_value_type* DestStorage;
if(use_fixed_storage(Other.m_Size))
{
// Use fixed storage
DestStorage=&m_Storage.m_fixSet[0];
SrcStorage=&Other.m_Storage.m_fixSet[0];
// Delete old storage if was present
if(!use_fixed_storage(m_Size) && m_Storage.m_dynSet!=0)
{
delete [] m_Storage.m_dynSet;
}
// Set new size
m_Size=Other.m_Size;
}
else
{
// Other uses dynamic storage
SrcStorage=Other.m_Storage.m_dynSet;
// Check what kind of storage are we using right now
if(use_fixed_storage(m_Size))
{
// Using fixed storage, allocate new
set_value_type* pTemp=new set_value_type[Other.m_Size];
DestStorage=pTemp;
m_Storage.m_dynSet=pTemp;
m_Size=Other.m_Size;
}
else
{
// Using dynamic storage, check if can reuse
if(m_Storage.m_dynSet!=0 && m_Size>=Other.m_Size && m_Size<Other.m_Size*2)
{
// Reuse the current storage
DestStorage=m_Storage.m_dynSet;
m_Size=Other.m_Size;
}
else
{
// Allocate the new one
set_value_type* pTemp=new set_value_type[Other.m_Size];
DestStorage=pTemp;
// Delete old storage if necessary
if(m_Storage.m_dynSet!=0)
{
delete [] m_Storage.m_dynSet;
}
// Store the new storage
m_Storage.m_dynSet=pTemp;
// Set new size
m_Size=Other.m_Size;
}
}
}
// Copy the data
::memcpy(DestStorage, SrcStorage, sizeof(set_value_type)*m_Size);
return *this;
}
// Operation // Operation
template<typename Char2T> template<typename Char2T>
bool operator()( Char2T Ch ) const bool operator()( Char2T Ch ) const
{ {
const set_value_type* Storage= return m_Set.find(Ch)!=m_Set.end();
(use_fixed_storage(m_Size))
? &m_Storage.m_fixSet[0]
: m_Storage.m_dynSet;
return ::std::binary_search(Storage, Storage+m_Size, Ch);
}
private:
// check if the size is eligible for fixed storage
static bool use_fixed_storage(std::size_t size)
{
return size<=sizeof(set_value_type*)*2;
} }
private: private:
// storage // set cannot operate on const value-type
// The actual used storage is selected on the type typedef typename remove_const<CharT>::type set_value_type;
union std::set<set_value_type> m_Set;
{
set_value_type* m_dynSet;
set_value_type m_fixSet[sizeof(set_value_type*)*2];
}
m_Storage;
// storage size
::std::size_t m_Size;
}; };
// is_from_range functor // is_from_range functor

View File

@ -68,17 +68,17 @@ namespace boost {
if ( !M ) if ( !M )
{ {
// Match not found - return original sequence // Match not found - return original sequence
std::copy( ::boost::begin(Input), ::boost::end(Input), Output ); std::copy( begin(Input), end(Input), Output );
return Output; return Output;
} }
// Copy the beginning of the sequence // Copy the beginning of the sequence
std::copy( ::boost::begin(Input), ::boost::begin(M), Output ); std::copy( begin(Input), begin(M), Output );
// Format find result // Format find result
// Copy formated result // Copy formated result
std::copy( ::boost::begin(M.format_result()), ::boost::end(M.format_result()), Output ); std::copy( begin(M.format_result()), end(M.format_result()), Output );
// Copy the rest of the sequence // Copy the rest of the sequence
std::copy( M.end(), ::boost::end(Input), Output ); std::copy( M.end(), end(Input), Output );
return Output; return Output;
} }
@ -129,11 +129,11 @@ namespace boost {
InputT Output; InputT Output;
// Copy the beginning of the sequence // Copy the beginning of the sequence
insert( Output, ::boost::end(Output), ::boost::begin(Input), M.begin() ); insert( Output, end(Output), begin(Input), M.begin() );
// Copy formated result // Copy formated result
insert( Output, ::boost::end(Output), M.format_result() ); insert( Output, end(Output), M.format_result() );
// Copy the rest of the sequence // Copy the rest of the sequence
insert( Output, ::boost::end(Output), M.end(), ::boost::end(Input) ); insert( Output, end(Output), M.end(), end(Input) );
return Output; return Output;
} }

View File

@ -73,7 +73,7 @@ namespace boost {
store_type M( FindResult, FormatResult, Formatter ); store_type M( FindResult, FormatResult, Formatter );
// Initialize last match // Initialize last match
input_iterator_type LastMatch=::boost::begin(Input); input_iterator_type LastMatch=begin(Input);
// Iterate through all matches // Iterate through all matches
while( M ) while( M )
@ -81,15 +81,15 @@ namespace boost {
// Copy the beginning of the sequence // Copy the beginning of the sequence
std::copy( LastMatch, M.begin(), Output ); std::copy( LastMatch, M.begin(), Output );
// Copy formated result // Copy formated result
std::copy( ::boost::begin(M.format_result()), ::boost::end(M.format_result()), Output ); std::copy( begin(M.format_result()), end(M.format_result()), Output );
// Proceed to the next match // Proceed to the next match
LastMatch=M.end(); LastMatch=M.end();
M=Finder( LastMatch, ::boost::end(Input) ); M=Finder( LastMatch, end(Input) );
} }
// Copy the rest of the sequence // Copy the rest of the sequence
std::copy( LastMatch, ::boost::end(Input), Output ); std::copy( LastMatch, end(Input), Output );
return Output; return Output;
} }
@ -140,7 +140,7 @@ namespace boost {
store_type M( FindResult, FormatResult, Formatter ); store_type M( FindResult, FormatResult, Formatter );
// Initialize last match // Initialize last match
input_iterator_type LastMatch=::boost::begin(Input); input_iterator_type LastMatch=begin(Input);
// Output temporary // Output temporary
InputT Output; InputT Output;
@ -149,17 +149,17 @@ namespace boost {
while( M ) while( M )
{ {
// Copy the beginning of the sequence // Copy the beginning of the sequence
insert( Output, ::boost::end(Output), LastMatch, M.begin() ); insert( Output, end(Output), LastMatch, M.begin() );
// Copy formated result // Copy formated result
insert( Output, ::boost::end(Output), M.format_result() ); insert( Output, end(Output), M.format_result() );
// Proceed to the next match // Proceed to the next match
LastMatch=M.end(); LastMatch=M.end();
M=Finder( LastMatch, ::boost::end(Input) ); M=Finder( LastMatch, end(Input) );
} }
// Copy the rest of the sequence // Copy the rest of the sequence
insert( Output, ::boost::end(Output), LastMatch, ::boost::end(Input) ); insert( Output, end(Output), LastMatch, end(Input) );
return Output; return Output;
} }
@ -213,8 +213,8 @@ namespace boost {
BOOST_STRING_TYPENAME range_value<InputT>::type> Storage; BOOST_STRING_TYPENAME range_value<InputT>::type> Storage;
// Initialize replacement iterators // Initialize replacement iterators
input_iterator_type InsertIt=::boost::begin(Input); input_iterator_type InsertIt=begin(Input);
input_iterator_type SearchIt=::boost::begin(Input); input_iterator_type SearchIt=begin(Input);
while( M ) while( M )
{ {
@ -233,7 +233,7 @@ namespace boost {
copy_to_storage( Storage, M.format_result() ); copy_to_storage( Storage, M.format_result() );
// Find range for a next match // Find range for a next match
M=Finder( SearchIt, ::boost::end(Input) ); M=Finder( SearchIt, end(Input) );
} }
// process the last segment // process the last segment
@ -242,17 +242,17 @@ namespace boost {
Input, Input,
InsertIt, InsertIt,
SearchIt, SearchIt,
::boost::end(Input) ); end(Input) );
if ( Storage.empty() ) if ( Storage.empty() )
{ {
// Truncate input // Truncate input
erase( Input, InsertIt, ::boost::end(Input) ); erase( Input, InsertIt, end(Input) );
} }
else else
{ {
// Copy remaining data to the end of input // Copy remaining data to the end of input
insert( Input, ::boost::end(Input), Storage.begin(), Storage.end() ); insert( Input, end(Input), Storage.begin(), Storage.end() );
} }
} }

View File

@ -20,10 +20,6 @@ namespace boost {
// temporary format and find result storage --------------------------------// // temporary format and find result storage --------------------------------//
#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
#pragma warning(push)
#pragma warning(disable:4512) //assignment operator could not be generated
#endif
template< template<
typename ForwardIteratorT, typename ForwardIteratorT,
typename FormatterT, typename FormatterT,
@ -68,9 +64,6 @@ namespace boost {
const formatter_type& m_Formatter; const formatter_type& m_Formatter;
}; };
#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
#pragma warning(pop)
#endif
} // namespace detail } // namespace detail
} // namespace algorithm } // namespace algorithm
} // namespace boost } // namespace boost

View File

@ -41,7 +41,7 @@ namespace boost {
// Construction // Construction
template< typename SearchT > template< typename SearchT >
first_finderF( const SearchT& Search, PredicateT Comp ) : first_finderF( const SearchT& Search, PredicateT Comp ) :
m_Search(::boost::begin(Search), ::boost::end(Search)), m_Comp(Comp) {} m_Search(begin(Search), end(Search)), m_Comp(Comp) {}
first_finderF( first_finderF(
search_iterator_type SearchBegin, search_iterator_type SearchBegin,
search_iterator_type SearchEnd, search_iterator_type SearchEnd,
@ -108,7 +108,7 @@ namespace boost {
// Construction // Construction
template< typename SearchT > template< typename SearchT >
last_finderF( const SearchT& Search, PredicateT Comp ) : last_finderF( const SearchT& Search, PredicateT Comp ) :
m_Search(::boost::begin(Search), ::boost::end(Search)), m_Comp(Comp) {} m_Search(begin(Search), end(Search)), m_Comp(Comp) {}
last_finderF( last_finderF(
search_iterator_type SearchBegin, search_iterator_type SearchBegin,
search_iterator_type SearchEnd, search_iterator_type SearchEnd,
@ -154,7 +154,7 @@ namespace boost {
while( M ) while( M )
{ {
Last=M; Last=M;
M=first_finder( ::boost::end(M), End ); M=first_finder( end(M), End );
} }
return Last; return Last;
@ -224,7 +224,7 @@ namespace boost {
const SearchT& Search, const SearchT& Search,
int Nth, int Nth,
PredicateT Comp) : PredicateT Comp) :
m_Search(::boost::begin(Search), ::boost::end(Search)), m_Search(begin(Search), end(Search)),
m_Nth(Nth), m_Nth(Nth),
m_Comp(Comp) {} m_Comp(Comp) {}
nth_finderF( nth_finderF(
@ -279,7 +279,7 @@ namespace boost {
for( unsigned int n=0; n<=N; ++n ) for( unsigned int n=0; n<=N; ++n )
{ {
// find next match // find next match
M=first_finder( ::boost::end(M), End ); M=first_finder( end(M), End );
if ( !M ) if ( !M )
{ {
@ -314,7 +314,7 @@ namespace boost {
for( unsigned int n=1; n<=N; ++n ) for( unsigned int n=1; n<=N; ++n )
{ {
// find next match // find next match
M=last_finder( Begin, ::boost::begin(M) ); M=last_finder( Begin, begin(M) );
if ( !M ) if ( !M )
{ {

View File

@ -39,7 +39,7 @@ namespace boost {
public: public:
// Construction // Construction
const_formatF(const RangeT& Format) : const_formatF(const RangeT& Format) :
m_Format(::boost::begin(Format), ::boost::end(Format)) {} m_Format(begin(Format), end(Format)) {}
// Operation // Operation
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
@ -70,7 +70,7 @@ namespace boost {
template< typename Range2T > template< typename Range2T >
const RangeT& operator()(const Range2T& Replace) const const RangeT& operator()(const Range2T& Replace) const
{ {
return RangeT(::boost::begin(Replace), ::boost::end(Replace)); return RangeT(begin(Replace), end(Replace));
} }
}; };

View File

@ -46,7 +46,7 @@ namespace boost {
StorageT& Storage, StorageT& Storage,
const WhatT& What ) const WhatT& What )
{ {
Storage.insert( Storage.end(), ::boost::begin(What), ::boost::end(What) ); Storage.insert( Storage.end(), begin(What), end(What) );
} }

View File

@ -41,7 +41,7 @@ namespace boost {
BOOST_STRING_TYPENAME InputT::iterator At, BOOST_STRING_TYPENAME InputT::iterator At,
const InsertT& Insert ) const InsertT& Insert )
{ {
insert( Input, At, ::boost::begin(Insert), ::boost::end(Insert) ); insert( Input, At, begin(Insert), end(Insert) );
} }
// erase helper ---------------------------------------------------// // erase helper ---------------------------------------------------//
@ -184,11 +184,11 @@ namespace boost {
{ {
if(From!=To) if(From!=To)
{ {
replace( Input, From, To, ::boost::begin(Insert), ::boost::end(Insert) ); replace( Input, From, To, begin(Insert), end(Insert) );
} }
else else
{ {
insert( Input, From, ::boost::begin(Insert), ::boost::end(Insert) ); insert( Input, From, begin(Insert), end(Insert) );
} }
} }

View File

@ -55,7 +55,7 @@ namespace boost {
{ {
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input)); iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input));
return Finder(::boost::begin(lit_input),::boost::end(lit_input)); return Finder(begin(lit_input),end(lit_input));
} }
// find_first -----------------------------------------------// // find_first -----------------------------------------------//

View File

@ -76,7 +76,7 @@ namespace boost {
Output, Output,
lit_input, lit_input,
Formatter, Formatter,
Finder( ::boost::begin(lit_input), ::boost::end(lit_input) ) ); Finder( begin(lit_input), end(lit_input) ) );
} }
//! Generic replace algorithm //! Generic replace algorithm
@ -104,7 +104,7 @@ namespace boost {
return detail::find_format_copy_impl( return detail::find_format_copy_impl(
Input, Input,
Formatter, Formatter,
Finder(::boost::begin(Input), ::boost::end(Input))); Finder(begin(Input), end(Input)));
} }
//! Generic replace algorithm //! Generic replace algorithm
@ -137,7 +137,7 @@ namespace boost {
detail::find_format_impl( detail::find_format_impl(
Input, Input,
Formatter, Formatter,
Finder(::boost::begin(Input), ::boost::end(Input))); Finder(begin(Input), end(Input)));
} }
@ -187,7 +187,7 @@ namespace boost {
lit_input, lit_input,
Finder, Finder,
Formatter, Formatter,
Finder(::boost::begin(lit_input), ::boost::end(lit_input))); Finder(begin(lit_input), end(lit_input)));
} }
//! Generic replace all algorithm //! Generic replace all algorithm
@ -216,7 +216,7 @@ namespace boost {
Input, Input,
Finder, Finder,
Formatter, Formatter,
Finder( ::boost::begin(Input), ::boost::end(Input) ) ); Finder( begin(Input), end(Input) ) );
} }
//! Generic replace all algorithm //! Generic replace all algorithm
@ -251,7 +251,7 @@ namespace boost {
Input, Input,
Finder, Finder,
Formatter, Formatter,
Finder(::boost::begin(Input), ::boost::end(Input))); Finder(begin(Input), end(Input)));
} }

View File

@ -24,7 +24,7 @@
#include <boost/algorithm/string/detail/find_iterator.hpp> #include <boost/algorithm/string/detail/find_iterator.hpp>
/*! \file /*! \file
Defines find iterator classes. Find iterator repeatedly applies a Finder Defines find iterator classes. Find iterator repeatly applies a Finder
to the specified input string to search for matches. Dereferencing to the specified input string to search for matches. Dereferencing
the iterator yields the current match or a range between the last and the current the iterator yields the current match or a range between the last and the current
match depending on the iterator used. match depending on the iterator used.
@ -58,6 +58,12 @@ namespace boost {
// facade support // facade support
friend class ::boost::iterator_core_access; friend class ::boost::iterator_core_access;
// base type
typedef iterator_facade<
find_iterator<IteratorT>,
const iterator_range<IteratorT>,
forward_traversal_tag> facade_type;
private: private:
// typedefs // typedefs
@ -114,8 +120,8 @@ namespace boost {
detail::find_iterator_base<IteratorT>(Finder,0) detail::find_iterator_base<IteratorT>(Finder,0)
{ {
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(as_literal(Col)); iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(as_literal(Col));
m_Match=make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col)); m_Match=make_iterator_range(begin(lit_col), begin(lit_col));
m_End=::boost::end(lit_col); m_End=end(lit_col);
increment(); increment();
} }
@ -214,6 +220,12 @@ namespace boost {
// facade support // facade support
friend class ::boost::iterator_core_access; friend class ::boost::iterator_core_access;
// base type
typedef iterator_facade<
find_iterator<IteratorT>,
iterator_range<IteratorT>,
forward_traversal_tag> facade_type;
private: private:
// typedefs // typedefs
@ -274,9 +286,9 @@ namespace boost {
m_bEof(false) m_bEof(false)
{ {
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(as_literal(Col)); iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(as_literal(Col));
m_Match=make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col)); m_Match=make_iterator_range(begin(lit_col), begin(lit_col));
m_Next=::boost::begin(lit_col); m_Next=begin(lit_col);
m_End=::boost::end(lit_col); m_End=end(lit_col);
increment(); increment();
} }

View File

@ -88,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=::boost::end(lit_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( ::boost::begin(lit_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=
@ -157,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=::boost::end(lit_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( ::boost::begin(lit_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

@ -52,8 +52,8 @@ namespace boost {
typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT; typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT;
// Parse input // Parse input
InputIteratorT itBegin=::boost::begin(Input); InputIteratorT itBegin=begin(Input);
InputIteratorT itEnd=::boost::end(Input); InputIteratorT itEnd=end(Input);
// Construct container to hold the result // Construct container to hold the result
ResultT Result; ResultT Result;
@ -61,16 +61,16 @@ namespace boost {
// Append first element // Append first element
if(itBegin!=itEnd) if(itBegin!=itEnd)
{ {
detail::insert(Result, ::boost::end(Result), *itBegin); detail::insert(Result, end(Result), *itBegin);
++itBegin; ++itBegin;
} }
for(;itBegin!=itEnd; ++itBegin) for(;itBegin!=itEnd; ++itBegin)
{ {
// Add separator // Add separator
detail::insert(Result, ::boost::end(Result), as_literal(Separator)); detail::insert(Result, end(Result), as_literal(Separator));
// Add element // Add element
detail::insert(Result, ::boost::end(Result), *itBegin); detail::insert(Result, end(Result), *itBegin);
} }
return Result; return Result;
@ -103,8 +103,8 @@ namespace boost {
typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT; typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT;
// Parse input // Parse input
InputIteratorT itBegin=::boost::begin(Input); InputIteratorT itBegin=begin(Input);
InputIteratorT itEnd=::boost::end(Input); InputIteratorT itEnd=end(Input);
// Construct container to hold the result // Construct container to hold the result
ResultT Result; ResultT Result;
@ -114,7 +114,7 @@ namespace boost {
// Add this element // Add this element
if(itBegin!=itEnd) if(itBegin!=itEnd)
{ {
detail::insert(Result, ::boost::end(Result), *itBegin); detail::insert(Result, end(Result), *itBegin);
++itBegin; ++itBegin;
} }
@ -123,9 +123,9 @@ namespace boost {
if(Pred(*itBegin)) if(Pred(*itBegin))
{ {
// Add separator // Add separator
detail::insert(Result, ::boost::end(Result), as_literal(Separator)); detail::insert(Result, end(Result), as_literal(Separator));
// Add element // Add element
detail::insert(Result, ::boost::end(Result), *itBegin); detail::insert(Result, end(Result), *itBegin);
} }
} }

View File

@ -67,11 +67,11 @@ namespace boost {
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_const_iterator<Range2T>::type Iterator2T; range_const_iterator<Range2T>::type Iterator2T;
Iterator1T InputEnd=::boost::end(lit_input); Iterator1T InputEnd=end(lit_input);
Iterator2T TestEnd=::boost::end(lit_test); Iterator2T TestEnd=end(lit_test);
Iterator1T it=::boost::begin(lit_input); Iterator1T it=begin(lit_input);
Iterator2T pit=::boost::begin(lit_test); Iterator2T pit=begin(lit_test);
for(; for(;
it!=InputEnd && pit!=TestEnd; it!=InputEnd && pit!=TestEnd;
++it,++pit) ++it,++pit)
@ -151,10 +151,10 @@ namespace boost {
return detail:: return detail::
ends_with_iter_select( ends_with_iter_select(
::boost::begin(lit_input), begin(lit_input),
::boost::end(lit_input), end(lit_input),
::boost::begin(lit_test), begin(lit_test),
::boost::end(lit_test), end(lit_test),
Comp, Comp,
category()); category());
} }
@ -225,7 +225,7 @@ namespace boost {
} }
// Use the temporary variable to make VACPP happy // Use the temporary variable to make VACPP happy
bool bResult=(first_finder(lit_test,Comp)(::boost::begin(lit_input), ::boost::end(lit_input))); bool bResult=(first_finder(lit_test,Comp)(begin(lit_input), end(lit_input)));
return bResult; return bResult;
} }
@ -294,11 +294,11 @@ namespace boost {
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_const_iterator<Range2T>::type Iterator2T; range_const_iterator<Range2T>::type Iterator2T;
Iterator1T InputEnd=::boost::end(lit_input); Iterator1T InputEnd=end(lit_input);
Iterator2T TestEnd=::boost::end(lit_test); Iterator2T TestEnd=end(lit_test);
Iterator1T it=::boost::begin(lit_input); Iterator1T it=begin(lit_input);
Iterator2T pit=::boost::begin(lit_test); Iterator2T pit=begin(lit_test);
for(; for(;
it!=InputEnd && pit!=TestEnd; it!=InputEnd && pit!=TestEnd;
++it,++pit) ++it,++pit)
@ -376,10 +376,10 @@ namespace boost {
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_arg2(as_literal(Arg2)); iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_arg2(as_literal(Arg2));
return std::lexicographical_compare( return std::lexicographical_compare(
::boost::begin(lit_arg1), begin(lit_arg1),
::boost::end(lit_arg1), end(lit_arg1),
::boost::begin(lit_arg2), begin(lit_arg2),
::boost::end(lit_arg2), end(lit_arg2),
Pred); Pred);
} }
@ -444,8 +444,8 @@ namespace boost {
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_const_iterator<RangeT>::type Iterator1T; range_const_iterator<RangeT>::type Iterator1T;
Iterator1T InputEnd=::boost::end(lit_input); Iterator1T InputEnd=end(lit_input);
for( Iterator1T It=::boost::begin(lit_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

@ -63,7 +63,7 @@ namespace boost {
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input)); iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input));
return regex_finder(Rx,Flags)( return regex_finder(Rx,Flags)(
::boost::begin(lit_input), ::boost::end(lit_input) ); begin(lit_input), end(lit_input) );
} }
// replace_regex --------------------------------------------------------------------// // replace_regex --------------------------------------------------------------------//
@ -515,8 +515,8 @@ namespace boost {
typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT; typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT;
// Parse input // Parse input
InputIteratorT itBegin=::boost::begin(Input); InputIteratorT itBegin=begin(Input);
InputIteratorT itEnd=::boost::end(Input); InputIteratorT itEnd=end(Input);
// Construct container to hold the result // Construct container to hold the result
ResultT Result; ResultT Result;
@ -525,23 +525,23 @@ namespace boost {
// Roll to the first element that will be added // Roll to the first element that will be added
while( while(
itBegin!=itEnd && itBegin!=itEnd &&
!regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin; !regex_match(begin(*itBegin), end(*itBegin), Rx, Flags)) ++itBegin;
// Add this element // Add this element
if(itBegin!=itEnd) if(itBegin!=itEnd)
{ {
detail::insert(Result, ::boost::end(Result), *itBegin); detail::insert(Result, end(Result), *itBegin);
++itBegin; ++itBegin;
} }
for(;itBegin!=itEnd; ++itBegin) for(;itBegin!=itEnd; ++itBegin)
{ {
if(regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) if(regex_match(begin(*itBegin), end(*itBegin), Rx, Flags))
{ {
// Add separator // Add separator
detail::insert(Result, ::boost::end(Result), as_literal(Separator)); detail::insert(Result, end(Result), as_literal(Separator));
// Add element // Add element
detail::insert(Result, ::boost::end(Result), *itBegin); detail::insert(Result, end(Result), *itBegin);
} }
} }
@ -583,8 +583,8 @@ namespace boost {
typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT; typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT;
// Parse input // Parse input
InputIteratorT itBegin=::boost::begin(Input); InputIteratorT itBegin=begin(Input);
InputIteratorT itEnd=::boost::end(Input); InputIteratorT itEnd=end(Input);
// Construct container to hold the result // Construct container to hold the result
ResultT Result; ResultT Result;
@ -593,23 +593,23 @@ namespace boost {
// Roll to the first element that will be added // Roll to the first element that will be added
while( while(
itBegin!=itEnd && itBegin!=itEnd &&
!regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin; !regex_match(begin(*itBegin), end(*itBegin), Rx, Flags)) ++itBegin;
// Add this element // Add this element
if(itBegin!=itEnd) if(itBegin!=itEnd)
{ {
detail::insert(Result, ::boost::end(Result), *itBegin); detail::insert(Result, end(Result), *itBegin);
++itBegin; ++itBegin;
} }
for(;itBegin!=itEnd; ++itBegin) for(;itBegin!=itEnd; ++itBegin)
{ {
if(regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) if(regex_match(begin(*itBegin), end(*itBegin), Rx, Flags))
{ {
// Add separator // Add separator
detail::insert(Result, ::boost::end(Result), as_literal(Separator)); detail::insert(Result, end(Result), as_literal(Separator));
// Add element // Add element
detail::insert(Result, ::boost::end(Result), *itBegin); detail::insert(Result, end(Result), *itBegin);
} }
} }

View File

@ -67,10 +67,10 @@ namespace boost {
std::copy( std::copy(
::boost::algorithm::detail::trim_begin( ::boost::algorithm::detail::trim_begin(
::boost::begin(lit_range), begin(lit_range),
::boost::end(lit_range), end(lit_range),
IsSpace ), IsSpace ),
::boost::end(lit_range), end(lit_range),
Output); Output);
return Output; return Output;
@ -85,10 +85,10 @@ namespace boost {
{ {
return SequenceT( return SequenceT(
::boost::algorithm::detail::trim_begin( ::boost::algorithm::detail::trim_begin(
::boost::begin(Input), begin(Input),
::boost::end(Input), end(Input),
IsSpace ), IsSpace ),
::boost::end(Input)); end(Input));
} }
//! Left trim - parametric //! Left trim - parametric
@ -124,10 +124,10 @@ namespace boost {
inline void trim_left_if(SequenceT& Input, PredicateT IsSpace) inline void trim_left_if(SequenceT& Input, PredicateT IsSpace)
{ {
Input.erase( Input.erase(
::boost::begin(Input), begin(Input),
::boost::algorithm::detail::trim_begin( ::boost::algorithm::detail::trim_begin(
::boost::begin(Input), begin(Input),
::boost::end(Input), end(Input),
IsSpace)); IsSpace));
} }
@ -174,10 +174,10 @@ namespace boost {
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(as_literal(Input)); iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(as_literal(Input));
std::copy( std::copy(
::boost::begin(lit_range), begin(lit_range),
::boost::algorithm::detail::trim_end( ::boost::algorithm::detail::trim_end(
::boost::begin(lit_range), begin(lit_range),
::boost::end(lit_range), end(lit_range),
IsSpace ), IsSpace ),
Output ); Output );
@ -192,10 +192,10 @@ namespace boost {
inline SequenceT trim_right_copy_if(const SequenceT& Input, PredicateT IsSpace) inline SequenceT trim_right_copy_if(const SequenceT& Input, PredicateT IsSpace)
{ {
return SequenceT( return SequenceT(
::boost::begin(Input), begin(Input),
::boost::algorithm::detail::trim_end( ::boost::algorithm::detail::trim_end(
::boost::begin(Input), begin(Input),
::boost::end(Input), end(Input),
IsSpace) IsSpace)
); );
} }
@ -235,10 +235,10 @@ namespace boost {
{ {
Input.erase( Input.erase(
::boost::algorithm::detail::trim_end( ::boost::algorithm::detail::trim_end(
::boost::begin(Input), begin(Input),
::boost::end(Input), end(Input),
IsSpace ), IsSpace ),
::boost::end(Input) end(Input)
); );
} }
@ -288,13 +288,13 @@ namespace boost {
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
range_const_iterator<RangeT>::type TrimEnd= range_const_iterator<RangeT>::type TrimEnd=
::boost::algorithm::detail::trim_end( ::boost::algorithm::detail::trim_end(
::boost::begin(lit_range), begin(lit_range),
::boost::end(lit_range), end(lit_range),
IsSpace); IsSpace);
std::copy( std::copy(
detail::trim_begin( detail::trim_begin(
::boost::begin(lit_range), TrimEnd, IsSpace), begin(lit_range), TrimEnd, IsSpace),
TrimEnd, TrimEnd,
Output Output
); );
@ -312,13 +312,13 @@ namespace boost {
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
range_const_iterator<SequenceT>::type TrimEnd= range_const_iterator<SequenceT>::type TrimEnd=
::boost::algorithm::detail::trim_end( ::boost::algorithm::detail::trim_end(
::boost::begin(Input), begin(Input),
::boost::end(Input), end(Input),
IsSpace); IsSpace);
return SequenceT( return SequenceT(
detail::trim_begin( detail::trim_begin(
::boost::begin(Input), begin(Input),
TrimEnd, TrimEnd,
IsSpace), IsSpace),
TrimEnd TrimEnd

View File

@ -102,7 +102,7 @@
struct simple_finder struct simple_finder
{ {
template&lt;typename ForwardIteratorT&gt; template&lt;typename ForwardIteratorT&gt;
boost::iterator_range&lt;ForwardIteratorT&gt; operator()( boost::iterator_range&lt;ForwardIterator&gt; operator()(
ForwardIteratorT Begin, ForwardIteratorT Begin,
ForwardIteratorT End ) ForwardIteratorT End )
{ {

View File

@ -217,7 +217,7 @@
</para> </para>
<para> <para>
For more information about the exception safety topics, follow this For more information about the exception safety topics, follow this
<ulink url="http://www.boost.org/more/generic_exception_safety.html">link</ulink> <ulink url="http://www.boost.org/community/exception_safety.html">link</ulink>
</para> </para>
</section> </section>
</section> </section>

View File

@ -31,7 +31,7 @@
typedef <i>implementation defined </i> foo_type;</code><p >The corresponding external concept is the ExternalFooConcept.</p><p >A type <code>T</code> fullfills the ExternalFooConcept if these typedef <i>implementation defined </i> foo_type;</code><p >The corresponding external concept is the ExternalFooConcept.</p><p >A type <code>T</code> fullfills the ExternalFooConcept if these
free-standing functions and type-generators exists:</p><code>void foo( const T&, int ); <br> free-standing functions and type-generators exists:</p><code>void foo( const T&, int ); <br>
int bar( T& ); <br> int bar( T& ); <br>
foo_type_of< T >::type;</code> <br> <br><hr size="1" ><h3 >Literature</h3><ul ><li > <a href="http://www.boost.org/more/generic_programming.html#type_generator" target="_self" >Type Generators</a> </li><li > <a href="http://www.boost.org/more/generic_programming.html#concept" target="_self" >Concepts</a> </li><li > <a href="http://www.sgi.com/tech/stl/stl_introduction.html" target="_self" >Concepts and SGI STL</a> </li></ul><hr size="1" ><p >&copy; Thorsten Ottosen 2003-2004 (nesotto_AT_cs.auc.dk). foo_type_of< T >::type;</code> <br> <br><hr size="1" ><h3 >Literature</h3><ul ><li > <a href="http://www.boost.org/community/generic_programming.html#type_generator" target="_self" >Type Generators</a> </li><li > <a href="http://www.boost.org/community/generic_programming.html#concept" target="_self" >Concepts</a> </li><li > <a href="http://www.sgi.com/tech/stl/stl_introduction.html" target="_self" >Concepts and SGI STL</a> </li></ul><hr size="1" ><p >&copy; Thorsten Ottosen 2003-2004 (nesotto_AT_cs.auc.dk).
Permission to copy, use, modify, sell and distribute this software is granted provided this copyright notice appears Permission to copy, use, modify, sell and distribute this software is granted provided this copyright notice appears
in all copies. This software is provided "as is" without express or implied warranty, and with no in all copies. This software is provided "as is" without express or implied warranty, and with no
claim as to its suitability for any purpose.</p><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br></body></html> claim as to its suitability for any purpose.</p><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br></body></html>

View File

@ -114,13 +114,10 @@ public:
result_type operator()( const ReplaceT& Replace ) const result_type operator()( const ReplaceT& Replace ) const
{ {
SeqT r; SeqT r;
if(!Replace.empty()) r.push_back( repeat_mark<value_type>() );
{ r.push_back( *(Replace.begin()) );
r.push_back( repeat_mark<value_type>() ); r.push_back( value_type( Replace.size() ) );
r.push_back( *(Replace.begin()) );
r.push_back( value_type( Replace.size() ) );
}
return r; return r;
} }
}; };
@ -186,18 +183,14 @@ public:
template< typename ReplaceT > template< typename ReplaceT >
result_type operator()( const ReplaceT& Replace ) const result_type operator()( const ReplaceT& Replace ) const
{ {
// extract info
typename ReplaceT::const_iterator It=Replace.begin();
value_type Value=*(++It);
value_type Repeat=*(++It);
SeqT r; SeqT r;
for( value_type Index=0; Index<Repeat; Index++ ) r.push_back( Value );
if(!Replace.empty())
{
// extract info
typename ReplaceT::const_iterator It=Replace.begin();
value_type Value=*(++It);
value_type Repeat=*(++It);
for( value_type Index=0; Index<Repeat; Index++ ) r.push_back( Value );
}
return r; return r;
} }

View File

@ -96,29 +96,10 @@ void predicate_test()
} }
template<typename Pred, typename Input>
void test_pred(const Pred& pred, const Input& input, bool bYes)
{
// test assignment operator
Pred pred1=pred;
pred1=pred;
pred1=pred1;
if(bYes)
{
BOOST_CHECK( all( input, pred ) );
BOOST_CHECK( all( input, pred1 ) );
}
else
{
BOOST_CHECK( !all( input, pred ) );
BOOST_CHECK( !all( input, pred1 ) );
}
}
#define TEST_CLASS( Pred, YesInput, NoInput )\ #define TEST_CLASS( Pred, YesInput, NoInput )\
{\ {\
test_pred(Pred, YesInput, true); \ BOOST_CHECK( all( string(YesInput), Pred ) );\
test_pred(Pred, NoInput, false); \ BOOST_CHECK( !all( string(NoInput), Pred ) );\
} }
void classification_test() void classification_test()
@ -140,14 +121,6 @@ void classification_test()
TEST_CLASS( !is_classified(std::ctype_base::space), "...", "..\n\r\t " ); TEST_CLASS( !is_classified(std::ctype_base::space), "...", "..\n\r\t " );
TEST_CLASS( ( !is_any_of("abc") && is_from_range('a','e') ) || is_space(), "d e", "abcde" ); TEST_CLASS( ( !is_any_of("abc") && is_from_range('a','e') ) || is_space(), "d e", "abcde" );
// is_any_of test
// TEST_CLASS( !is_any_of(""), "", "aaa" )
TEST_CLASS( is_any_of("a"), "a", "ab" )
TEST_CLASS( is_any_of("ba"), "ab", "abc" )
TEST_CLASS( is_any_of("cba"), "abc", "abcd" )
TEST_CLASS( is_any_of("hgfedcba"), "abcdefgh", "abcdefghi" )
TEST_CLASS( is_any_of("qponmlkjihgfedcba"), "abcdefghijklmnopq", "zzz" )
} }
#undef TEST_CLASS #undef TEST_CLASS

View File

@ -120,7 +120,6 @@ void replace_all_test()
{ {
// replace all // replace all
TEST_ALGO( replace_all, "1abc3abc2", string("abc") C_ string("YYY"), string("1YYY3YYY2") ); TEST_ALGO( replace_all, "1abc3abc2", string("abc") C_ string("YYY"), string("1YYY3YYY2") );
TEST_ALGO( replace_all, string("1abc3abc2"), "/" C_ "\\", string("1abc3abc2") );
TEST_ALGO( ireplace_all, "1aBc3AbC2", "abC" C_ "YYY", string("1YYY3YYY2") ); TEST_ALGO( ireplace_all, "1aBc3AbC2", "abC" C_ "YYY", string("1YYY3YYY2") );
TEST_ALGO( replace_all, "1abc3abc2", string("abc") C_ string("Z"), string("1Z3Z2") ); TEST_ALGO( replace_all, "1abc3abc2", string("abc") C_ string("Z"), string("1Z3Z2") );
TEST_ALGO( replace_all, "1abc3abc2", string("abc") C_ string("XXXX"), string("1XXXX3XXXX2") ); TEST_ALGO( replace_all, "1abc3abc2", string("abc") C_ string("XXXX"), string("1XXXX3XXXX2") );