Compare commits

...

6 Commits

Author SHA1 Message Date
4c72b78551 merged from trunk
[SVN r49607]
2008-11-06 00:15:47 +00:00
6702b04019 merged from trunk
[SVN r48605]
2008-09-05 04:13:30 +00:00
4e17ef2b40 merged from trunk
[SVN r47983]
2008-08-05 05:39:57 +00:00
f62e23a14c merged from trunk
[SVN r45985]
2008-05-31 19:31:01 +00:00
8ff3ace362 merged from trunk
[SVN r45289]
2008-05-11 18:27:27 +00:00
a232c948bf post-review proto version
[SVN r44061]
2008-04-05 18:00:00 +00:00
29 changed files with 410 additions and 168 deletions

22
CMakeLists.txt Normal file
View File

@ -0,0 +1,22 @@
#----------------------------------------------------------------------------
# This file was automatically generated from the original CMakeLists.txt file
# Add a variable to hold the headers for the library
set (lib_headers
algorithm
)
# Add a library target to the build system
boost_library_project(
algorithm
# SRCDIRS
TESTDIRS minmax/test string/test
HEADERS ${lib_headers}
# DOCDIRS
DESCRIPTION "A library of various algorithms."
MODULARIZED
AUTHORS "Pavol Droba <droba -at- topmail.sk>"
"Herve Bronnimann <hbr -at- poly.edu>"
# MAINTAINERS
)

View File

@ -21,6 +21,7 @@
#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 )
{ {
return detail::is_any_ofF< iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_set(as_literal(Set));
BOOST_STRING_TYPENAME range_value<RangeT>::type>(as_literal(Set)); return detail::is_any_ofF<BOOST_STRING_TYPENAME range_value<RangeT>::type>(lit_set);
} }
//! is_from_range predicate //! is_from_range predicate

View File

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

View File

@ -21,6 +21,11 @@ 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>
@ -61,6 +66,10 @@ 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
@ -71,8 +80,8 @@ namespace boost {
FunctorT Functor) FunctorT Functor)
{ {
return std::transform( return std::transform(
begin(Input), ::boost::begin(Input),
end(Input), ::boost::end(Input),
Output, Output,
Functor); Functor);
} }
@ -84,9 +93,9 @@ namespace boost {
FunctorT Functor) FunctorT Functor)
{ {
std::transform( std::transform(
begin(Input), ::boost::begin(Input),
end(Input), ::boost::end(Input),
begin(Input), ::boost::begin(Input),
Functor); Functor);
} }
@ -97,10 +106,10 @@ namespace boost {
{ {
return SequenceT( return SequenceT(
make_transform_iterator( make_transform_iterator(
begin(Input), ::boost::begin(Input),
Functor), Functor),
make_transform_iterator( make_transform_iterator(
end(Input), ::boost::end(Input),
Functor)); Functor));
} }

View File

@ -15,7 +15,6 @@
#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>
@ -29,7 +28,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>
{ {
@ -39,7 +38,6 @@ 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
@ -56,10 +54,11 @@ namespace boost {
#endif #endif
private: private:
const std::ctype_base::mask m_Type; std::ctype_base::mask m_Type;
const std::locale m_Locale; 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
@ -68,25 +67,181 @@ 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 ) : is_any_ofF( const RangeT& Range ) : m_Size(0)
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
{ {
return m_Set.find(Ch)!=m_Set.end(); const set_value_type* Storage=
(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:
// set cannot operate on const value-type // storage
typedef typename remove_const<CharT>::type set_value_type; // The actual used storage is selected on the type
std::set<set_value_type> m_Set; union
{
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( begin(Input), end(Input), Output ); std::copy( ::boost::begin(Input), ::boost::end(Input), Output );
return Output; return Output;
} }
// Copy the beginning of the sequence // Copy the beginning of the sequence
std::copy( begin(Input), begin(M), Output ); std::copy( ::boost::begin(Input), ::boost::begin(M), Output );
// Format find result // Format find result
// Copy formated result // Copy formated result
std::copy( begin(M.format_result()), end(M.format_result()), Output ); std::copy( ::boost::begin(M.format_result()), ::boost::end(M.format_result()), Output );
// Copy the rest of the sequence // Copy the rest of the sequence
std::copy( M.end(), end(Input), Output ); std::copy( M.end(), ::boost::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, end(Output), begin(Input), M.begin() ); insert( Output, ::boost::end(Output), ::boost::begin(Input), M.begin() );
// Copy formated result // Copy formated result
insert( Output, end(Output), M.format_result() ); insert( Output, ::boost::end(Output), M.format_result() );
// Copy the rest of the sequence // Copy the rest of the sequence
insert( Output, end(Output), M.end(), end(Input) ); insert( Output, ::boost::end(Output), M.end(), ::boost::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=begin(Input); input_iterator_type LastMatch=::boost::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( begin(M.format_result()), end(M.format_result()), Output ); std::copy( ::boost::begin(M.format_result()), ::boost::end(M.format_result()), Output );
// Proceed to the next match // Proceed to the next match
LastMatch=M.end(); LastMatch=M.end();
M=Finder( LastMatch, end(Input) ); M=Finder( LastMatch, ::boost::end(Input) );
} }
// Copy the rest of the sequence // Copy the rest of the sequence
std::copy( LastMatch, end(Input), Output ); std::copy( LastMatch, ::boost::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=begin(Input); input_iterator_type LastMatch=::boost::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, end(Output), LastMatch, M.begin() ); insert( Output, ::boost::end(Output), LastMatch, M.begin() );
// Copy formated result // Copy formated result
insert( Output, end(Output), M.format_result() ); insert( Output, ::boost::end(Output), M.format_result() );
// Proceed to the next match // Proceed to the next match
LastMatch=M.end(); LastMatch=M.end();
M=Finder( LastMatch, end(Input) ); M=Finder( LastMatch, ::boost::end(Input) );
} }
// Copy the rest of the sequence // Copy the rest of the sequence
insert( Output, end(Output), LastMatch, end(Input) ); insert( Output, ::boost::end(Output), LastMatch, ::boost::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=begin(Input); input_iterator_type InsertIt=::boost::begin(Input);
input_iterator_type SearchIt=begin(Input); input_iterator_type SearchIt=::boost::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, end(Input) ); M=Finder( SearchIt, ::boost::end(Input) );
} }
// process the last segment // process the last segment
@ -242,17 +242,17 @@ namespace boost {
Input, Input,
InsertIt, InsertIt,
SearchIt, SearchIt,
end(Input) ); ::boost::end(Input) );
if ( Storage.empty() ) if ( Storage.empty() )
{ {
// Truncate input // Truncate input
erase( Input, InsertIt, end(Input) ); erase( Input, InsertIt, ::boost::end(Input) );
} }
else else
{ {
// Copy remaining data to the end of input // Copy remaining data to the end of input
insert( Input, end(Input), Storage.begin(), Storage.end() ); insert( Input, ::boost::end(Input), Storage.begin(), Storage.end() );
} }
} }

View File

@ -20,6 +20,10 @@ 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,
@ -64,6 +68,9 @@ 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(begin(Search), end(Search)), m_Comp(Comp) {} m_Search(::boost::begin(Search), ::boost::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(begin(Search), end(Search)), m_Comp(Comp) {} m_Search(::boost::begin(Search), ::boost::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( end(M), End ); M=first_finder( ::boost::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(begin(Search), end(Search)), m_Search(::boost::begin(Search), ::boost::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( end(M), End ); M=first_finder( ::boost::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, begin(M) ); M=last_finder( Begin, ::boost::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(begin(Format), end(Format)) {} m_Format(::boost::begin(Format), ::boost::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(begin(Replace), end(Replace)); return RangeT(::boost::begin(Replace), ::boost::end(Replace));
} }
}; };

View File

@ -46,7 +46,7 @@ namespace boost {
StorageT& Storage, StorageT& Storage,
const WhatT& What ) const WhatT& What )
{ {
Storage.insert( Storage.end(), begin(What), end(What) ); Storage.insert( Storage.end(), ::boost::begin(What), ::boost::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, begin(Insert), end(Insert) ); insert( Input, At, ::boost::begin(Insert), ::boost::end(Insert) );
} }
// erase helper ---------------------------------------------------// // erase helper ---------------------------------------------------//
@ -184,11 +184,11 @@ namespace boost {
{ {
if(From!=To) if(From!=To)
{ {
replace( Input, From, To, begin(Insert), end(Insert) ); replace( Input, From, To, ::boost::begin(Insert), ::boost::end(Insert) );
} }
else else
{ {
insert( Input, From, begin(Insert), end(Insert) ); insert( Input, From, ::boost::begin(Insert), ::boost::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(begin(lit_input),end(lit_input)); return Finder(::boost::begin(lit_input),::boost::end(lit_input));
} }
// find_first -----------------------------------------------// // find_first -----------------------------------------------//

View File

@ -76,7 +76,7 @@ namespace boost {
Output, Output,
lit_input, lit_input,
Formatter, Formatter,
Finder( begin(lit_input), end(lit_input) ) ); Finder( ::boost::begin(lit_input), ::boost::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(begin(Input), end(Input))); Finder(::boost::begin(Input), ::boost::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(begin(Input), end(Input))); Finder(::boost::begin(Input), ::boost::end(Input)));
} }
@ -187,7 +187,7 @@ namespace boost {
lit_input, lit_input,
Finder, Finder,
Formatter, Formatter,
Finder(begin(lit_input), end(lit_input))); Finder(::boost::begin(lit_input), ::boost::end(lit_input)));
} }
//! Generic replace all algorithm //! Generic replace all algorithm
@ -216,7 +216,7 @@ namespace boost {
Input, Input,
Finder, Finder,
Formatter, Formatter,
Finder( begin(Input), end(Input) ) ); Finder( ::boost::begin(Input), ::boost::end(Input) ) );
} }
//! Generic replace all algorithm //! Generic replace all algorithm
@ -251,7 +251,7 @@ namespace boost {
Input, Input,
Finder, Finder,
Formatter, Formatter,
Finder(begin(Input), end(Input))); Finder(::boost::begin(Input), ::boost::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 repeatly applies a Finder Defines find iterator classes. Find iterator repeatedly 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,12 +58,6 @@ 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
@ -120,8 +114,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(begin(lit_col), begin(lit_col)); m_Match=make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col));
m_End=end(lit_col); m_End=::boost::end(lit_col);
increment(); increment();
} }
@ -220,12 +214,6 @@ 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
@ -286,9 +274,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(begin(lit_col), begin(lit_col)); m_Match=make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col));
m_Next=begin(lit_col); m_Next=::boost::begin(lit_col);
m_End=end(lit_col); m_End=::boost::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=end(lit_input); input_iterator_type InputEnd=::boost::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(lit_input), InputEnd, Finder ), find_iterator_type( ::boost::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=end(lit_input); input_iterator_type InputEnd=::boost::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(lit_input), InputEnd, Finder ), find_iterator_type( ::boost::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=begin(Input); InputIteratorT itBegin=::boost::begin(Input);
InputIteratorT itEnd=end(Input); InputIteratorT itEnd=::boost::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, end(Result), *itBegin); detail::insert(Result, ::boost::end(Result), *itBegin);
++itBegin; ++itBegin;
} }
for(;itBegin!=itEnd; ++itBegin) for(;itBegin!=itEnd; ++itBegin)
{ {
// Add separator // Add separator
detail::insert(Result, end(Result), as_literal(Separator)); detail::insert(Result, ::boost::end(Result), as_literal(Separator));
// Add element // Add element
detail::insert(Result, end(Result), *itBegin); detail::insert(Result, ::boost::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=begin(Input); InputIteratorT itBegin=::boost::begin(Input);
InputIteratorT itEnd=end(Input); InputIteratorT itEnd=::boost::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, end(Result), *itBegin); detail::insert(Result, ::boost::end(Result), *itBegin);
++itBegin; ++itBegin;
} }
@ -123,9 +123,9 @@ namespace boost {
if(Pred(*itBegin)) if(Pred(*itBegin))
{ {
// Add separator // Add separator
detail::insert(Result, end(Result), as_literal(Separator)); detail::insert(Result, ::boost::end(Result), as_literal(Separator));
// Add element // Add element
detail::insert(Result, end(Result), *itBegin); detail::insert(Result, ::boost::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=end(lit_input); Iterator1T InputEnd=::boost::end(lit_input);
Iterator2T TestEnd=end(lit_test); Iterator2T TestEnd=::boost::end(lit_test);
Iterator1T it=begin(lit_input); Iterator1T it=::boost::begin(lit_input);
Iterator2T pit=begin(lit_test); Iterator2T pit=::boost::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(
begin(lit_input), ::boost::begin(lit_input),
end(lit_input), ::boost::end(lit_input),
begin(lit_test), ::boost::begin(lit_test),
end(lit_test), ::boost::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)(begin(lit_input), end(lit_input))); bool bResult=(first_finder(lit_test,Comp)(::boost::begin(lit_input), ::boost::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=end(lit_input); Iterator1T InputEnd=::boost::end(lit_input);
Iterator2T TestEnd=end(lit_test); Iterator2T TestEnd=::boost::end(lit_test);
Iterator1T it=begin(lit_input); Iterator1T it=::boost::begin(lit_input);
Iterator2T pit=begin(lit_test); Iterator2T pit=::boost::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(
begin(lit_arg1), ::boost::begin(lit_arg1),
end(lit_arg1), ::boost::end(lit_arg1),
begin(lit_arg2), ::boost::begin(lit_arg2),
end(lit_arg2), ::boost::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=end(lit_input); Iterator1T InputEnd=::boost::end(lit_input);
for( Iterator1T It=begin(lit_input); It!=InputEnd; ++It) for( Iterator1T It=::boost::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)(
begin(lit_input), end(lit_input) ); ::boost::begin(lit_input), ::boost::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=begin(Input); InputIteratorT itBegin=::boost::begin(Input);
InputIteratorT itEnd=end(Input); InputIteratorT itEnd=::boost::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(begin(*itBegin), end(*itBegin), Rx, Flags)) ++itBegin; !regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin;
// Add this element // Add this element
if(itBegin!=itEnd) if(itBegin!=itEnd)
{ {
detail::insert(Result, end(Result), *itBegin); detail::insert(Result, ::boost::end(Result), *itBegin);
++itBegin; ++itBegin;
} }
for(;itBegin!=itEnd; ++itBegin) for(;itBegin!=itEnd; ++itBegin)
{ {
if(regex_match(begin(*itBegin), end(*itBegin), Rx, Flags)) if(regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags))
{ {
// Add separator // Add separator
detail::insert(Result, end(Result), as_literal(Separator)); detail::insert(Result, ::boost::end(Result), as_literal(Separator));
// Add element // Add element
detail::insert(Result, end(Result), *itBegin); detail::insert(Result, ::boost::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=begin(Input); InputIteratorT itBegin=::boost::begin(Input);
InputIteratorT itEnd=end(Input); InputIteratorT itEnd=::boost::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(begin(*itBegin), end(*itBegin), Rx, Flags)) ++itBegin; !regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin;
// Add this element // Add this element
if(itBegin!=itEnd) if(itBegin!=itEnd)
{ {
detail::insert(Result, end(Result), *itBegin); detail::insert(Result, ::boost::end(Result), *itBegin);
++itBegin; ++itBegin;
} }
for(;itBegin!=itEnd; ++itBegin) for(;itBegin!=itEnd; ++itBegin)
{ {
if(regex_match(begin(*itBegin), end(*itBegin), Rx, Flags)) if(regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags))
{ {
// Add separator // Add separator
detail::insert(Result, end(Result), as_literal(Separator)); detail::insert(Result, ::boost::end(Result), as_literal(Separator));
// Add element // Add element
detail::insert(Result, end(Result), *itBegin); detail::insert(Result, ::boost::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(
begin(lit_range), ::boost::begin(lit_range),
end(lit_range), ::boost::end(lit_range),
IsSpace ), IsSpace ),
end(lit_range), ::boost::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(
begin(Input), ::boost::begin(Input),
end(Input), ::boost::end(Input),
IsSpace ), IsSpace ),
end(Input)); ::boost::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(
begin(Input), ::boost::begin(Input),
::boost::algorithm::detail::trim_begin( ::boost::algorithm::detail::trim_begin(
begin(Input), ::boost::begin(Input),
end(Input), ::boost::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(
begin(lit_range), ::boost::begin(lit_range),
::boost::algorithm::detail::trim_end( ::boost::algorithm::detail::trim_end(
begin(lit_range), ::boost::begin(lit_range),
end(lit_range), ::boost::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(
begin(Input), ::boost::begin(Input),
::boost::algorithm::detail::trim_end( ::boost::algorithm::detail::trim_end(
begin(Input), ::boost::begin(Input),
end(Input), ::boost::end(Input),
IsSpace) IsSpace)
); );
} }
@ -235,10 +235,10 @@ namespace boost {
{ {
Input.erase( Input.erase(
::boost::algorithm::detail::trim_end( ::boost::algorithm::detail::trim_end(
begin(Input), ::boost::begin(Input),
end(Input), ::boost::end(Input),
IsSpace ), IsSpace ),
end(Input) ::boost::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(
begin(lit_range), ::boost::begin(lit_range),
end(lit_range), ::boost::end(lit_range),
IsSpace); IsSpace);
std::copy( std::copy(
detail::trim_begin( detail::trim_begin(
begin(lit_range), TrimEnd, IsSpace), ::boost::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(
begin(Input), ::boost::begin(Input),
end(Input), ::boost::end(Input),
IsSpace); IsSpace);
return SequenceT( return SequenceT(
detail::trim_begin( detail::trim_begin(
begin(Input), ::boost::begin(Input),
TrimEnd, TrimEnd,
IsSpace), IsSpace),
TrimEnd TrimEnd

View File

@ -56,7 +56,7 @@ be enough. The present library solves both problems.</p>
<tt>minmax</tt> <tt>minmax</tt>
as straightforward extensions of the C++ as straightforward extensions of the C++
standard. As it returns a pair of <tt>const&amp;</tt>, we must use the <a standard. As it returns a pair of <tt>const&amp;</tt>, we must use the <a
href=:../../../../tuple/index.html>Boost.tuple</a> library to construct such href="../../tuple/index.html">Boost.tuple</a> library to construct such
pairs. (Please note: the intent is not to fix the known defaults of pairs. (Please note: the intent is not to fix the known defaults of
<tt>std::min</tt> <tt>std::min</tt>
and <tt>std::max</tt>, but to add one more algorithms that combines both; see the and <tt>std::max</tt>, but to add one more algorithms that combines both; see the

View File

@ -0,0 +1,8 @@
#-------------------------------------------------------------------------
#-- Needed include directories for the tests
boost_test_add_dependent_includes("utility;detail;config;test;mpl;bind;type_traits;static_assert;preprocessor;array;iterator;timer;tuple;range")
#-------------------------------------------------------------------------
boost_test_run(minmax_element_test)
boost_test_run(minmax_test)

1
module.cmake Normal file
View File

@ -0,0 +1 @@
boost_module(algorithm DEPENDS regex concept_check)

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;ForwardIterator&gt; operator()( boost::iterator_range&lt;ForwardIteratorT&gt; operator()(
ForwardIteratorT Begin, ForwardIteratorT Begin,
ForwardIteratorT End ) ForwardIteratorT End )
{ {

View File

@ -114,10 +114,13 @@ public:
result_type operator()( const ReplaceT& Replace ) const result_type operator()( const ReplaceT& Replace ) const
{ {
SeqT r; SeqT r;
r.push_back( repeat_mark<value_type>() ); if(!Replace.empty())
r.push_back( *(Replace.begin()) ); {
r.push_back( value_type( Replace.size() ) ); r.push_back( repeat_mark<value_type>() );
r.push_back( *(Replace.begin()) );
r.push_back( value_type( Replace.size() ) );
}
return r; return r;
} }
}; };
@ -183,14 +186,18 @@ 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

@ -0,0 +1,16 @@
#-------------------------------------------------------------------------
#-- Needed include directories for the tests
boost_test_add_dependent_includes("utility;detail;config;test;mpl;bind;type_traits;static_assert;preprocessor;array;iterator;exception;range;timer")
#-------------------------------------------------------------------------
boost_test_run(trim_test)
boost_test_run(conv_test)
boost_test_run(predicate_test)
boost_test_run(find_test)
boost_test_run(split_test)
boost_test_run(join_test)
boost_test_run(replace_test)
boost_test_run(regex_test DEPENDS boost_regex SHARED)

View File

@ -96,10 +96,29 @@ 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 )\
{\ {\
BOOST_CHECK( all( string(YesInput), Pred ) );\ test_pred(Pred, YesInput, true); \
BOOST_CHECK( !all( string(NoInput), Pred ) );\ test_pred(Pred, NoInput, false); \
} }
void classification_test() void classification_test()
@ -121,6 +140,14 @@ 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,6 +120,7 @@ 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") );