Compare commits

...

70 Commits

Author SHA1 Message Date
0abb237962 Create a branch for inspect fixes.
[SVN r61439]
2010-04-20 21:11:27 +00:00
235c81be61 Fixed various issues in docs (mostly duplicate bookmarks and broken links) found by inspect tool
[SVN r61437]
2010-04-20 18:49:18 +00:00
1eb3d83534 Fix links for string algorithm to range documentation.
[SVN r61351]
2010-04-18 12:17:36 +00:00
8f2b8d4888 rm cmake from trunk. I'm not entirely sure this is necessary to satisfy the inspect script, but I'm not taking any chances, and it is easy to put back
[SVN r56942]
2009-10-17 02:07:38 +00:00
6c0f953c01 GCC compilation errors caused be the recent update fixed
[SVN r55434]
2009-08-06 19:52:08 +00:00
e439792494 Merged ADL protection patch from Neil Groves
[SVN r55424]
2009-08-05 20:01:10 +00:00
236b142308 Copyrights on CMakeLists.txt to keep them from clogging up the inspect
reports.  This is essentially the same commit as r55095 on the release
branch.



[SVN r55159]
2009-07-26 00:49:56 +00:00
9bad789175 Fix operator precedence error in documentation. Fixes #2122
[SVN r53520]
2009-06-01 00:47:03 +00:00
d84f81d841 Fixed most tab and min/max issues from trunk inspection report
[SVN r53141]
2009-05-20 19:19:00 +00:00
ce98e8b87e Qualify minmax with boost:: to avoid ambiguity with std::minmax. Fixes #3023
[SVN r53062]
2009-05-17 00:39:22 +00:00
e8a2596637 Add PDF generation options to fix external links to point to the web site.
Added a few more Boostbook based libs that were missed first time around.
Fixed PDF naming issues.

[SVN r51284]
2009-02-17 10:05:58 +00:00
7b2754b937 Fix copy/paste error in minmax docs. Fixes #2500
[SVN r51045]
2009-02-06 03:45:09 +00:00
784402e5c0 Updating dependency information for modularized libraries.
[SVN r49628]
2008-11-07 17:05:27 +00:00
1188575e7b Updating CMake files to latest trunk. Added dependency information for regression tests and a few new macros for internal use.
[SVN r49627]
2008-11-07 17:02:56 +00:00
bff2a1e112 Continuing merge of CMake build system files into trunk with the encouragement of Doug Gregor
[SVN r49510]
2008-11-01 13:15:41 +00:00
6d5e7b5a04 self assignment problem in is_any_ofF fixed
[SVN r48281]
2008-08-21 14:46:15 +00:00
760af1798b removed static constant FIXED_STORAGE_SIZE from is_any_of to
make the code compile on borland compilers



[SVN r48218]
2008-08-19 14:32:59 +00:00
1f5542b44c predicate test improvements
[SVN r48199]
2008-08-18 18:33:40 +00:00
baf3dd99e2 fox for allocation bug in is_any_ofF
[SVN r48198]
2008-08-18 18:32:51 +00:00
7299b29bf8 fixind the problems in is_any_ofF spotted by gcc
[SVN r46498]
2008-06-18 22:07:32 +00:00
539c170b9d aditional tests added
[SVN r46497]
2008-06-18 21:55:38 +00:00
c81ee948b7 is_any_ofF performance improvements
tabs removed



[SVN r46496]
2008-06-18 21:54:06 +00:00
ba5e4c30c6 fixed the rle example crash
[SVN r46463]
2008-06-17 21:58:58 +00:00
cd26ed816c patch from ticket #1152 applied
[SVN r46461]
2008-06-17 21:21:33 +00:00
4e15767bed simple_finder example fixed
[SVN r46460]
2008-06-17 21:13:25 +00:00
9fa2f90db4 begin() and end() calls made fully qualified
[SVN r46459]
2008-06-17 21:04:00 +00:00
35f317aeac unnecessary typedefs removed
[SVN r46458]
2008-06-17 20:31:41 +00:00
d0a03fdb4e Added missing include. This was already fixed on the 1.34 branch but never merged to the trunk.
[SVN r45857]
2008-05-28 08:32:12 +00:00
346f032be2 Quote href values - our tools don't support unquoted values.
[SVN r45283]
2008-05-11 13:49:20 +00:00
a389d768c4 Fix broken copyright urls. Fixes #1573.
[SVN r43422]
2008-02-27 18:51:14 +00:00
90fca39906 Point links to the pages that used to be in 'more' to the site.
[SVN r43210]
2008-02-10 15:02:17 +00:00
5b24f31486 merging changes from 1.34
[SVN r40698]
2007-11-02 21:00:08 +00:00
b25d6511b3 merging changes from 1.34
[SVN r40697]
2007-11-02 20:55:26 +00:00
1541a554f5 changed range_result_iterator to range_iterator
[SVN r40518]
2007-10-27 22:52:29 +00:00
7a97b3390e Added missing include.
[SVN r39586]
2007-09-28 07:19:29 +00:00
6e5a7497ae Added missing include.
[SVN r39519]
2007-09-25 08:46:31 +00:00
f0b8b60379 Update
[SVN r38522]
2007-08-08 19:24:04 +00:00
66019abb2f Update
[SVN r38521]
2007-08-08 19:23:38 +00:00
8758222006 Remove V1 Jamfiles
[SVN r38516]
2007-08-08 19:02:26 +00:00
4eef56761a find/split iterator tests added
[SVN r38126]
2007-07-01 22:24:29 +00:00
b94a3fbfba adapting to new range interface
[SVN r38125]
2007-07-01 22:23:55 +00:00
614cc2ebab adapting to new range interface
[SVN r38123]
2007-07-01 13:29:56 +00:00
869660ed14 adapted to the new range interface
[SVN r38122]
2007-07-01 13:12:57 +00:00
777f30780e Fix broken build of docs, it was missing a dependency to the doxygen docs.
[SVN r37466]
2007-04-17 17:19:25 +00:00
26aa37733b Fix a few more references to *.boosbook instead of *.xml generated files.
[SVN r37465]
2007-04-17 17:13:35 +00:00
f1e60579c2 documentation typo fixed
[SVN r36843]
2007-01-30 07:59:28 +00:00
389dd3c863 Add copyright, license
[SVN r35905]
2006-11-07 19:11:57 +00:00
f23f61ae9b License added to the xml doc files
[SVN r34895]
2006-08-16 07:17:49 +00:00
608112b112 boost guidelines (mainly from inspect tool: tabs, license reference text, etc.)
[SVN r34752]
2006-07-27 10:27:37 +00:00
b21b54dc4e Applying patch from Nicola Musatti
[SVN r33709]
2006-04-16 09:46:34 +00:00
bd974bb945 - join and lexicographical_compare added to the quickref
- join.hpp added to jambfil


[SVN r33406]
2006-03-20 13:08:13 +00:00
24b55c67f7 added comments about negative indexes in _nth, _tail and _head algorithms
[SVN r33255]
2006-03-07 13:09:36 +00:00
603223fd3d fixed to comparison operator in is_not_grater predicate
[SVN r33236]
2006-03-06 18:05:10 +00:00
131484606f testcases that were offencing vc8.0 fixed
[SVN r33143]
2006-02-27 14:13:27 +00:00
20d22a8fc8 fix the tests to join_it naming
[SVN r33137]
2006-02-27 12:01:08 +00:00
134a106ae9 regex variant of join_if renamed to join_if_regex for compilers that do not support
template ordering.


[SVN r33136]
2006-02-27 11:58:43 +00:00
0bcbe2afc6 fixed the slist include
[SVN r33024]
2006-02-20 14:38:10 +00:00
b7a3fa2c73 Testcase for regex variant of join_if added
[SVN r32919]
2006-02-14 10:11:33 +00:00
a731e950f2 added a regex variant of join_if
[SVN r32918]
2006-02-14 10:10:47 +00:00
66794c89f6 Tests for join algorihtm added
[SVN r32917]
2006-02-14 09:39:03 +00:00
9b62648970 Join algorithm implemented
[SVN r32916]
2006-02-14 09:37:26 +00:00
3766cbbe5c find_head/tail_impl functions reordered to avoid dependancy problems
[SVN r32893]
2006-02-13 13:21:31 +00:00
e2b9172f5d - tabs removed
- find_tail/head_impl functions rearranged to avoid the dependency problem


[SVN r32676]
2006-02-06 18:10:18 +00:00
fa01964a1f tests fo lexicographical_compare added
[SVN r32479]
2006-01-31 15:24:03 +00:00
ff82e5135c - added more character-comparison predicates (is_less, is_not_greater)
- added range version of lexicographical_compare
- Fixed some copyright years


[SVN r32478]
2006-01-31 14:57:15 +00:00
f50dd248cc testcases for negative indexes addes
[SVN r32476]
2006-01-31 12:37:06 +00:00
dd11014682 negative indexes support added to *_nth, *_head and *_tail algorithms
[SVN r32475]
2006-01-31 12:36:32 +00:00
d9ebe5da13 Merged from Version_1_33_1
[SVN r31949]
2005-12-08 03:23:02 +00:00
e2d5feeb06 Link to Alexandrescu's paper
[SVN r31135]
2005-09-27 21:42:58 +00:00
45949a9316 Merged from 1.33.0 release
[SVN r30540]
2005-08-12 13:02:37 +00:00
74 changed files with 2373 additions and 1279 deletions

View File

@ -1,7 +1,7 @@
// (C) Copyright Herve Bronnimann 2004. // (C) Copyright Herve Bronnimann 2004.
// Use, modification and distribution are subject to the //
// Boost Software License, Version 1.0. (See accompanying file // Distributed under the Boost Software License, Version 1.0. (See accompanying
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
/* /*
Revision history: Revision history:

View File

@ -1,7 +1,7 @@
// (C) Copyright Herve Bronnimann 2004. // (C) Copyright Herve Bronnimann 2004.
// Use, modification and distribution are subject to the //
// Boost Software License, Version 1.0. (See accompanying file // Distributed under the Boost Software License, Version 1.0. (See accompanying
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
/* /*
Revision history: Revision history:

View File

@ -1,11 +1,12 @@
// Boost string_algo library string_algo.hpp header file ---------------------------// // Boost string_algo library string_algo.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2004. Use, modification and // Copyright Pavol Droba 2002-2004.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_ALGO_HPP #ifndef BOOST_STRING_ALGO_HPP
#define BOOST_STRING_ALGO_HPP #define BOOST_STRING_ALGO_HPP
@ -20,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

@ -1,11 +1,12 @@
// Boost string_algo library case_conv.hpp header file ---------------------------// // Boost string_algo library case_conv.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_CASE_CONV_HPP #ifndef BOOST_STRING_CASE_CONV_HPP
#define BOOST_STRING_CASE_CONV_HPP #define BOOST_STRING_CASE_CONV_HPP
@ -15,6 +16,7 @@
#include <locale> #include <locale>
#include <boost/iterator/transform_iterator.hpp> #include <boost/iterator/transform_iterator.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/value_type.hpp> #include <boost/range/value_type.hpp>
@ -55,11 +57,10 @@ namespace boost {
const RangeT& Input, const RangeT& Input,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
return std::transform( return ::boost::algorithm::detail::transform_range_copy(
begin(Input), Output,
end(Input), ::boost::as_literal(Input),
Output, ::boost::algorithm::detail::to_lowerF<
::boost::algorithm::detail::to_lowerF<
typename range_value<RangeT>::type >(Loc)); typename range_value<RangeT>::type >(Loc));
} }
@ -72,15 +73,10 @@ namespace boost {
const SequenceT& Input, const SequenceT& Input,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
return SequenceT( return ::boost::algorithm::detail::transform_range_copy<SequenceT>(
make_transform_iterator( Input,
begin(Input), ::boost::algorithm::detail::to_lowerF<
::boost::algorithm::detail::to_lowerF< typename range_value<SequenceT>::type >(Loc));
typename range_value<SequenceT>::type >(Loc)),
make_transform_iterator(
end(Input),
::boost::algorithm::detail::to_lowerF<
typename range_value<SequenceT>::type >(Loc)));
} }
//! Convert to lower case //! Convert to lower case
@ -96,10 +92,8 @@ namespace boost {
WritableRangeT& Input, WritableRangeT& Input,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
std::transform( ::boost::algorithm::detail::transform_range(
begin(Input), ::boost::as_literal(Input),
end(Input),
begin(Input),
::boost::algorithm::detail::to_lowerF< ::boost::algorithm::detail::to_lowerF<
typename range_value<WritableRangeT>::type >(Loc)); typename range_value<WritableRangeT>::type >(Loc));
} }
@ -128,11 +122,10 @@ namespace boost {
const RangeT& Input, const RangeT& Input,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
return std::transform( return ::boost::algorithm::detail::transform_range_copy(
begin(Input), Output,
end(Input), ::boost::as_literal(Input),
Output, ::boost::algorithm::detail::to_upperF<
::boost::algorithm::detail::to_upperF<
typename range_value<RangeT>::type >(Loc)); typename range_value<RangeT>::type >(Loc));
} }
@ -145,16 +138,10 @@ namespace boost {
const SequenceT& Input, const SequenceT& Input,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
return SequenceT( return ::boost::algorithm::detail::transform_range_copy<SequenceT>(
make_transform_iterator( Input,
begin(Input), ::boost::algorithm::detail::to_upperF<
::boost::algorithm::detail::to_upperF< typename range_value<SequenceT>::type >(Loc));
typename range_value<SequenceT>::type >(Loc)),
make_transform_iterator(
end(Input),
::boost::algorithm::detail::to_upperF<
typename range_value<SequenceT>::type >(Loc)));
} }
//! Convert to upper case //! Convert to upper case
@ -170,10 +157,8 @@ namespace boost {
WritableRangeT& Input, WritableRangeT& Input,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
std::transform( ::boost::algorithm::detail::transform_range(
begin(Input), ::boost::as_literal(Input),
end(Input),
begin(Input),
::boost::algorithm::detail::to_upperF< ::boost::algorithm::detail::to_upperF<
typename range_value<WritableRangeT>::type >(Loc)); typename range_value<WritableRangeT>::type >(Loc));
} }

View File

@ -1,11 +1,12 @@
// Boost string_algo library classification.hpp header file ---------------------------// // Boost string_algo library classification.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_CLASSIFICATION_HPP #ifndef BOOST_STRING_CLASSIFICATION_HPP
#define BOOST_STRING_CLASSIFICATION_HPP #define BOOST_STRING_CLASSIFICATION_HPP
@ -13,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().
@ -199,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(boost::as_literal(Set));
BOOST_STRING_TYPENAME range_value<RangeT>::type>(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

@ -1,11 +1,12 @@
// Boost string_algo library compare.hpp header file -------------------------// // Boost string_algo library compare.hpp header file -------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2006.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_COMPARE_HPP #ifndef BOOST_STRING_COMPARE_HPP
#define BOOST_STRING_COMPARE_HPP #define BOOST_STRING_COMPARE_HPP
@ -37,7 +38,7 @@ namespace boost {
Compare two operands for equality Compare two operands for equality
*/ */
template< typename T1, typename T2 > template< typename T1, typename T2 >
bool operator ()( const T1& Arg1, const T2& Arg2 ) const bool operator()( const T1& Arg1, const T2& Arg2 ) const
{ {
return Arg1==Arg2; return Arg1==Arg2;
} }
@ -62,12 +63,12 @@ namespace boost {
Compare two operands. Case is ignored. Compare two operands. Case is ignored.
*/ */
template< typename T1, typename T2 > template< typename T1, typename T2 >
bool operator ()( const T1& Arg1, const T2& Arg2 ) const bool operator()( const T1& Arg1, const T2& Arg2 ) const
{ {
#if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL) #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL)
return std::toupper(Arg1)==std::toupper(Arg2); return std::toupper(Arg1)==std::toupper(Arg2);
#else #else
return std::toupper(Arg1,m_Loc)==std::toupper(Arg2,m_Loc); return std::toupper<T1>(Arg1,m_Loc)==std::toupper<T2>(Arg2,m_Loc);
#endif #endif
} }
@ -75,11 +76,122 @@ namespace boost {
std::locale m_Loc; std::locale m_Loc;
}; };
// is_less functor -----------------------------------------------//
//! is_less functor
/*!
Convenient version of standard std::less. Operation is templated, therefore it is
not required to specify the exact types upon the construction
*/
struct is_less
{
//! Functor operation
/*!
Compare two operands using > operator
*/
template< typename T1, typename T2 >
bool operator()( const T1& Arg1, const T2& Arg2 ) const
{
return Arg1<Arg2;
}
};
//! case insensitive version of is_less
/*!
Case insensitive comparison predicate. Comparison is done using
specified locales.
*/
struct is_iless
{
//! Constructor
/*!
\param Loc locales used for comparison
*/
is_iless( const std::locale& Loc=std::locale() ) :
m_Loc( Loc ) {}
//! Function operator
/*!
Compare two operands. Case is ignored.
*/
template< typename T1, typename T2 >
bool operator()( const T1& Arg1, const T2& Arg2 ) const
{
#if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL)
return std::toupper(Arg1)<std::toupper(Arg2);
#else
return std::toupper<T1>(Arg1,m_Loc)<std::toupper<T2>(Arg2,m_Loc);
#endif
}
private:
std::locale m_Loc;
};
// is_not_greater functor -----------------------------------------------//
//! is_not_greater functor
/*!
Convenient version of standard std::not_greater_to. Operation is templated, therefore it is
not required to specify the exact types upon the construction
*/
struct is_not_greater
{
//! Functor operation
/*!
Compare two operands using > operator
*/
template< typename T1, typename T2 >
bool operator()( const T1& Arg1, const T2& Arg2 ) const
{
return Arg1<=Arg2;
}
};
//! case insensitive version of is_not_greater
/*!
Case insensitive comparison predicate. Comparison is done using
specified locales.
*/
struct is_not_igreater
{
//! Constructor
/*!
\param Loc locales used for comparison
*/
is_not_igreater( const std::locale& Loc=std::locale() ) :
m_Loc( Loc ) {}
//! Function operator
/*!
Compare two operands. Case is ignored.
*/
template< typename T1, typename T2 >
bool operator()( const T1& Arg1, const T2& Arg2 ) const
{
#if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL)
return std::toupper(Arg1)<=std::toupper(Arg2);
#else
return std::toupper<T1>(Arg1,m_Loc)<=std::toupper<T2>(Arg2,m_Loc);
#endif
}
private:
std::locale m_Loc;
};
} // namespace algorithm } // namespace algorithm
// pull names to the boost namespace // pull names to the boost namespace
using algorithm::is_equal; using algorithm::is_equal;
using algorithm::is_iequal; using algorithm::is_iequal;
using algorithm::is_less;
using algorithm::is_iless;
using algorithm::is_not_greater;
using algorithm::is_not_igreater;
} // namespace boost } // namespace boost

View File

@ -1,11 +1,12 @@
// Boost string_algo library concept.hpp header file ---------------------------// // Boost string_algo library concept.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_CONCEPT_HPP #ifndef BOOST_STRING_CONCEPT_HPP
#define BOOST_STRING_CONCEPT_HPP #define BOOST_STRING_CONCEPT_HPP
@ -64,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

@ -1,11 +1,12 @@
// Boost string_algo library config.hpp header file ---------------------------// // Boost string_algo library config.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_CONFIG_HPP #ifndef BOOST_STRING_CONFIG_HPP
#define BOOST_STRING_CONFIG_HPP #define BOOST_STRING_CONFIG_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library constants.hpp header file ---------------------------// // Boost string_algo library constants.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_CONSTANTS_HPP #ifndef BOOST_STRING_CONSTANTS_HPP
#define BOOST_STRING_CONSTANTS_HPP #define BOOST_STRING_CONSTANTS_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library string_funct.hpp header file ---------------------------// // Boost string_algo library string_funct.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_CASE_CONV_DETAIL_HPP #ifndef BOOST_STRING_CASE_CONV_DETAIL_HPP
#define BOOST_STRING_CASE_CONV_DETAIL_HPP #define BOOST_STRING_CASE_CONV_DETAIL_HPP
@ -20,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>
@ -33,7 +39,7 @@ namespace boost {
#if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL) #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL)
return std::tolower( Ch); return std::tolower( Ch);
#else #else
return std::tolower( Ch, m_Loc ); return std::tolower<CharT>( Ch, m_Loc );
#endif #endif
} }
private: private:
@ -53,13 +59,60 @@ namespace boost {
#if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL) #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL)
return std::toupper( Ch); return std::toupper( Ch);
#else #else
return std::toupper( Ch, m_Loc ); return std::toupper<CharT>( Ch, m_Loc );
#endif #endif
} }
private: private:
const std::locale& m_Loc; const std::locale& m_Loc;
}; };
#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
#pragma warning(pop)
#endif
// algorithm implementation -------------------------------------------------------------------------
// Transform a range
template<typename OutputIteratorT, typename RangeT, typename FunctorT>
OutputIteratorT transform_range_copy(
OutputIteratorT Output,
const RangeT& Input,
FunctorT Functor)
{
return std::transform(
::boost::begin(Input),
::boost::end(Input),
Output,
Functor);
}
// Transform a range (in-place)
template<typename RangeT, typename FunctorT>
void transform_range(
const RangeT& Input,
FunctorT Functor)
{
std::transform(
::boost::begin(Input),
::boost::end(Input),
::boost::begin(Input),
Functor);
}
template<typename SequenceT, typename RangeT, typename FunctorT>
inline SequenceT transform_range_copy(
const RangeT& Input,
FunctorT Functor)
{
return SequenceT(
::boost::make_transform_iterator(
::boost::begin(Input),
Functor),
::boost::make_transform_iterator(
::boost::end(Input),
Functor));
}
} // namespace detail } // namespace detail
} // namespace algorithm } // namespace algorithm
} // namespace boost } // namespace boost

View File

@ -1,11 +1,12 @@
// Boost string_algo library classification.hpp header file ---------------------------// // Boost string_algo library classification.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_CLASSIFICATION_DETAIL_HPP #ifndef BOOST_STRING_CLASSIFICATION_DETAIL_HPP
#define BOOST_STRING_CLASSIFICATION_DETAIL_HPP #define BOOST_STRING_CLASSIFICATION_DETAIL_HPP
@ -14,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>
@ -28,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>
{ {
@ -38,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
@ -46,7 +45,7 @@ namespace boost {
return std::use_facet< std::ctype<CharT> >(m_Locale).is( m_Type, Ch ); return std::use_facet< std::ctype<CharT> >(m_Locale).is( m_Type, Ch );
} }
#if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL) #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x582) && !defined(_USE_OLD_RW_STL)
template<> template<>
bool operator()( char const Ch ) const bool operator()( char const Ch ) const
{ {
@ -55,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
@ -67,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

@ -1,11 +1,12 @@
// Boost string_algo library find_format.hpp header file ---------------------------// // Boost string_algo library find_format.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_FIND_FORMAT_DETAIL_HPP #ifndef BOOST_STRING_FIND_FORMAT_DETAIL_HPP
#define BOOST_STRING_FIND_FORMAT_DETAIL_HPP #define BOOST_STRING_FIND_FORMAT_DETAIL_HPP
@ -23,39 +24,15 @@ namespace boost {
// find_format_copy (iterator variant) implementation -------------------------------// // find_format_copy (iterator variant) implementation -------------------------------//
template< template<
typename OutputIteratorT, typename OutputIteratorT,
typename InputT, typename InputT,
typename FinderT,
typename FormatterT,
typename FindResultT >
inline OutputIteratorT find_format_copy_impl(
OutputIteratorT Output,
const InputT& Input,
FinderT Finder,
FormatterT Formatter,
const FindResultT& FindResult )
{
return find_format_copy_impl2(
Output,
Input,
Finder,
Formatter,
FindResult,
Formatter(FindResult) );
}
template<
typename OutputIteratorT,
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 )
@ -72,51 +49,50 @@ 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;
} }
// find_format_copy implementation --------------------------------------------------//
template< template<
typename InputT, typename OutputIteratorT,
typename FinderT, typename InputT,
typename FormatterT, typename FormatterT,
typename FindResultT > typename FindResultT >
inline InputT find_format_copy_impl( inline OutputIteratorT find_format_copy_impl(
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 ::boost::algorithm::detail::find_format_copy_impl2(
Output,
Input, Input,
Finder,
Formatter, Formatter,
FindResult, FindResult,
Formatter(FindResult) ); Formatter(FindResult) );
} }
template<
// find_format_copy implementation --------------------------------------------------//
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)
@ -138,45 +114,40 @@ 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;
} }
// replace implementation ----------------------------------------------------// template<
typename InputT,
template<
typename InputT,
typename FinderT,
typename FormatterT, typename FormatterT,
typename FindResultT > typename FindResultT >
inline void find_format_impl( inline InputT find_format_copy_impl(
InputT& Input, const InputT& Input,
FinderT Finder,
FormatterT Formatter, FormatterT Formatter,
const FindResultT& FindResult) const FindResultT& FindResult)
{ {
find_format_impl2( return ::boost::algorithm::detail::find_format_copy_impl2(
Input, Input,
Finder,
Formatter, Formatter,
FindResult, FindResult,
Formatter(FindResult) ); Formatter(FindResult) );
} }
// replace implementation ----------------------------------------------------//
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)
@ -197,7 +168,23 @@ namespace boost {
} }
// Replace match // Replace match
replace( Input, M.begin(), M.end(), M.format_result() ); ::boost::algorithm::detail::replace( Input, M.begin(), M.end(), M.format_result() );
}
template<
typename InputT,
typename FormatterT,
typename FindResultT >
inline void find_format_impl(
InputT& Input,
FormatterT Formatter,
const FindResultT& FindResult)
{
::boost::algorithm::detail::find_format_impl2(
Input,
Formatter,
FindResult,
Formatter(FindResult) );
} }
} // namespace detail } // namespace detail

View File

@ -1,11 +1,12 @@
// Boost string_algo library find_format_all.hpp header file ---------------------------// // Boost string_algo library find_format_all.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_FIND_FORMAT_ALL_DETAIL_HPP #ifndef BOOST_STRING_FIND_FORMAT_ALL_DETAIL_HPP
#define BOOST_STRING_FIND_FORMAT_ALL_DETAIL_HPP #define BOOST_STRING_FIND_FORMAT_ALL_DETAIL_HPP
@ -23,29 +24,7 @@ namespace boost {
// find_format_all_copy (iterator variant) implementation ---------------------------// // find_format_all_copy (iterator variant) implementation ---------------------------//
template< template<
typename OutputIteratorT,
typename InputT,
typename FinderT,
typename FormatterT,
typename FindResultT >
inline OutputIteratorT find_format_all_copy_impl(
OutputIteratorT Output,
const InputT& Input,
FinderT Finder,
FormatterT Formatter,
const FindResultT& FindResult )
{
return find_format_all_copy_impl2(
Output,
Input,
Finder,
Formatter,
FindResult,
Formatter(FindResult) );
}
template<
typename OutputIteratorT, typename OutputIteratorT,
typename InputT, typename InputT,
typename FinderT, typename FinderT,
@ -72,7 +51,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 )
@ -80,33 +59,34 @@ 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;
} }
// find_format_all_copy implementation ----------------------------------------------//
template< template<
typename InputT, typename OutputIteratorT,
typename InputT,
typename FinderT, typename FinderT,
typename FormatterT, typename FormatterT,
typename FindResultT > typename FindResultT >
inline InputT find_format_all_copy_impl( inline OutputIteratorT find_format_all_copy_impl(
OutputIteratorT Output,
const InputT& Input, const InputT& Input,
FinderT Finder, FinderT Finder,
FormatterT Formatter, FormatterT Formatter,
const FindResultT& FindResult) const FindResultT& FindResult )
{ {
return find_format_all_copy_impl2( return ::boost::algorithm::detail::find_format_all_copy_impl2(
Output,
Input, Input,
Finder, Finder,
Formatter, Formatter,
@ -114,7 +94,9 @@ namespace boost {
Formatter(FindResult) ); Formatter(FindResult) );
} }
template< // find_format_all_copy implementation ----------------------------------------------//
template<
typename InputT, typename InputT,
typename FinderT, typename FinderT,
typename FormatterT, typename FormatterT,
@ -139,7 +121,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;
@ -148,35 +130,33 @@ 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) ); ::boost::algorithm::detail::insert( Output, ::boost::end(Output), LastMatch, ::boost::end(Input) );
return Output; return Output;
} }
// find_format_all implementation ------------------------------------------------// template<
typename InputT,
template<
typename InputT,
typename FinderT, typename FinderT,
typename FormatterT, typename FormatterT,
typename FindResultT > typename FindResultT >
inline void find_format_all_impl( inline InputT find_format_all_copy_impl(
InputT& Input, const InputT& Input,
FinderT Finder, FinderT Finder,
FormatterT Formatter, FormatterT Formatter,
FindResultT FindResult) const FindResultT& FindResult)
{ {
find_format_all_impl2( return ::boost::algorithm::detail::find_format_all_copy_impl2(
Input, Input,
Finder, Finder,
Formatter, Formatter,
@ -184,6 +164,8 @@ namespace boost {
Formatter(FindResult) ); Formatter(FindResult) );
} }
// find_format_all implementation ------------------------------------------------//
template< template<
typename InputT, typename InputT,
typename FinderT, typename FinderT,
@ -212,8 +194,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 )
{ {
@ -229,32 +211,51 @@ namespace boost {
SearchIt=M.end(); SearchIt=M.end();
// Copy formated replace to the storage // Copy formated replace to the storage
copy_to_storage( Storage, M.format_result() ); ::boost::algorithm::detail::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
InsertIt=process_segment( InsertIt=::boost::algorithm::detail::process_segment(
Storage, Storage,
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) ); ::boost::algorithm::detail::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() ); ::boost::algorithm::detail::insert( Input, ::boost::end(Input), Storage.begin(), Storage.end() );
} }
} }
template<
typename InputT,
typename FinderT,
typename FormatterT,
typename FindResultT >
inline void find_format_all_impl(
InputT& Input,
FinderT Finder,
FormatterT Formatter,
FindResultT FindResult)
{
::boost::algorithm::detail::find_format_all_impl2(
Input,
Finder,
Formatter,
FindResult,
Formatter(FindResult) );
}
} // namespace detail } // namespace detail
} // namespace algorithm } // namespace algorithm
} // namespace boost } // namespace boost

View File

@ -1,11 +1,12 @@
// Boost string_algo library find_format_store.hpp header file ---------------------------// // Boost string_algo library find_format_store.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_FIND_FORMAT_STORE_DETAIL_HPP #ifndef BOOST_STRING_FIND_FORMAT_STORE_DETAIL_HPP
#define BOOST_STRING_FIND_FORMAT_STORE_DETAIL_HPP #define BOOST_STRING_FIND_FORMAT_STORE_DETAIL_HPP
@ -19,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,
@ -63,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

@ -1,11 +1,12 @@
// Boost string_algo library find_iterator.hpp header file ---------------------------// // Boost string_algo library find_iterator.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_FIND_ITERATOR_DETAIL_HPP #ifndef BOOST_STRING_FIND_ITERATOR_DETAIL_HPP
#define BOOST_STRING_FIND_ITERATOR_DETAIL_HPP #define BOOST_STRING_FIND_ITERATOR_DETAIL_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library finder.hpp header file ---------------------------// // Boost string_algo library finder.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2006.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_FINDER_DETAIL_HPP #ifndef BOOST_STRING_FINDER_DETAIL_HPP
#define BOOST_STRING_FINDER_DETAIL_HPP #define BOOST_STRING_FINDER_DETAIL_HPP
@ -18,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 {
@ -39,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,
@ -90,7 +92,7 @@ namespace boost {
// find last functor -----------------------------------------------// // find last functor -----------------------------------------------//
// find the last match a subsequnce in the sequence ( functor ) // find the last match a subseqeunce in the sequence ( functor )
/* /*
Returns a pair <begin,end> marking the subsequence in the sequence. Returns a pair <begin,end> marking the subsequence in the sequence.
If the find fails, returns <End,End> If the find fails, returns <End,End>
@ -106,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,
@ -152,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;
@ -200,7 +202,7 @@ namespace boost {
// find n-th functor -----------------------------------------------// // find n-th functor -----------------------------------------------//
// find the n-th match of a subsequnce in the sequence ( functor ) // find the n-th match of a subsequence in the sequence ( functor )
/* /*
Returns a pair <begin,end> marking the subsequence in the sequence. Returns a pair <begin,end> marking the subsequence in the sequence.
If the find fails, returns <End,End> If the find fails, returns <End,End>
@ -212,20 +214,23 @@ namespace boost {
typedef first_finderF< typedef first_finderF<
search_iterator_type, search_iterator_type,
PredicateT> first_finder_type; PredicateT> first_finder_type;
typedef last_finderF<
search_iterator_type,
PredicateT> last_finder_type;
// Construction // Construction
template< typename SearchT > template< typename SearchT >
nth_finderF( nth_finderF(
const SearchT& Search, const SearchT& Search,
unsigned 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(
search_iterator_type SearchBegin, search_iterator_type SearchBegin,
search_iterator_type SearchEnd, search_iterator_type SearchEnd,
unsigned int Nth, int Nth,
PredicateT Comp) : PredicateT Comp) :
m_Search(SearchBegin, SearchEnd), m_Search(SearchBegin, SearchEnd),
m_Nth(Nth), m_Nth(Nth),
@ -237,6 +242,26 @@ namespace boost {
operator()( operator()(
ForwardIteratorT Begin, ForwardIteratorT Begin,
ForwardIteratorT End ) const ForwardIteratorT End ) const
{
if(m_Nth>=0)
{
return find_forward(Begin, End, m_Nth);
}
else
{
return find_backward(Begin, End, -m_Nth);
}
}
private:
// Implementation helpers
template< typename ForwardIteratorT >
iterator_range<ForwardIteratorT>
find_forward(
ForwardIteratorT Begin,
ForwardIteratorT End,
unsigned int N) const
{ {
typedef ForwardIteratorT input_iterator_type; typedef ForwardIteratorT input_iterator_type;
typedef iterator_range<ForwardIteratorT> result_type; typedef iterator_range<ForwardIteratorT> result_type;
@ -245,16 +270,16 @@ namespace boost {
if( boost::empty(m_Search) ) if( boost::empty(m_Search) )
return result_type( End, End ); return result_type( End, End );
// Instantiate find funtor // Instantiate find functor
first_finder_type first_finder( first_finder_type first_finder(
m_Search.begin(), m_Search.end(), m_Comp ); m_Search.begin(), m_Search.end(), m_Comp );
result_type M( Begin, Begin ); result_type M( Begin, Begin );
for( unsigned int n=0; n<=m_Nth; ++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 )
{ {
@ -266,14 +291,179 @@ namespace boost {
return M; return M;
} }
template< typename ForwardIteratorT >
iterator_range<ForwardIteratorT>
find_backward(
ForwardIteratorT Begin,
ForwardIteratorT End,
unsigned int N) const
{
typedef ForwardIteratorT input_iterator_type;
typedef iterator_range<ForwardIteratorT> result_type;
// Sanity check
if( boost::empty(m_Search) )
return result_type( End, End );
// Instantiate find functor
last_finder_type last_finder(
m_Search.begin(), m_Search.end(), m_Comp );
result_type M( End, End );
for( unsigned int n=1; n<=N; ++n )
{
// find next match
M=last_finder( Begin, ::boost::begin(M) );
if ( !M )
{
// Subsequence not found, return
return M;
}
}
return M;
}
private: private:
iterator_range<search_iterator_type> m_Search; iterator_range<search_iterator_type> m_Search;
unsigned int m_Nth; int m_Nth;
PredicateT m_Comp; PredicateT m_Comp;
}; };
// find head/tail implementation helpers ---------------------------//
template<typename ForwardIteratorT>
iterator_range<ForwardIteratorT>
find_head_impl(
ForwardIteratorT Begin,
ForwardIteratorT End,
unsigned int N,
std::forward_iterator_tag )
{
typedef ForwardIteratorT input_iterator_type;
typedef iterator_range<ForwardIteratorT> result_type;
input_iterator_type It=Begin;
for(
unsigned int Index=0;
Index<N && It!=End; ++Index,++It ) {};
return result_type( Begin, It );
}
template< typename ForwardIteratorT >
iterator_range<ForwardIteratorT>
find_head_impl(
ForwardIteratorT Begin,
ForwardIteratorT End,
unsigned int N,
std::random_access_iterator_tag )
{
typedef ForwardIteratorT input_iterator_type;
typedef iterator_range<ForwardIteratorT> result_type;
if ( (End<=Begin) || ( static_cast<unsigned int>(End-Begin) < N ) )
return result_type( Begin, End );
return result_type(Begin,Begin+N);
}
// Find head implementation
template<typename ForwardIteratorT>
iterator_range<ForwardIteratorT>
find_head_impl(
ForwardIteratorT Begin,
ForwardIteratorT End,
unsigned int N )
{
typedef BOOST_STRING_TYPENAME boost::detail::
iterator_traits<ForwardIteratorT>::iterator_category category;
return ::boost::algorithm::detail::find_head_impl( Begin, End, N, category() );
}
template< typename ForwardIteratorT >
iterator_range<ForwardIteratorT>
find_tail_impl(
ForwardIteratorT Begin,
ForwardIteratorT End,
unsigned int N,
std::forward_iterator_tag )
{
typedef ForwardIteratorT input_iterator_type;
typedef iterator_range<ForwardIteratorT> result_type;
unsigned int Index=0;
input_iterator_type It=Begin;
input_iterator_type It2=Begin;
// Advance It2 by N increments
for( Index=0; Index<N && It2!=End; ++Index,++It2 ) {};
// Advance It, It2 to the end
for(; It2!=End; ++It,++It2 ) {};
return result_type( It, It2 );
}
template< typename ForwardIteratorT >
iterator_range<ForwardIteratorT>
find_tail_impl(
ForwardIteratorT Begin,
ForwardIteratorT End,
unsigned int N,
std::bidirectional_iterator_tag )
{
typedef ForwardIteratorT input_iterator_type;
typedef iterator_range<ForwardIteratorT> result_type;
input_iterator_type It=End;
for(
unsigned int Index=0;
Index<N && It!=Begin; ++Index,--It ) {};
return result_type( It, End );
}
template< typename ForwardIteratorT >
iterator_range<ForwardIteratorT>
find_tail_impl(
ForwardIteratorT Begin,
ForwardIteratorT End,
unsigned int N,
std::random_access_iterator_tag )
{
typedef ForwardIteratorT input_iterator_type;
typedef iterator_range<ForwardIteratorT> result_type;
if ( (End<=Begin) || ( static_cast<unsigned int>(End-Begin) < N ) )
return result_type( Begin, End );
return result_type( End-N, End );
}
// Operation
template< typename ForwardIteratorT >
iterator_range<ForwardIteratorT>
find_tail_impl(
ForwardIteratorT Begin,
ForwardIteratorT End,
unsigned int N )
{
typedef BOOST_STRING_TYPENAME boost::detail::
iterator_traits<ForwardIteratorT>::iterator_category category;
return ::boost::algorithm::detail::find_tail_impl( Begin, End, N, category() );
}
// find head functor -----------------------------------------------// // find head functor -----------------------------------------------//
// find a head in the sequence ( functor ) // find a head in the sequence ( functor )
/* /*
This functor find a head of the specified range. For This functor find a head of the specified range. For
@ -283,7 +473,7 @@ namespace boost {
struct head_finderF struct head_finderF
{ {
// Construction // Construction
head_finderF( unsigned int N ) : m_N(N) {} head_finderF( int N ) : m_N(N) {}
// Operation // Operation
template< typename ForwardIteratorT > template< typename ForwardIteratorT >
@ -292,54 +482,26 @@ namespace boost {
ForwardIteratorT Begin, ForwardIteratorT Begin,
ForwardIteratorT End ) const ForwardIteratorT End ) const
{ {
typedef BOOST_STRING_TYPENAME boost::detail:: if(m_N>=0)
iterator_traits<ForwardIteratorT>::iterator_category category; {
return ::boost::algorithm::detail::find_head_impl( Begin, End, m_N );
}
else
{
iterator_range<ForwardIteratorT> Res=
::boost::algorithm::detail::find_tail_impl( Begin, End, -m_N );
return findit( Begin, End, category() ); return ::boost::make_iterator_range(Begin, Res.begin());
}
} }
private: private:
// Find operation implementation int m_N;
template< typename ForwardIteratorT >
iterator_range<ForwardIteratorT>
findit(
ForwardIteratorT Begin,
ForwardIteratorT End,
std::forward_iterator_tag ) const
{
typedef ForwardIteratorT input_iterator_type;
typedef iterator_range<ForwardIteratorT> result_type;
input_iterator_type It=Begin;
for(
unsigned int Index=0;
Index<m_N && It!=End; ++Index,++It ) {};
return result_type( Begin, It );
}
template< typename ForwardIteratorT >
iterator_range<ForwardIteratorT>
findit(
ForwardIteratorT Begin,
ForwardIteratorT End,
std::random_access_iterator_tag ) const
{
typedef ForwardIteratorT input_iterator_type;
typedef iterator_range<ForwardIteratorT> result_type;
if ( (End<=Begin) || ( static_cast<unsigned int>(End-Begin) < m_N ) )
return result_type( Begin, End );
return result_type(Begin,Begin+m_N);
}
private:
unsigned int m_N;
}; };
// find tail functor -----------------------------------------------// // find tail functor -----------------------------------------------//
// find a tail in the sequence ( functor ) // find a tail in the sequence ( functor )
/* /*
This functor find a tail of the specified range. For This functor find a tail of the specified range. For
@ -349,7 +511,7 @@ namespace boost {
struct tail_finderF struct tail_finderF
{ {
// Construction // Construction
tail_finderF( unsigned int N ) : m_N(N) {} tail_finderF( int N ) : m_N(N) {}
// Operation // Operation
template< typename ForwardIteratorT > template< typename ForwardIteratorT >
@ -358,74 +520,21 @@ namespace boost {
ForwardIteratorT Begin, ForwardIteratorT Begin,
ForwardIteratorT End ) const ForwardIteratorT End ) const
{ {
typedef BOOST_STRING_TYPENAME boost::detail:: if(m_N>=0)
iterator_traits<ForwardIteratorT>::iterator_category category; {
return ::boost::algorithm::detail::find_tail_impl( Begin, End, m_N );
}
else
{
iterator_range<ForwardIteratorT> Res=
::boost::algorithm::detail::find_head_impl( Begin, End, -m_N );
return findit( Begin, End, category() ); return ::boost::make_iterator_range(Res.end(), End);
}
} }
private: private:
// Find operation implementation int m_N;
template< typename ForwardIteratorT >
iterator_range<ForwardIteratorT>
findit(
ForwardIteratorT Begin,
ForwardIteratorT End,
std::forward_iterator_tag ) const
{
typedef ForwardIteratorT input_iterator_type;
typedef iterator_range<ForwardIteratorT> result_type;
unsigned int Index=0;
input_iterator_type It=Begin;
input_iterator_type It2=Begin;
// Advance It2 by N incremets
for( Index=0; Index<m_N && It2!=End; ++Index,++It2 ) {};
// Advance It, It2 to the end
for(; It2!=End; ++It,++It2 ) {};
return result_type( It, It2 );
}
template< typename ForwardIteratorT >
iterator_range<ForwardIteratorT>
findit(
ForwardIteratorT Begin,
ForwardIteratorT End,
std::bidirectional_iterator_tag ) const
{
typedef ForwardIteratorT input_iterator_type;
typedef iterator_range<ForwardIteratorT> result_type;
input_iterator_type It=End;
for(
unsigned int Index=0;
Index<m_N && It!=Begin; ++Index,--It ) {};
return result_type( It, End );
}
template< typename ForwardIteratorT >
iterator_range<ForwardIteratorT>
findit(
ForwardIteratorT Begin,
ForwardIteratorT End,
std::random_access_iterator_tag ) const
{
typedef ForwardIteratorT input_iterator_type;
typedef iterator_range<ForwardIteratorT> result_type;
if ( (End<=Begin) || ( static_cast<unsigned int>(End-Begin) < m_N ) )
return result_type( Begin, End );
return result_type( End-m_N, End );
}
private:
unsigned int m_N;
}; };
// find token functor -----------------------------------------------// // find token functor -----------------------------------------------//
@ -475,7 +584,7 @@ namespace boost {
} }
else else
{ {
// Advance by one possition // Advance by one position
++It2; ++It2;
} }

View File

@ -1,11 +1,12 @@
// Boost string_algo library find_regex.hpp header file ---------------------------// // Boost string_algo library find_regex.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_FINDER_REGEX_DETAIL_HPP #ifndef BOOST_STRING_FINDER_REGEX_DETAIL_HPP
#define BOOST_STRING_FINDER_REGEX_DETAIL_HPP #define BOOST_STRING_FINDER_REGEX_DETAIL_HPP
@ -97,7 +98,7 @@ namespace boost {
// instantiate match result // instantiate match result
match_results<input_iterator_type> result; match_results<input_iterator_type> result;
// search for a match // search for a match
if ( regex_search( Begin, End, result, m_Rx, m_MatchFlags ) ) if ( ::boost::regex_search( Begin, End, result, m_Rx, m_MatchFlags ) )
{ {
// construct a result // construct a result
return result_type( result ); return result_type( result );

View File

@ -1,9 +1,10 @@
// Boost string_algo library formatter.hpp header file ---------------------------// // Boost string_algo library formatter.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org for updates, documentation, and revision history.
@ -38,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))
@ -69,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

@ -1,11 +1,12 @@
// Boost string_algo library formatter_regex.hpp header file ---------------------------// // Boost string_algo library formatter_regex.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_FORMATTER_REGEX_DETAIL_HPP #ifndef BOOST_STRING_FORMATTER_REGEX_DETAIL_HPP
#define BOOST_STRING_FORMATTER_REGEX_DETAIL_HPP #define BOOST_STRING_FORMATTER_REGEX_DETAIL_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library predicate.hpp header file ---------------------------// // Boost string_algo library predicate.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_PREDICATE_DETAIL_HPP #ifndef BOOST_STRING_PREDICATE_DETAIL_HPP
#define BOOST_STRING_PREDICATE_DETAIL_HPP #define BOOST_STRING_PREDICATE_DETAIL_HPP
@ -62,7 +63,7 @@ namespace boost {
iterator_range<ForwardIterator1T> Result iterator_range<ForwardIterator1T> Result
=last_finder( =last_finder(
make_iterator_range(SubBegin, SubEnd), ::boost::make_iterator_range(SubBegin, SubEnd),
Comp)(Begin, End); Comp)(Begin, End);
return !Result.empty() && Result.end()==End; return !Result.empty() && Result.end()==End;

View File

@ -1,11 +1,12 @@
// Boost string_algo library replace_storage.hpp header file ---------------------------// // Boost string_algo library replace_storage.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_REPLACE_STORAGE_DETAIL_HPP #ifndef BOOST_STRING_REPLACE_STORAGE_DETAIL_HPP
#define BOOST_STRING_REPLACE_STORAGE_DETAIL_HPP #define BOOST_STRING_REPLACE_STORAGE_DETAIL_HPP
@ -45,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) );
} }
@ -67,7 +68,7 @@ namespace boost {
ForwardIteratorT SegmentEnd ) ForwardIteratorT SegmentEnd )
{ {
// Copy data from the storage until the beginning of the segment // Copy data from the storage until the beginning of the segment
ForwardIteratorT It=move_from_storage( Storage, InsertIt, SegmentBegin ); ForwardIteratorT It=::boost::algorithm::detail::move_from_storage( Storage, InsertIt, SegmentBegin );
// 3 cases are possible : // 3 cases are possible :
// a) Storage is empty, It==SegmentBegin // a) Storage is empty, It==SegmentBegin
@ -124,7 +125,7 @@ namespace boost {
{ {
// Call replace to do the job // Call replace to do the job
replace( Input, InsertIt, SegmentBegin, Storage ); ::boost::algorithm::detail::replace( Input, InsertIt, SegmentBegin, Storage );
// Empty the storage // Empty the storage
Storage.clear(); Storage.clear();
// Iterators were not changed, simply return the end of segment // Iterators were not changed, simply return the end of segment

View File

@ -1,11 +1,12 @@
// Boost string_algo library sequence.hpp header file ---------------------------// // Boost string_algo library sequence.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_DETAIL_SEQUENCE_HPP #ifndef BOOST_STRING_DETAIL_SEQUENCE_HPP
#define BOOST_STRING_DETAIL_SEQUENCE_HPP #define BOOST_STRING_DETAIL_SEQUENCE_HPP
@ -40,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) ); ::boost::algorithm::detail::insert( Input, At, ::boost::begin(Insert), ::boost::end(Insert) );
} }
// erase helper ---------------------------------------------------// // erase helper ---------------------------------------------------//
@ -183,11 +184,11 @@ namespace boost {
{ {
if(From!=To) if(From!=To)
{ {
replace( Input, From, To, begin(Insert), end(Insert) ); ::boost::algorithm::detail::replace( Input, From, To, ::boost::begin(Insert), ::boost::end(Insert) );
} }
else else
{ {
insert( Input, From, begin(Insert), end(Insert) ); ::boost::algorithm::detail::insert( Input, From, ::boost::begin(Insert), ::boost::end(Insert) );
} }
} }

View File

@ -1,11 +1,12 @@
// Boost string_algo library trim.hpp header file ---------------------------// // Boost string_algo library trim.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_TRIM_DETAIL_HPP #ifndef BOOST_STRING_TRIM_DETAIL_HPP
#define BOOST_STRING_TRIM_DETAIL_HPP #define BOOST_STRING_TRIM_DETAIL_HPP
@ -19,36 +20,6 @@ namespace boost {
// trim iterator helper -----------------------------------------------// // trim iterator helper -----------------------------------------------//
// Search for first non matching character from the beginning of the sequence
template< typename ForwardIteratorT, typename PredicateT >
inline ForwardIteratorT trim_begin(
ForwardIteratorT InBegin,
ForwardIteratorT InEnd,
PredicateT IsSpace )
{
ForwardIteratorT It=InBegin;
for(; It!=InEnd; ++It )
{
if (!IsSpace(*It))
return It;
}
return It;
}
// Search for first non matching character from the end of the sequence
template< typename ForwardIteratorT, typename PredicateT >
inline ForwardIteratorT trim_end(
ForwardIteratorT InBegin,
ForwardIteratorT InEnd,
PredicateT IsSpace )
{
typedef BOOST_STRING_TYPENAME boost::detail::
iterator_traits<ForwardIteratorT>::iterator_category category;
return trim_end_iter_select( InBegin, InEnd, IsSpace, category() );
}
template< typename ForwardIteratorT, typename PredicateT > template< typename ForwardIteratorT, typename PredicateT >
inline ForwardIteratorT trim_end_iter_select( inline ForwardIteratorT trim_end_iter_select(
ForwardIteratorT InBegin, ForwardIteratorT InBegin,
@ -85,6 +56,36 @@ namespace boost {
return InBegin; return InBegin;
} }
// Search for first non matching character from the beginning of the sequence
template< typename ForwardIteratorT, typename PredicateT >
inline ForwardIteratorT trim_begin(
ForwardIteratorT InBegin,
ForwardIteratorT InEnd,
PredicateT IsSpace )
{
ForwardIteratorT It=InBegin;
for(; It!=InEnd; ++It )
{
if (!IsSpace(*It))
return It;
}
return It;
}
// Search for first non matching character from the end of the sequence
template< typename ForwardIteratorT, typename PredicateT >
inline ForwardIteratorT trim_end(
ForwardIteratorT InBegin,
ForwardIteratorT InEnd,
PredicateT IsSpace )
{
typedef BOOST_STRING_TYPENAME boost::detail::
iterator_traits<ForwardIteratorT>::iterator_category category;
return ::boost::algorithm::detail::trim_end_iter_select( InBegin, InEnd, IsSpace, category() );
}
} // namespace detail } // namespace detail
} // namespace algorithm } // namespace algorithm

View File

@ -1,11 +1,12 @@
// Boost string_algo library util.hpp header file ---------------------------// // Boost string_algo library util.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_UTIL_DETAIL_HPP #ifndef BOOST_STRING_UTIL_DETAIL_HPP
#define BOOST_STRING_UTIL_DETAIL_HPP #define BOOST_STRING_UTIL_DETAIL_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library erase.hpp header file ---------------------------// // Boost string_algo library erase.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2006.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_ERASE_HPP #ifndef BOOST_STRING_ERASE_HPP
#define BOOST_STRING_ERASE_HPP #define BOOST_STRING_ERASE_HPP
@ -53,11 +54,11 @@ namespace boost {
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
range_const_iterator<RangeT>::type>& SearchRange ) range_const_iterator<RangeT>::type>& SearchRange )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
range_finder(SearchRange), ::boost::algorithm::range_finder(SearchRange),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase range algorithm //! Erase range algorithm
@ -71,10 +72,10 @@ namespace boost {
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
range_const_iterator<SequenceT>::type>& SearchRange ) range_const_iterator<SequenceT>::type>& SearchRange )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
range_finder(SearchRange), ::boost::algorithm::range_finder(SearchRange),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase range algorithm //! Erase range algorithm
@ -92,10 +93,10 @@ namespace boost {
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
range_iterator<SequenceT>::type>& SearchRange ) range_iterator<SequenceT>::type>& SearchRange )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
range_finder(SearchRange), ::boost::algorithm::range_finder(SearchRange),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
// erase_first --------------------------------------------------------// // erase_first --------------------------------------------------------//
@ -123,11 +124,11 @@ namespace boost {
const Range1T& Input, const Range1T& Input,
const Range2T& Search ) const Range2T& Search )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
first_finder(Search), ::boost::algorithm::first_finder(Search),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase first algorithm //! Erase first algorithm
@ -139,10 +140,10 @@ namespace boost {
const SequenceT& Input, const SequenceT& Input,
const RangeT& Search ) const RangeT& Search )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
first_finder(Search), ::boost::algorithm::first_finder(Search),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase first algorithm //! Erase first algorithm
@ -158,10 +159,10 @@ namespace boost {
SequenceT& Input, SequenceT& Input,
const RangeT& Search ) const RangeT& Search )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
first_finder(Search), ::boost::algorithm::first_finder(Search),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
// erase_first ( case insensitive ) ------------------------------------// // erase_first ( case insensitive ) ------------------------------------//
@ -192,11 +193,11 @@ namespace boost {
const Range2T& Search, const Range2T& Search,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
first_finder(Search, is_iequal(Loc)), ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase first algorithm ( case insensitive ) //! Erase first algorithm ( case insensitive )
@ -209,10 +210,10 @@ namespace boost {
const RangeT& Search, const RangeT& Search,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
first_finder(Search, is_iequal(Loc)), ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase first algorithm ( case insensitive ) //! Erase first algorithm ( case insensitive )
@ -230,10 +231,10 @@ namespace boost {
const RangeT& Search, const RangeT& Search,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
first_finder(Search, is_iequal(Loc)), ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
// erase_last --------------------------------------------------------// // erase_last --------------------------------------------------------//
@ -261,11 +262,11 @@ namespace boost {
const Range1T& Input, const Range1T& Input,
const Range2T& Search ) const Range2T& Search )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
last_finder(Search), ::boost::algorithm::last_finder(Search),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase last algorithm //! Erase last algorithm
@ -277,10 +278,10 @@ namespace boost {
const SequenceT& Input, const SequenceT& Input,
const RangeT& Search ) const RangeT& Search )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
last_finder(Search), ::boost::algorithm::last_finder(Search),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase last algorithm //! Erase last algorithm
@ -296,10 +297,10 @@ namespace boost {
SequenceT& Input, SequenceT& Input,
const RangeT& Search ) const RangeT& Search )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
last_finder(Search), ::boost::algorithm::last_finder(Search),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
// erase_last ( case insensitive ) ------------------------------------// // erase_last ( case insensitive ) ------------------------------------//
@ -330,11 +331,11 @@ namespace boost {
const Range2T& Search, const Range2T& Search,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
last_finder(Search, is_iequal(Loc)), ::boost::algorithm::last_finder(Search, is_iequal(Loc)),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase last algorithm ( case insensitive ) //! Erase last algorithm ( case insensitive )
@ -347,10 +348,10 @@ namespace boost {
const RangeT& Search, const RangeT& Search,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
last_finder(Search, is_iequal(Loc)), ::boost::algorithm::last_finder(Search, is_iequal(Loc)),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase last algorithm ( case insensitive ) //! Erase last algorithm ( case insensitive )
@ -368,10 +369,10 @@ namespace boost {
const RangeT& Search, const RangeT& Search,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
last_finder(Search, is_iequal(Loc)), ::boost::algorithm::last_finder(Search, is_iequal(Loc)),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
// erase_nth --------------------------------------------------------------------// // erase_nth --------------------------------------------------------------------//
@ -387,6 +388,7 @@ namespace boost {
\param Input An input string \param Input An input string
\param Search A substring to be searched for \param Search A substring to be searched for
\param Nth An index of the match to be replaced. The index is 0-based. \param Nth An index of the match to be replaced. The index is 0-based.
For negative N, matches are counted from the end of string.
\return An output iterator pointing just after the last inserted character or \return An output iterator pointing just after the last inserted character or
a modified copy of the input a modified copy of the input
@ -400,13 +402,13 @@ namespace boost {
OutputIteratorT Output, OutputIteratorT Output,
const Range1T& Input, const Range1T& Input,
const Range2T& Search, const Range2T& Search,
unsigned int Nth ) int Nth )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
nth_finder(Search, Nth), ::boost::algorithm::nth_finder(Search, Nth),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase nth algorithm //! Erase nth algorithm
@ -417,12 +419,12 @@ namespace boost {
inline SequenceT erase_nth_copy( inline SequenceT erase_nth_copy(
const SequenceT& Input, const SequenceT& Input,
const RangeT& Search, const RangeT& Search,
unsigned int Nth ) int Nth )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
nth_finder(Search, Nth), ::boost::algorithm::nth_finder(Search, Nth),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase nth algorithm //! Erase nth algorithm
@ -433,17 +435,18 @@ namespace boost {
\param Input An input string \param Input An input string
\param Search A substring to be searched for. \param Search A substring to be searched for.
\param Nth An index of the match to be replaced. The index is 0-based. \param Nth An index of the match to be replaced. The index is 0-based.
For negative N, matches are counted from the end of string.
*/ */
template<typename SequenceT, typename RangeT> template<typename SequenceT, typename RangeT>
inline void erase_nth( inline void erase_nth(
SequenceT& Input, SequenceT& Input,
const RangeT& Search, const RangeT& Search,
unsigned int Nth ) int Nth )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
nth_finder(Search, Nth), ::boost::algorithm::nth_finder(Search, Nth),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
// erase_nth ( case insensitive ) ---------------------------------------------// // erase_nth ( case insensitive ) ---------------------------------------------//
@ -459,6 +462,7 @@ namespace boost {
\param Input An input string \param Input An input string
\param Search A substring to be searched for. \param Search A substring to be searched for.
\param Nth An index of the match to be replaced. The index is 0-based. \param Nth An index of the match to be replaced. The index is 0-based.
For negative N, matches are counted from the end of string.
\param Loc A locale used for case insensitive comparison \param Loc A locale used for case insensitive comparison
\return An output iterator pointing just after the last inserted character or \return An output iterator pointing just after the last inserted character or
a modified copy of the input a modified copy of the input
@ -473,14 +477,14 @@ namespace boost {
OutputIteratorT Output, OutputIteratorT Output,
const Range1T& Input, const Range1T& Input,
const Range2T& Search, const Range2T& Search,
unsigned int Nth, int Nth,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
nth_finder(Search, Nth, is_iequal(Loc)), ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase nth algorithm //! Erase nth algorithm
@ -491,12 +495,12 @@ namespace boost {
inline SequenceT ierase_nth_copy( inline SequenceT ierase_nth_copy(
const SequenceT& Input, const SequenceT& Input,
const RangeT& Search, const RangeT& Search,
unsigned int Nth, int Nth,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
nth_finder(Search, Nth, is_iequal(Loc)), ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)),
empty_formatter(Input) ); empty_formatter(Input) );
} }
@ -508,19 +512,20 @@ namespace boost {
\param Input An input string \param Input An input string
\param Search A substring to be searched for. \param Search A substring to be searched for.
\param Nth An index of the match to be replaced. The index is 0-based. \param Nth An index of the match to be replaced. The index is 0-based.
For negative N, matches are counted from the end of string.
\param Loc A locale used for case insensitive comparison \param Loc A locale used for case insensitive comparison
*/ */
template<typename SequenceT, typename RangeT> template<typename SequenceT, typename RangeT>
inline void ierase_nth( inline void ierase_nth(
SequenceT& Input, SequenceT& Input,
const RangeT& Search, const RangeT& Search,
unsigned int Nth, int Nth,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
nth_finder(Search, Nth, is_iequal(Loc)), ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
@ -550,11 +555,11 @@ namespace boost {
const Range1T& Input, const Range1T& Input,
const Range2T& Search ) const Range2T& Search )
{ {
return find_format_all_copy( return ::boost::algorithm::find_format_all_copy(
Output, Output,
Input, Input,
first_finder(Search), ::boost::algorithm::first_finder(Search),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase all algorithm //! Erase all algorithm
@ -566,10 +571,10 @@ namespace boost {
const SequenceT& Input, const SequenceT& Input,
const RangeT& Search ) const RangeT& Search )
{ {
return find_format_all_copy( return ::boost::algorithm::find_format_all_copy(
Input, Input,
first_finder(Search), ::boost::algorithm::first_finder(Search),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase all algorithm //! Erase all algorithm
@ -585,10 +590,10 @@ namespace boost {
SequenceT& Input, SequenceT& Input,
const RangeT& Search ) const RangeT& Search )
{ {
find_format_all( ::boost::algorithm::find_format_all(
Input, Input,
first_finder(Search), ::boost::algorithm::first_finder(Search),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
// erase_all ( case insensitive ) ------------------------------------// // erase_all ( case insensitive ) ------------------------------------//
@ -619,11 +624,11 @@ namespace boost {
const Range2T& Search, const Range2T& Search,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_all_copy( return ::boost::algorithm::find_format_all_copy(
Output, Output,
Input, Input,
first_finder(Search, is_iequal(Loc)), ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase all algorithm ( case insensitive ) //! Erase all algorithm ( case insensitive )
@ -636,10 +641,10 @@ namespace boost {
const RangeT& Search, const RangeT& Search,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_all_copy( return ::boost::algorithm::find_format_all_copy(
Input, Input,
first_finder(Search, is_iequal(Loc)), ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
//! Erase all algorithm ( case insensitive ) //! Erase all algorithm ( case insensitive )
@ -657,10 +662,10 @@ namespace boost {
const RangeT& Search, const RangeT& Search,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
find_format_all( ::boost::algorithm::find_format_all(
Input, Input,
first_finder(Search, is_iequal(Loc)), ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
empty_formatter(Input) ); ::boost::algorithm::empty_formatter(Input) );
} }
// erase_head --------------------------------------------------------------------// // erase_head --------------------------------------------------------------------//
@ -675,7 +680,9 @@ namespace boost {
\param Output An output iterator to which the result will be copied \param Output An output iterator to which the result will be copied
\param Input An input string \param Input An input string
\param N Length of the head \param N Length of the head.
For N>=0, at most N characters are extracted.
For N<0, size(Input)-|N| characters are extracted.
\return An output iterator pointing just after the last inserted character or \return An output iterator pointing just after the last inserted character or
a modified copy of the input a modified copy of the input
@ -687,13 +694,13 @@ namespace boost {
inline OutputIteratorT erase_head_copy( inline OutputIteratorT erase_head_copy(
OutputIteratorT Output, OutputIteratorT Output,
const RangeT& Input, const RangeT& Input,
unsigned int N ) int N )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
head_finder(N), ::boost::algorithm::head_finder(N),
empty_formatter( Input ) ); ::boost::algorithm::empty_formatter( Input ) );
} }
//! Erase head algorithm //! Erase head algorithm
@ -703,12 +710,12 @@ namespace boost {
template<typename SequenceT> template<typename SequenceT>
inline SequenceT erase_head_copy( inline SequenceT erase_head_copy(
const SequenceT& Input, const SequenceT& Input,
unsigned int N ) int N )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
head_finder(N), ::boost::algorithm::head_finder(N),
empty_formatter( Input ) ); ::boost::algorithm::empty_formatter( Input ) );
} }
//! Erase head algorithm //! Erase head algorithm
@ -719,16 +726,18 @@ namespace boost {
\param Input An input string \param Input An input string
\param N Length of the head \param N Length of the head
For N>=0, at most N characters are extracted.
For N<0, size(Input)-|N| characters are extracted.
*/ */
template<typename SequenceT> template<typename SequenceT>
inline void erase_head( inline void erase_head(
SequenceT& Input, SequenceT& Input,
unsigned int N ) int N )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
head_finder(N), ::boost::algorithm::head_finder(N),
empty_formatter( Input ) ); ::boost::algorithm::empty_formatter( Input ) );
} }
// erase_tail --------------------------------------------------------------------// // erase_tail --------------------------------------------------------------------//
@ -743,7 +752,9 @@ namespace boost {
\param Output An output iterator to which the result will be copied \param Output An output iterator to which the result will be copied
\param Input An input string \param Input An input string
\param N Length of the head \param N Length of the head.
For N>=0, at most N characters are extracted.
For N<0, size(Input)-|N| characters are extracted.
\return An output iterator pointing just after the last inserted character or \return An output iterator pointing just after the last inserted character or
a modified copy of the input a modified copy of the input
@ -755,13 +766,13 @@ namespace boost {
inline OutputIteratorT erase_tail_copy( inline OutputIteratorT erase_tail_copy(
OutputIteratorT Output, OutputIteratorT Output,
const RangeT& Input, const RangeT& Input,
unsigned int N ) int N )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
tail_finder(N), ::boost::algorithm::tail_finder(N),
empty_formatter( Input ) ); ::boost::algorithm::empty_formatter( Input ) );
} }
//! Erase tail algorithm //! Erase tail algorithm
@ -771,12 +782,12 @@ namespace boost {
template<typename SequenceT> template<typename SequenceT>
inline SequenceT erase_tail_copy( inline SequenceT erase_tail_copy(
const SequenceT& Input, const SequenceT& Input,
unsigned int N ) int N )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
tail_finder(N), ::boost::algorithm::tail_finder(N),
empty_formatter( Input ) ); ::boost::algorithm::empty_formatter( Input ) );
} }
//! Erase tail algorithm //! Erase tail algorithm
@ -787,16 +798,18 @@ namespace boost {
\param Input An input string \param Input An input string
\param N Length of the head \param N Length of the head
For N>=0, at most N characters are extracted.
For N<0, size(Input)-|N| characters are extracted.
*/ */
template<typename SequenceT> template<typename SequenceT>
inline void erase_tail( inline void erase_tail(
SequenceT& Input, SequenceT& Input,
unsigned int N ) int N )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
tail_finder(N), ::boost::algorithm::tail_finder(N),
empty_formatter( Input ) ); ::boost::algorithm::empty_formatter( Input ) );
} }
} // namespace algorithm } // namespace algorithm

View File

@ -1,11 +1,12 @@
// Boost string_algo library find.hpp header file ---------------------------// // Boost string_algo library find.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_FIND_HPP #ifndef BOOST_STRING_FIND_HPP
#define BOOST_STRING_FIND_HPP #define BOOST_STRING_FIND_HPP
@ -16,8 +17,7 @@
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#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/as_literal.hpp>
#include <boost/range/result_iterator.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>
@ -48,19 +48,21 @@ namespace boost {
*/ */
template<typename RangeT, typename FinderT> template<typename RangeT, typename FinderT>
inline iterator_range< inline iterator_range<
BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> BOOST_STRING_TYPENAME range_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(::boost::as_literal(Input));
return Finder(::boost::begin(lit_input),::boost::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.
@ -74,13 +76,12 @@ namespace boost {
*/ */
template<typename Range1T, typename Range2T> template<typename Range1T, typename Range2T>
inline iterator_range< inline iterator_range<
BOOST_STRING_TYPENAME range_result_iterator<Range1T>::type> BOOST_STRING_TYPENAME range_iterator<Range1T>::type>
find_first( find_first(
Range1T& Input, Range1T& Input,
const Range2T& Search) const Range2T& Search)
{ {
return first_finder(Search)( return ::boost::algorithm::find(Input, ::boost::algorithm::first_finder(Search));
begin(Input),end(Input));
} }
//! Find first algorithm ( case insensitive ) //! Find first algorithm ( case insensitive )
@ -101,21 +102,20 @@ namespace boost {
*/ */
template<typename Range1T, typename Range2T> template<typename Range1T, typename Range2T>
inline iterator_range< inline iterator_range<
BOOST_STRING_TYPENAME range_result_iterator<Range1T>::type> BOOST_STRING_TYPENAME range_iterator<Range1T>::type>
ifind_first( ifind_first(
Range1T& Input, Range1T& Input,
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 ::boost::algorithm::find(Input, ::boost::algorithm::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.
@ -129,13 +129,12 @@ namespace boost {
*/ */
template<typename Range1T, typename Range2T> template<typename Range1T, typename Range2T>
inline iterator_range< inline iterator_range<
BOOST_STRING_TYPENAME range_result_iterator<Range1T>::type> BOOST_STRING_TYPENAME range_iterator<Range1T>::type>
find_last( find_last(
Range1T& Input, Range1T& Input,
const Range2T& Search) const Range2T& Search)
{ {
return last_finder(Search)( return ::boost::algorithm::find(Input, ::boost::algorithm::last_finder(Search));
begin(Input),end(Input));
} }
//! Find last algorithm ( case insensitive ) //! Find last algorithm ( case insensitive )
@ -156,26 +155,26 @@ namespace boost {
*/ */
template<typename Range1T, typename Range2T> template<typename Range1T, typename Range2T>
inline iterator_range< inline iterator_range<
BOOST_STRING_TYPENAME range_result_iterator<Range1T>::type> BOOST_STRING_TYPENAME range_iterator<Range1T>::type>
ifind_last( ifind_last(
Range1T& Input, Range1T& Input,
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 ::boost::algorithm::find(Input, ::boost::algorithm::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.
\param Search A substring to be searched for. \param Search A substring to be searched for.
\param Nth An index (zero-indexed) of the match to be found. \param Nth An index (zero-indexed) of the match to be found.
For negative N, the matches are counted from the end of string.
\return \return
An \c iterator_range delimiting the match. An \c iterator_range delimiting the match.
Returned iterator is either \c Range1T::iterator or Returned iterator is either \c Range1T::iterator or
@ -184,24 +183,24 @@ namespace boost {
*/ */
template<typename Range1T, typename Range2T> template<typename Range1T, typename Range2T>
inline iterator_range< inline iterator_range<
BOOST_STRING_TYPENAME range_result_iterator<Range1T>::type> BOOST_STRING_TYPENAME range_iterator<Range1T>::type>
find_nth( find_nth(
Range1T& Input, Range1T& Input,
const Range2T& Search, const Range2T& Search,
unsigned int Nth) int Nth)
{ {
return nth_finder(Search,Nth)( return ::boost::algorithm::find(Input, ::boost::algorithm::nth_finder(Search,Nth));
begin(Input),end(Input));
} }
//! Find n-th algorithm ( case insensitive ). //! Find n-th algorithm ( case insensitive ).
/*! /*!
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. Searching is case insensitive. input. Searching is case insensitive.
\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.
\param Nth An index (zero-indexed) of the match to be found. \param Nth An index (zero-indexed) of the match to be found.
For negative N, the matches are counted from the end of string.
\param Loc A locale used for case insensitive comparison \param Loc A locale used for case insensitive comparison
\return \return
An \c iterator_range delimiting the match. An \c iterator_range delimiting the match.
@ -214,15 +213,14 @@ namespace boost {
*/ */
template<typename Range1T, typename Range2T> template<typename Range1T, typename Range2T>
inline iterator_range< inline iterator_range<
BOOST_STRING_TYPENAME range_result_iterator<Range1T>::type> BOOST_STRING_TYPENAME range_iterator<Range1T>::type>
ifind_nth( ifind_nth(
Range1T& Input, Range1T& Input,
const Range2T& Search, const Range2T& Search,
unsigned 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 ::boost::algorithm::find(Input, ::boost::algorithm::nth_finder(Search,Nth,is_iequal(Loc)));
begin(Input),end(Input));
} }
// find_head ----------------------------------------------------------------------// // find_head ----------------------------------------------------------------------//
@ -235,6 +233,8 @@ namespace boost {
\param Input An input string \param Input An input string
\param N Length of the head \param N Length of the head
For N>=0, at most N characters are extracted.
For N<0, size(Input)-|N| characters are extracted.
\return \return
An \c iterator_range delimiting the match. An \c iterator_range delimiting the match.
Returned iterator is either \c Range1T::iterator or Returned iterator is either \c Range1T::iterator or
@ -245,13 +245,12 @@ namespace boost {
*/ */
template<typename RangeT> template<typename RangeT>
inline iterator_range< inline iterator_range<
BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
find_head( find_head(
RangeT& Input, RangeT& Input,
unsigned int N) int N)
{ {
return head_finder(N)( return ::boost::algorithm::find(Input, ::boost::algorithm::head_finder(N));
begin(Input),end(Input));
} }
// find_tail ----------------------------------------------------------------------// // find_tail ----------------------------------------------------------------------//
@ -263,7 +262,9 @@ namespace boost {
to be the tail. to be the tail.
\param Input An input string \param Input An input string
\param N Length of the tail \param N Length of the tail.
For N>=0, at most N characters are extracted.
For N<0, size(Input)-|N| characters are extracted.
\return \return
An \c iterator_range delimiting the match. An \c iterator_range delimiting the match.
Returned iterator is either \c RangeT::iterator or Returned iterator is either \c RangeT::iterator or
@ -275,13 +276,12 @@ namespace boost {
*/ */
template<typename RangeT> template<typename RangeT>
inline iterator_range< inline iterator_range<
BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
find_tail( find_tail(
RangeT& Input, RangeT& Input,
unsigned int N) int N)
{ {
return tail_finder(N)( return ::boost::algorithm::find(Input, ::boost::algorithm::tail_finder(N));
begin(Input),end(Input));
} }
// find_token --------------------------------------------------------------------// // find_token --------------------------------------------------------------------//
@ -305,14 +305,13 @@ namespace boost {
*/ */
template<typename RangeT, typename PredicateT> template<typename RangeT, typename PredicateT>
inline iterator_range< inline iterator_range<
BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
find_token( find_token(
RangeT& Input, RangeT& Input,
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 ::boost::algorithm::find(Input, ::boost::algorithm::token_finder(Pred, eCompress));
begin(Input),end(Input));
} }
} // namespace algorithm } // namespace algorithm

View File

@ -1,11 +1,12 @@
// Boost string_algo library find_format.hpp header file ---------------------------// // Boost string_algo library find_format.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_FIND_FORMAT_HPP #ifndef BOOST_STRING_FIND_FORMAT_HPP
#define BOOST_STRING_FIND_FORMAT_HPP #define BOOST_STRING_FIND_FORMAT_HPP
@ -16,6 +17,7 @@
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/const_iterator.hpp> #include <boost/range/const_iterator.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/algorithm/string/concept.hpp> #include <boost/algorithm/string/concept.hpp>
#include <boost/algorithm/string/detail/find_format.hpp> #include <boost/algorithm/string/detail/find_format.hpp>
@ -60,20 +62,24 @@ namespace boost {
FormatterT Formatter ) FormatterT Formatter )
{ {
// Concept check // Concept check
function_requires< BOOST_CONCEPT_ASSERT((
FinderConcept<FinderT, FinderConcept<
BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >(); FinderT,
function_requires< BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type>
));
BOOST_CONCEPT_ASSERT((
FormatterConcept< FormatterConcept<
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(::boost::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( ::boost::begin(lit_input), ::boost::end(lit_input) ) );
} }
//! Generic replace algorithm //! Generic replace algorithm
@ -90,19 +96,21 @@ namespace boost {
FormatterT Formatter ) FormatterT Formatter )
{ {
// Concept check // Concept check
function_requires< BOOST_CONCEPT_ASSERT((
FinderConcept<FinderT, FinderConcept<
BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >(); FinderT,
function_requires< BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
));
BOOST_CONCEPT_ASSERT((
FormatterConcept< FormatterConcept<
FormatterT, FormatterT,
FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >(); FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
));
return detail::find_format_copy_impl( return detail::find_format_copy_impl(
Input, Input,
Finder,
Formatter, Formatter,
Finder(begin(Input), end(Input))); Finder(::boost::begin(Input), ::boost::end(Input)));
} }
//! Generic replace algorithm //! Generic replace algorithm
@ -124,19 +132,21 @@ namespace boost {
FormatterT Formatter) FormatterT Formatter)
{ {
// Concept check // Concept check
function_requires< BOOST_CONCEPT_ASSERT((
FinderConcept<FinderT, FinderConcept<
BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >(); FinderT,
function_requires< BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
));
BOOST_CONCEPT_ASSERT((
FormatterConcept< FormatterConcept<
FormatterT, FormatterT,
FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >(); FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
));
detail::find_format_impl( detail::find_format_impl(
Input, Input,
Finder,
Formatter, Formatter,
Finder(begin(Input), end(Input))); Finder(::boost::begin(Input), ::boost::end(Input)));
} }
@ -171,20 +181,25 @@ namespace boost {
FormatterT Formatter) FormatterT Formatter)
{ {
// Concept check // Concept check
function_requires< BOOST_CONCEPT_ASSERT((
FinderConcept<FinderT, FinderConcept<
BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >(); FinderT,
function_requires< BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type>
));
BOOST_CONCEPT_ASSERT((
FormatterConcept< FormatterConcept<
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(::boost::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(::boost::begin(lit_input), ::boost::end(lit_input)));
} }
//! Generic replace all algorithm //! Generic replace all algorithm
@ -201,19 +216,22 @@ namespace boost {
FormatterT Formatter ) FormatterT Formatter )
{ {
// Concept check // Concept check
function_requires< BOOST_CONCEPT_ASSERT((
FinderConcept<FinderT, FinderConcept<
BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >(); FinderT,
function_requires< BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
));
BOOST_CONCEPT_ASSERT((
FormatterConcept< FormatterConcept<
FormatterT, FormatterT,
FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >(); FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
));
return detail::find_format_all_copy_impl( return detail::find_format_all_copy_impl(
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
@ -236,19 +254,22 @@ namespace boost {
FormatterT Formatter ) FormatterT Formatter )
{ {
// Concept check // Concept check
function_requires< BOOST_CONCEPT_ASSERT((
FinderConcept<FinderT, FinderConcept<
BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >(); FinderT,
function_requires< BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
));
BOOST_CONCEPT_ASSERT((
FormatterConcept< FormatterConcept<
FormatterT, FormatterT,
FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >(); FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
));
detail::find_format_all_impl( detail::find_format_all_impl(
Input, Input,
Finder, Finder,
Formatter, Formatter,
Finder(begin(Input), end(Input))); Finder(::boost::begin(Input), ::boost::end(Input)));
} }

View File

@ -1,10 +1,12 @@
// Boost string_algo library find_iterator.hpp header file ---------------------------// // Boost string_algo library find_iterator.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2004. Use, modification and // Copyright Pavol Droba 2002-2004.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// See http://www.boost.org for updates, documentation, and revision history. // http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_FIND_ITERATOR_HPP #ifndef BOOST_STRING_FIND_ITERATOR_HPP
#define BOOST_STRING_FIND_ITERATOR_HPP #define BOOST_STRING_FIND_ITERATOR_HPP
@ -16,12 +18,13 @@
#include <boost/range/iterator_range.hpp> #include <boost/range/iterator_range.hpp>
#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/iterator.hpp>
#include <boost/range/as_literal.hpp>
#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.
@ -55,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
@ -114,10 +111,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(::boost::as_literal(Col));
m_Match=::boost::make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col));
m_End=::boost::end(lit_col);
increment(); increment();
} }
@ -180,13 +179,13 @@ namespace boost {
*/ */
template<typename RangeT, typename FinderT> template<typename RangeT, typename FinderT>
inline find_iterator< inline find_iterator<
BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
make_find_iterator( make_find_iterator(
RangeT& Collection, RangeT& Collection,
FinderT Finder) FinderT Finder)
{ {
return find_iterator<BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type>( return find_iterator<BOOST_STRING_TYPENAME range_iterator<RangeT>::type>(
begin(Collection), end(Collection), Finder); Collection, Finder);
} }
// split iterator -----------------------------------------------// // split iterator -----------------------------------------------//
@ -215,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
@ -278,11 +271,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(::boost::as_literal(Col));
m_Match=make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col));
m_Next=::boost::begin(lit_col);
m_End=::boost::end(lit_col);
increment(); increment();
} }
@ -356,13 +351,13 @@ namespace boost {
*/ */
template<typename RangeT, typename FinderT> template<typename RangeT, typename FinderT>
inline split_iterator< inline split_iterator<
BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
make_split_iterator( make_split_iterator(
RangeT& Collection, RangeT& Collection,
FinderT Finder) FinderT Finder)
{ {
return split_iterator<BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type>( return split_iterator<BOOST_STRING_TYPENAME range_iterator<RangeT>::type>(
begin(Collection), end(Collection), Finder); Collection, Finder);
} }

View File

@ -1,11 +1,12 @@
// Boost string_algo library finder.hpp header file ---------------------------// // Boost string_algo library finder.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2006.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_FINDER_HPP #ifndef BOOST_STRING_FINDER_HPP
#define BOOST_STRING_FINDER_HPP #define BOOST_STRING_FINDER_HPP
@ -45,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>( ::boost::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>( ::boost::as_literal(Search), Comp );
} }
//! "Last" finder //! "Last" finder
@ -86,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>( ::boost::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>( ::boost::as_literal(Search), Comp ) ;
} }
//! "Nth" finder //! "Nth" finder
@ -126,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,
unsigned 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>( ::boost::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,
unsigned 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>( ::boost::as_literal(Search), Nth, Comp );
} }
//! "Head" finder //! "Head" finder
@ -172,7 +173,7 @@ namespace boost {
\return An instance of the \c head_finder object \return An instance of the \c head_finder object
*/ */
inline detail::head_finderF inline detail::head_finderF
head_finder( unsigned int N ) head_finder( int N )
{ {
return detail::head_finderF(N); return detail::head_finderF(N);
} }
@ -189,7 +190,7 @@ namespace boost {
\return An instance of the \c tail_finder object \return An instance of the \c tail_finder object
*/ */
inline detail::tail_finderF inline detail::tail_finderF
tail_finder( unsigned int N ) tail_finder( int N )
{ {
return detail::tail_finderF(N); return detail::tail_finderF(N);
} }

View File

@ -1,11 +1,12 @@
// Boost string_algo library formatter.hpp header file ---------------------------// // Boost string_algo library formatter.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_FORMATTER_HPP #ifndef BOOST_STRING_FORMATTER_HPP
#define BOOST_STRING_FORMATTER_HPP #define BOOST_STRING_FORMATTER_HPP
@ -13,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>
@ -41,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> >(::boost::as_literal(Format));
} }
//! Identity formatter //! Identity formatter
@ -55,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

@ -1,11 +1,12 @@
// Boost string_algo library iter_find.hpp header file ---------------------------// // Boost string_algo library iter_find.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_ITER_FIND_HPP #ifndef BOOST_STRING_ITER_FIND_HPP
#define BOOST_STRING_ITER_FIND_HPP #define BOOST_STRING_ITER_FIND_HPP
@ -18,8 +19,9 @@
#include <boost/range/iterator_range.hpp> #include <boost/range/iterator_range.hpp>
#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/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>
@ -72,30 +74,34 @@ namespace boost {
RangeT& Input, RangeT& Input,
FinderT Finder ) FinderT Finder )
{ {
function_requires< BOOST_CONCEPT_ASSERT((
FinderConcept<FinderT, FinderConcept<
BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> >(); FinderT,
BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
));
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_result_iterator<RangeT>::type input_iterator_type; range_iterator<RangeT>::type input_iterator_type;
typedef find_iterator<input_iterator_type> find_iterator_type; typedef find_iterator<input_iterator_type> find_iterator_type;
typedef detail::copy_iterator_rangeF< typedef detail::copy_iterator_rangeF<
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
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=::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( ::boost::make_transform_iterator(
find_iterator_type( begin(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=
make_transform_iterator( ::boost::make_transform_iterator(
find_iterator_type(), find_iterator_type(),
copy_range_type()); copy_range_type());
@ -139,30 +145,33 @@ namespace boost {
RangeT& Input, RangeT& Input,
FinderT Finder ) FinderT Finder )
{ {
function_requires< BOOST_CONCEPT_ASSERT((
FinderConcept<FinderT, FinderConcept<FinderT,
BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type> >(); BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
));
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
typedef BOOST_STRING_TYPENAME typedef BOOST_STRING_TYPENAME
range_result_iterator<RangeT>::type input_iterator_type; range_iterator<RangeT>::type input_iterator_type;
typedef split_iterator<input_iterator_type> find_iterator_type; typedef split_iterator<input_iterator_type> find_iterator_type;
typedef detail::copy_iterator_rangeF< typedef detail::copy_iterator_rangeF<
BOOST_STRING_TYPENAME BOOST_STRING_TYPENAME
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=::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( ::boost::make_transform_iterator(
find_iterator_type( begin(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=
make_transform_iterator( ::boost::make_transform_iterator(
find_iterator_type(), find_iterator_type(),
copy_range_type() ); copy_range_type() );

View File

@ -0,0 +1,145 @@
// Boost string_algo library join.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2006.
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_JOIN_HPP
#define BOOST_STRING_JOIN_HPP
#include <boost/algorithm/string/config.hpp>
#include <boost/algorithm/string/detail/sequence.hpp>
#include <boost/range/value_type.hpp>
#include <boost/range/as_literal.hpp>
/*! \file
Defines join algorithm.
Join algorithm is a counterpart to split algorithms.
It joins strings from a 'list' by adding user defined separator.
Additionally there is a version that allows simple filtering
by providing a predicate.
*/
namespace boost {
namespace algorithm {
// join --------------------------------------------------------------//
//! Join algorithm
/*!
This algorithm joins all strings in a 'list' into one long string.
Segments are concatenated by given separator.
\param Input A container that holds the input strings. It must be a container-of-containers.
\param Separator A string that will separate the joined segments.
\return Concatenated string.
\note This function provides the strong exception-safety guarantee
*/
template< typename SequenceSequenceT, typename Range1T>
inline typename range_value<SequenceSequenceT>::type
join(
const SequenceSequenceT& Input,
const Range1T& Separator)
{
// Define working types
typedef typename range_value<SequenceSequenceT>::type ResultT;
typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT;
// Parse input
InputIteratorT itBegin=::boost::begin(Input);
InputIteratorT itEnd=::boost::end(Input);
// Construct container to hold the result
ResultT Result;
// Append first element
if(itBegin!=itEnd)
{
detail::insert(Result, ::boost::end(Result), *itBegin);
++itBegin;
}
for(;itBegin!=itEnd; ++itBegin)
{
// Add separator
detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator));
// Add element
detail::insert(Result, ::boost::end(Result), *itBegin);
}
return Result;
}
// join_if ----------------------------------------------------------//
//! Conditional join algorithm
/*!
This algorithm joins all strings in a 'list' into one long string.
Segments are concatenated by given separator. Only segments that
satisfy the predicate will be added to the result.
\param Input A container that holds the input strings. It must be a container-of-containers.
\param Separator A string that will separate the joined segments.
\param Pred A segment selection predicate
\return Concatenated string.
\note This function provides the strong exception-safety guarantee
*/
template< typename SequenceSequenceT, typename Range1T, typename PredicateT>
inline typename range_value<SequenceSequenceT>::type
join_if(
const SequenceSequenceT& Input,
const Range1T& Separator,
PredicateT Pred)
{
// Define working types
typedef typename range_value<SequenceSequenceT>::type ResultT;
typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT;
// Parse input
InputIteratorT itBegin=::boost::begin(Input);
InputIteratorT itEnd=::boost::end(Input);
// Construct container to hold the result
ResultT Result;
// Roll to the first element that will be added
while(itBegin!=itEnd && !Pred(*itBegin)) ++itBegin;
// Add this element
if(itBegin!=itEnd)
{
detail::insert(Result, ::boost::end(Result), *itBegin);
++itBegin;
}
for(;itBegin!=itEnd; ++itBegin)
{
if(Pred(*itBegin))
{
// Add separator
detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator));
// Add element
detail::insert(Result, ::boost::end(Result), *itBegin);
}
}
return Result;
}
} // namespace algorithm
// pull names to the boost namespace
using algorithm::join;
using algorithm::join_if;
} // namespace boost
#endif // BOOST_STRING_JOIN_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library predicate.hpp header file ---------------------------// // Boost string_algo library predicate.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_PREDICATE_HPP #ifndef BOOST_STRING_PREDICATE_HPP
#define BOOST_STRING_PREDICATE_HPP #define BOOST_STRING_PREDICATE_HPP
@ -15,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>
@ -56,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(::boost::as_literal(Input));
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(::boost::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=::boost::end(lit_input);
Iterator2T TestEnd=end(Test); Iterator2T TestEnd=::boost::end(lit_test);
Iterator1T it=begin(Input); Iterator1T it=::boost::begin(lit_input);
Iterator2T pit=begin(Test); Iterator2T pit=::boost::begin(lit_test);
for(; for(;
it!=InputEnd && pit!=TestEnd; it!=InputEnd && pit!=TestEnd;
++it,++pit) ++it,++pit)
@ -86,7 +92,7 @@ namespace boost {
const Range1T& Input, const Range1T& Input,
const Range2T& Test) const Range2T& Test)
{ {
return starts_with(Input, Test, is_equal()); return ::boost::algorithm::starts_with(Input, Test, is_equal());
} }
//! 'Starts with' predicate ( case insensitive ) //! 'Starts with' predicate ( case insensitive )
@ -108,7 +114,7 @@ namespace boost {
const Range2T& Test, const Range2T& Test,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
return starts_with(Input, Test, is_iequal(Loc)); return ::boost::algorithm::starts_with(Input, Test, is_iequal(Loc));
} }
@ -135,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(::boost::as_literal(Input));
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(::boost::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::
@ -142,10 +151,10 @@ namespace boost {
return detail:: return detail::
ends_with_iter_select( ends_with_iter_select(
begin(Input), ::boost::begin(lit_input),
end(Input), ::boost::end(lit_input),
begin(Test), ::boost::begin(lit_test),
end(Test), ::boost::end(lit_test),
Comp, Comp,
category()); category());
} }
@ -160,7 +169,7 @@ namespace boost {
const Range1T& Input, const Range1T& Input,
const Range2T& Test) const Range2T& Test)
{ {
return ends_with(Input, Test, is_equal()); return ::boost::algorithm::ends_with(Input, Test, is_equal());
} }
//! 'Ends with' predicate ( case insensitive ) //! 'Ends with' predicate ( case insensitive )
@ -182,7 +191,7 @@ namespace boost {
const Range2T& Test, const Range2T& Test,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
return ends_with(Input, Test, is_iequal(Loc)); return ::boost::algorithm::ends_with(Input, Test, is_iequal(Loc));
} }
// contains predicate -----------------------------------------------// // contains predicate -----------------------------------------------//
@ -206,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(::boost::as_literal(Input));
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(::boost::as_literal(Test));
if (::boost::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=(::boost::algorithm::first_finder(lit_test,Comp)(::boost::begin(lit_input), ::boost::end(lit_input)));
return bResult; return bResult;
} }
@ -226,7 +238,7 @@ namespace boost {
const Range1T& Input, const Range1T& Input,
const Range2T& Test) const Range2T& Test)
{ {
return contains(Input, Test, is_equal()); return ::boost::algorithm::contains(Input, Test, is_equal());
} }
//! 'Contains' predicate ( case insensitive ) //! 'Contains' predicate ( case insensitive )
@ -247,7 +259,7 @@ namespace boost {
const Range2T& Test, const Range2T& Test,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
return contains(Input, Test, is_iequal(Loc)); return ::boost::algorithm::contains(Input, Test, is_iequal(Loc));
} }
// equals predicate -----------------------------------------------// // equals predicate -----------------------------------------------//
@ -274,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(::boost::as_literal(Input));
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(::boost::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=::boost::end(lit_input);
Iterator2T TestEnd=end(Test); Iterator2T TestEnd=::boost::end(lit_test);
Iterator1T it=begin(Input); Iterator1T it=::boost::begin(lit_input);
Iterator2T pit=begin(Test); Iterator2T pit=::boost::begin(lit_test);
for(; for(;
it!=InputEnd && pit!=TestEnd; it!=InputEnd && pit!=TestEnd;
++it,++pit) ++it,++pit)
@ -304,10 +319,10 @@ namespace boost {
const Range1T& Input, const Range1T& Input,
const Range2T& Test) const Range2T& Test)
{ {
return equals(Input, Test, is_equal()); return ::boost::algorithm::equals(Input, Test, is_equal());
} }
//! 'Equals' predicate ( casa insensitive ) //! 'Equals' predicate ( case insensitive )
/*! /*!
This predicate holds when the test container is equal to the This predicate holds when the test container is equal to the
input container i.e. all elements in both containers are same. input container i.e. all elements in both containers are same.
@ -328,9 +343,84 @@ namespace boost {
const Range2T& Test, const Range2T& Test,
const std::locale& Loc=std::locale()) const std::locale& Loc=std::locale())
{ {
return equals(Input, Test, is_iequal(Loc)); return ::boost::algorithm::equals(Input, Test, is_iequal(Loc));
} }
// lexicographical_compare predicate -----------------------------//
//! Lexicographical compare predicate
/*!
This predicate is an overload of std::lexicographical_compare
for range arguments
It check whether the first argument is lexicographically less
then the second one.
If the optional predicate is specified, it is used for character-wise
comparison
\param Arg1 First argument
\param Arg2 Second argument
\param Pred Comparison predicate
\return The result of the test
\note This function provides the strong exception-safety guarantee
*/
template<typename Range1T, typename Range2T, typename PredicateT>
inline bool lexicographical_compare(
const Range1T& Arg1,
const Range2T& Arg2,
PredicateT Pred)
{
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_arg1(::boost::as_literal(Arg1));
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_arg2(::boost::as_literal(Arg2));
return std::lexicographical_compare(
::boost::begin(lit_arg1),
::boost::end(lit_arg1),
::boost::begin(lit_arg2),
::boost::end(lit_arg2),
Pred);
}
//! Lexicographical compare predicate
/*!
\overload
*/
template<typename Range1T, typename Range2T>
inline bool lexicographical_compare(
const Range1T& Arg1,
const Range2T& Arg2)
{
return ::boost::algorithm::lexicographical_compare(Arg1, Arg2, is_less());
}
//! Lexicographical compare predicate (case-insensitive)
/*!
This predicate is an overload of std::lexicographical_compare
for range arguments.
It check whether the first argument is lexicographically less
then the second one.
Elements are compared case insensitively
\param Arg1 First argument
\param Arg2 Second argument
\param Loc A locale used for case insensitive comparison
\return The result of the test
\note This function provides the strong exception-safety guarantee
*/
template<typename Range1T, typename Range2T>
inline bool ilexicographical_compare(
const Range1T& Arg1,
const Range2T& Arg2,
const std::locale& Loc=std::locale())
{
return ::boost::algorithm::lexicographical_compare(Arg1, Arg2, is_iless(Loc));
}
// all predicate -----------------------------------------------// // all predicate -----------------------------------------------//
//! 'All' predicate //! 'All' predicate
@ -349,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(::boost::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=::boost::end(lit_input);
for( Iterator1T It=begin(Input); It!=InputEnd; ++It) for( Iterator1T It=::boost::begin(lit_input); It!=InputEnd; ++It)
{ {
if (!Pred(*It)) if (!Pred(*It))
return false; return false;
@ -374,6 +466,8 @@ namespace boost {
using algorithm::equals; using algorithm::equals;
using algorithm::iequals; using algorithm::iequals;
using algorithm::all; using algorithm::all;
using algorithm::lexicographical_compare;
using algorithm::ilexicographical_compare;
} // namespace boost } // namespace boost

View File

@ -1,11 +1,12 @@
// Boost string_algo library predicate_facade.hpp header file ---------------------------// // Boost string_algo library predicate_facade.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_PREDICATE_FACADE_HPP #ifndef BOOST_STRING_PREDICATE_FACADE_HPP
#define BOOST_STRING_PREDICATE_FACADE_HPP #define BOOST_STRING_PREDICATE_FACADE_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library regex.hpp header file ---------------------------// // Boost string_algo library regex.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_REGEX_HPP #ifndef BOOST_STRING_REGEX_HPP
#define BOOST_STRING_REGEX_HPP #define BOOST_STRING_REGEX_HPP
@ -16,7 +17,8 @@
#include <boost/range/iterator_range.hpp> #include <boost/range/iterator_range.hpp>
#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/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>
@ -52,14 +54,16 @@ namespace boost {
typename CharT, typename CharT,
typename RegexTraitsT> typename RegexTraitsT>
inline iterator_range< inline iterator_range<
BOOST_STRING_TYPENAME range_result_iterator<RangeT>::type > BOOST_STRING_TYPENAME range_iterator<RangeT>::type >
find_regex( find_regex(
RangeT& Input, RangeT& Input,
const basic_regex<CharT, RegexTraitsT>& Rx, const basic_regex<CharT, RegexTraitsT>& Rx,
match_flag_type Flags=match_default ) match_flag_type Flags=match_default )
{ {
return regex_finder(Rx,Flags)( iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
begin(Input), end(Input) );
return ::boost::algorithm::regex_finder(Rx,Flags)(
::boost::begin(lit_input), ::boost::end(lit_input) );
} }
// replace_regex --------------------------------------------------------------------// // replace_regex --------------------------------------------------------------------//
@ -94,11 +98,11 @@ namespace boost {
const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format, const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
match_flag_type Flags=match_default | format_default ) match_flag_type Flags=match_default | format_default )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
regex_finder( Rx, Flags ), ::boost::algorithm::regex_finder( Rx, Flags ),
regex_formatter( Format, Flags ) ); ::boost::algorithm::regex_formatter( Format, Flags ) );
} }
//! Replace regex algorithm //! Replace regex algorithm
@ -116,10 +120,10 @@ namespace boost {
const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format, const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
match_flag_type Flags=match_default | format_default ) match_flag_type Flags=match_default | format_default )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
regex_finder( Rx, Flags ), ::boost::algorithm::regex_finder( Rx, Flags ),
regex_formatter( Format, Flags ) ); ::boost::algorithm::regex_formatter( Format, Flags ) );
} }
//! Replace regex algorithm //! Replace regex algorithm
@ -143,10 +147,10 @@ namespace boost {
const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format, const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
match_flag_type Flags=match_default | format_default ) match_flag_type Flags=match_default | format_default )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
regex_finder( Rx, Flags ), ::boost::algorithm::regex_finder( Rx, Flags ),
regex_formatter( Format, Flags ) ); ::boost::algorithm::regex_formatter( Format, Flags ) );
} }
// replace_all_regex --------------------------------------------------------------------// // replace_all_regex --------------------------------------------------------------------//
@ -180,11 +184,11 @@ namespace boost {
const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format, const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
match_flag_type Flags=match_default | format_default ) match_flag_type Flags=match_default | format_default )
{ {
return find_format_all_copy( return ::boost::algorithm::find_format_all_copy(
Output, Output,
Input, Input,
regex_finder( Rx, Flags ), ::boost::algorithm::regex_finder( Rx, Flags ),
regex_formatter( Format, Flags ) ); ::boost::algorithm::regex_formatter( Format, Flags ) );
} }
//! Replace all regex algorithm //! Replace all regex algorithm
@ -202,10 +206,10 @@ namespace boost {
const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format, const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
match_flag_type Flags=match_default | format_default ) match_flag_type Flags=match_default | format_default )
{ {
return find_format_all_copy( return ::boost::algorithm::find_format_all_copy(
Input, Input,
regex_finder( Rx, Flags ), ::boost::algorithm::regex_finder( Rx, Flags ),
regex_formatter( Format, Flags ) ); ::boost::algorithm::regex_formatter( Format, Flags ) );
} }
//! Replace all regex algorithm //! Replace all regex algorithm
@ -229,10 +233,10 @@ namespace boost {
const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format, const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
match_flag_type Flags=match_default | format_default ) match_flag_type Flags=match_default | format_default )
{ {
find_format_all( ::boost::algorithm::find_format_all(
Input, Input,
regex_finder( Rx, Flags ), ::boost::algorithm::regex_finder( Rx, Flags ),
regex_formatter( Format, Flags ) ); ::boost::algorithm::regex_formatter( Format, Flags ) );
} }
// erase_regex --------------------------------------------------------------------// // erase_regex --------------------------------------------------------------------//
@ -263,11 +267,11 @@ 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 )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
regex_finder( Rx, Flags ), ::boost::algorithm::regex_finder( Rx, Flags ),
empty_formatter( Input ) ); ::boost::algorithm::empty_formatter( Input ) );
} }
//! Erase regex algorithm //! Erase regex algorithm
@ -283,10 +287,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 )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
regex_finder( Rx, Flags ), ::boost::algorithm::regex_finder( Rx, Flags ),
empty_formatter( Input ) ); ::boost::algorithm::empty_formatter( Input ) );
} }
//! Erase regex algorithm //! Erase regex algorithm
@ -307,10 +311,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 )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
regex_finder( Rx, Flags ), ::boost::algorithm::regex_finder( Rx, Flags ),
empty_formatter( Input ) ); ::boost::algorithm::empty_formatter( Input ) );
} }
// erase_all_regex --------------------------------------------------------------------// // erase_all_regex --------------------------------------------------------------------//
@ -342,11 +346,11 @@ 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 )
{ {
return find_format_all_copy( return ::boost::algorithm::find_format_all_copy(
Output, Output,
Input, Input,
regex_finder( Rx, Flags ), ::boost::algorithm::regex_finder( Rx, Flags ),
empty_formatter( Input ) ); ::boost::algorithm::empty_formatter( Input ) );
} }
//! Erase all regex algorithm //! Erase all regex algorithm
@ -362,10 +366,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 )
{ {
return find_format_all_copy( return ::boost::algorithm::find_format_all_copy(
Input, Input,
regex_finder( Rx, Flags ), ::boost::algorithm::regex_finder( Rx, Flags ),
empty_formatter( Input ) ); ::boost::algorithm::empty_formatter( Input ) );
} }
//! Erase all regex algorithm //! Erase all regex algorithm
@ -386,10 +390,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 )
{ {
find_format_all( ::boost::algorithm::find_format_all(
Input, Input,
regex_finder( Rx, Flags ), ::boost::algorithm::regex_finder( Rx, Flags ),
empty_formatter( Input ) ); ::boost::algorithm::empty_formatter( Input ) );
} }
// find_all_regex ------------------------------------------------------------------// // find_all_regex ------------------------------------------------------------------//
@ -427,10 +431,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 )
{ {
return iter_find( return ::boost::algorithm::iter_find(
Result, Result,
Input, Input,
regex_finder(Rx,Flags) ); ::boost::algorithm::regex_finder(Rx,Flags) );
} }
// split_regex ------------------------------------------------------------------// // split_regex ------------------------------------------------------------------//
@ -468,12 +472,153 @@ 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 )
{ {
return iter_split( return ::boost::algorithm::iter_split(
Result, Result,
Input, Input,
regex_finder(Rx,Flags) ); ::boost::algorithm::regex_finder(Rx,Flags) );
} }
// join_if ------------------------------------------------------------------//
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
//! Conditional join algorithm
/*!
This algorithm joins all strings in a 'list' into one long string.
Segments are concatenated by given separator. Only segments that
match the given regular expression will be added to the result
This is a specialization of join_if algorithm.
\param Input A container that holds the input strings. It must be a container-of-containers.
\param Separator A string that will separate the joined segments.
\param Rx A regular expression
\param Flags Regex options
\return Concatenated string.
\note This function provides the strong exception-safety guarantee
*/
template<
typename SequenceSequenceT,
typename Range1T,
typename CharT,
typename RegexTraitsT >
inline typename range_value<SequenceSequenceT>::type
join_if(
const SequenceSequenceT& Input,
const Range1T& Separator,
const basic_regex<CharT, RegexTraitsT>& Rx,
match_flag_type Flags=match_default )
{
// Define working types
typedef typename range_value<SequenceSequenceT>::type ResultT;
typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT;
// Parse input
InputIteratorT itBegin=::boost::begin(Input);
InputIteratorT itEnd=::boost::end(Input);
// Construct container to hold the result
ResultT Result;
// Roll to the first element that will be added
while(
itBegin!=itEnd &&
!::boost::regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin;
// Add this element
if(itBegin!=itEnd)
{
detail::insert(Result, ::boost::end(Result), *itBegin);
++itBegin;
}
for(;itBegin!=itEnd; ++itBegin)
{
if(::boost::regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags))
{
// Add separator
detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator));
// Add element
detail::insert(Result, ::boost::end(Result), *itBegin);
}
}
return Result;
}
#else // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
//! Conditional join algorithm
/*!
This algorithm joins all strings in a 'list' into one long string.
Segments are concatenated by given separator. Only segments that
match the given regular expression will be added to the result
This is a specialization of join_if algorithm.
\param Input A container that holds the input strings. It must be a container-of-containers.
\param Separator A string that will separate the joined segments.
\param Rx A regular expression
\param Flags Regex options
\return Concatenated string.
\note This function provides the strong exception-safety guarantee
*/
template<
typename SequenceSequenceT,
typename Range1T,
typename CharT,
typename RegexTraitsT >
inline typename range_value<SequenceSequenceT>::type
join_if_regex(
const SequenceSequenceT& Input,
const Range1T& Separator,
const basic_regex<CharT, RegexTraitsT>& Rx,
match_flag_type Flags=match_default )
{
// Define working types
typedef typename range_value<SequenceSequenceT>::type ResultT;
typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT;
// Parse input
InputIteratorT itBegin=::boost::begin(Input);
InputIteratorT itEnd=::boost::end(Input);
// Construct container to hold the result
ResultT Result;
// Roll to the first element that will be added
while(
itBegin!=itEnd &&
!::boost::regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin;
// Add this element
if(itBegin!=itEnd)
{
detail::insert(Result, ::boost::end(Result), *itBegin);
++itBegin;
}
for(;itBegin!=itEnd; ++itBegin)
{
if(::boost::regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags))
{
// Add separator
detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator));
// Add element
detail::insert(Result, ::boost::end(Result), *itBegin);
}
}
return Result;
}
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
} // namespace algorithm } // namespace algorithm
// pull names into the boost namespace // pull names into the boost namespace
@ -489,6 +634,12 @@ namespace boost {
using algorithm::find_all_regex; using algorithm::find_all_regex;
using algorithm::split_regex; using algorithm::split_regex;
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
using algorithm::join_if;
#else // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
using algorithm::join_if_regex;
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
} // namespace boost } // namespace boost

View File

@ -1,11 +1,12 @@
// Boost string_algo library regex_find_format.hpp header file ---------------------------// // Boost string_algo library regex_find_format.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_REGEX_FIND_FORMAT_HPP #ifndef BOOST_STRING_REGEX_FIND_FORMAT_HPP
#define BOOST_STRING_REGEX_FIND_FORMAT_HPP #define BOOST_STRING_REGEX_FIND_FORMAT_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library replace.hpp header file ---------------------------// // Boost string_algo library replace.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2006.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_REPLACE_HPP #ifndef BOOST_STRING_REPLACE_HPP
#define BOOST_STRING_REPLACE_HPP #define BOOST_STRING_REPLACE_HPP
@ -60,11 +61,11 @@ namespace boost {
range_const_iterator<Range1T>::type>& SearchRange, range_const_iterator<Range1T>::type>& SearchRange,
const Range2T& Format) const Range2T& Format)
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
range_finder(SearchRange), ::boost::algorithm::range_finder(SearchRange),
const_formatter(Format)); ::boost::algorithm::const_formatter(Format));
} }
//! Replace range algorithm //! Replace range algorithm
@ -79,10 +80,10 @@ namespace boost {
range_const_iterator<SequenceT>::type>& SearchRange, range_const_iterator<SequenceT>::type>& SearchRange,
const RangeT& Format) const RangeT& Format)
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
range_finder(SearchRange), ::boost::algorithm::range_finder(SearchRange),
const_formatter(Format)); ::boost::algorithm::const_formatter(Format));
} }
//! Replace range algorithm //! Replace range algorithm
@ -102,10 +103,10 @@ namespace boost {
range_iterator<SequenceT>::type>& SearchRange, range_iterator<SequenceT>::type>& SearchRange,
const RangeT& Format) const RangeT& Format)
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
range_finder(SearchRange), ::boost::algorithm::range_finder(SearchRange),
const_formatter(Format)); ::boost::algorithm::const_formatter(Format));
} }
// replace_first --------------------------------------------------------------------// // replace_first --------------------------------------------------------------------//
@ -137,11 +138,11 @@ namespace boost {
const Range2T& Search, const Range2T& Search,
const Range3T& Format) const Range3T& Format)
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
first_finder(Search), ::boost::algorithm::first_finder(Search),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace first algorithm //! Replace first algorithm
@ -154,10 +155,10 @@ namespace boost {
const Range1T& Search, const Range1T& Search,
const Range2T& Format ) const Range2T& Format )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
first_finder(Search), ::boost::algorithm::first_finder(Search),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace first algorithm //! Replace first algorithm
@ -175,10 +176,10 @@ namespace boost {
const Range1T& Search, const Range1T& Search,
const Range2T& Format ) const Range2T& Format )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
first_finder(Search), ::boost::algorithm::first_finder(Search),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
// replace_first ( case insensitive ) ---------------------------------------------// // replace_first ( case insensitive ) ---------------------------------------------//
@ -213,11 +214,11 @@ namespace boost {
const Range3T& Format, const Range3T& Format,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
first_finder(Search, is_iequal(Loc)), ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace first algorithm ( case insensitive ) //! Replace first algorithm ( case insensitive )
@ -231,10 +232,10 @@ namespace boost {
const Range1T& Format, const Range1T& Format,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
first_finder(Search, is_iequal(Loc)), ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace first algorithm ( case insensitive ) //! Replace first algorithm ( case insensitive )
@ -255,10 +256,10 @@ namespace boost {
const Range2T& Format, const Range2T& Format,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
first_finder(Search, is_iequal(Loc)), ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
// replace_last --------------------------------------------------------------------// // replace_last --------------------------------------------------------------------//
@ -290,11 +291,11 @@ namespace boost {
const Range2T& Search, const Range2T& Search,
const Range3T& Format ) const Range3T& Format )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
last_finder(Search), ::boost::algorithm::last_finder(Search),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace last algorithm //! Replace last algorithm
@ -307,10 +308,10 @@ namespace boost {
const Range1T& Search, const Range1T& Search,
const Range2T& Format ) const Range2T& Format )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
last_finder(Search), ::boost::algorithm::last_finder(Search),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace last algorithm //! Replace last algorithm
@ -328,10 +329,10 @@ namespace boost {
const Range1T& Search, const Range1T& Search,
const Range2T& Format ) const Range2T& Format )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
last_finder(Search), ::boost::algorithm::last_finder(Search),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
// replace_last ( case insensitive ) -----------------------------------------------// // replace_last ( case insensitive ) -----------------------------------------------//
@ -366,11 +367,11 @@ namespace boost {
const Range3T& Format, const Range3T& Format,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
last_finder(Search, is_iequal(Loc)), ::boost::algorithm::last_finder(Search, is_iequal(Loc)),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace last algorithm ( case insensitive ) //! Replace last algorithm ( case insensitive )
@ -384,10 +385,10 @@ namespace boost {
const Range2T& Format, const Range2T& Format,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
last_finder(Search, is_iequal(Loc)), ::boost::algorithm::last_finder(Search, is_iequal(Loc)),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace last algorithm ( case insensitive ) //! Replace last algorithm ( case insensitive )
@ -409,10 +410,10 @@ namespace boost {
const Range2T& Format, const Range2T& Format,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
last_finder(Search, is_iequal(Loc)), ::boost::algorithm::last_finder(Search, is_iequal(Loc)),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
// replace_nth --------------------------------------------------------------------// // replace_nth --------------------------------------------------------------------//
@ -428,6 +429,7 @@ namespace boost {
\param Input An input string \param Input An input string
\param Search A substring to be searched for \param Search A substring to be searched for
\param Nth An index of the match to be replaced. The index is 0-based. \param Nth An index of the match to be replaced. The index is 0-based.
For negative N, matches are counted from the end of string.
\param Format A substitute string \param Format A substitute string
\return An output iterator pointing just after the last inserted character or \return An output iterator pointing just after the last inserted character or
a modified copy of the input a modified copy of the input
@ -443,14 +445,14 @@ namespace boost {
OutputIteratorT Output, OutputIteratorT Output,
const Range1T& Input, const Range1T& Input,
const Range2T& Search, const Range2T& Search,
unsigned int Nth, int Nth,
const Range3T& Format ) const Range3T& Format )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
nth_finder(Search, Nth), ::boost::algorithm::nth_finder(Search, Nth),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace nth algorithm //! Replace nth algorithm
@ -461,13 +463,13 @@ namespace boost {
inline SequenceT replace_nth_copy( inline SequenceT replace_nth_copy(
const SequenceT& Input, const SequenceT& Input,
const Range1T& Search, const Range1T& Search,
unsigned int Nth, int Nth,
const Range2T& Format ) const Range2T& Format )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
nth_finder(Search, Nth), ::boost::algorithm::nth_finder(Search, Nth),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace nth algorithm //! Replace nth algorithm
@ -478,19 +480,20 @@ namespace boost {
\param Input An input string \param Input An input string
\param Search A substring to be searched for \param Search A substring to be searched for
\param Nth An index of the match to be replaced. The index is 0-based. \param Nth An index of the match to be replaced. The index is 0-based.
For negative N, matches are counted from the end of string.
\param Format A substitute string \param Format A substitute string
*/ */
template<typename SequenceT, typename Range1T, typename Range2T> template<typename SequenceT, typename Range1T, typename Range2T>
inline void replace_nth( inline void replace_nth(
SequenceT& Input, SequenceT& Input,
const Range1T& Search, const Range1T& Search,
unsigned int Nth, int Nth,
const Range2T& Format ) const Range2T& Format )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
nth_finder(Search, Nth), ::boost::algorithm::nth_finder(Search, Nth),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
// replace_nth ( case insensitive ) -----------------------------------------------// // replace_nth ( case insensitive ) -----------------------------------------------//
@ -507,6 +510,7 @@ namespace boost {
\param Input An input string \param Input An input string
\param Search A substring to be searched for \param Search A substring to be searched for
\param Nth An index of the match to be replaced. The index is 0-based. \param Nth An index of the match to be replaced. The index is 0-based.
For negative N, matches are counted from the end of string.
\param Format A substitute string \param Format A substitute string
\param Loc A locale used for case insensitive comparison \param Loc A locale used for case insensitive comparison
\return An output iterator pointing just after the last inserted character or \return An output iterator pointing just after the last inserted character or
@ -523,15 +527,15 @@ namespace boost {
OutputIteratorT Output, OutputIteratorT Output,
const Range1T& Input, const Range1T& Input,
const Range2T& Search, const Range2T& Search,
unsigned int Nth, int Nth,
const Range3T& Format, const Range3T& Format,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
nth_finder(Search, Nth, is_iequal(Loc) ), ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc) ),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace nth algorithm ( case insensitive ) //! Replace nth algorithm ( case insensitive )
@ -542,14 +546,14 @@ namespace boost {
inline SequenceT ireplace_nth_copy( inline SequenceT ireplace_nth_copy(
const SequenceT& Input, const SequenceT& Input,
const Range1T& Search, const Range1T& Search,
unsigned int Nth, int Nth,
const Range2T& Format, const Range2T& Format,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
nth_finder(Search, Nth, is_iequal(Loc)), ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace nth algorithm ( case insensitive ) //! Replace nth algorithm ( case insensitive )
@ -561,6 +565,7 @@ namespace boost {
\param Input An input string \param Input An input string
\param Search A substring to be searched for \param Search A substring to be searched for
\param Nth An index of the match to be replaced. The index is 0-based. \param Nth An index of the match to be replaced. The index is 0-based.
For negative N, matches are counted from the end of string.
\param Format A substitute string \param Format A substitute string
\param Loc A locale used for case insensitive comparison \param Loc A locale used for case insensitive comparison
*/ */
@ -568,14 +573,14 @@ namespace boost {
inline void ireplace_nth( inline void ireplace_nth(
SequenceT& Input, SequenceT& Input,
const Range1T& Search, const Range1T& Search,
unsigned int Nth, int Nth,
const Range2T& Format, const Range2T& Format,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
nth_finder(Search, Nth, is_iequal(Loc)), ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
// replace_all --------------------------------------------------------------------// // replace_all --------------------------------------------------------------------//
@ -607,11 +612,11 @@ namespace boost {
const Range2T& Search, const Range2T& Search,
const Range3T& Format ) const Range3T& Format )
{ {
return find_format_all_copy( return ::boost::algorithm::find_format_all_copy(
Output, Output,
Input, Input,
first_finder(Search), ::boost::algorithm::first_finder(Search),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace all algorithm //! Replace all algorithm
@ -624,10 +629,10 @@ namespace boost {
const Range1T& Search, const Range1T& Search,
const Range2T& Format ) const Range2T& Format )
{ {
return find_format_all_copy( return ::boost::algorithm::find_format_all_copy(
Input, Input,
first_finder(Search), ::boost::algorithm::first_finder(Search),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace all algorithm //! Replace all algorithm
@ -646,10 +651,10 @@ namespace boost {
const Range1T& Search, const Range1T& Search,
const Range2T& Format ) const Range2T& Format )
{ {
find_format_all( ::boost::algorithm::find_format_all(
Input, Input,
first_finder(Search), ::boost::algorithm::first_finder(Search),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
// replace_all ( case insensitive ) -----------------------------------------------// // replace_all ( case insensitive ) -----------------------------------------------//
@ -684,11 +689,11 @@ namespace boost {
const Range3T& Format, const Range3T& Format,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_all_copy( return ::boost::algorithm::find_format_all_copy(
Output, Output,
Input, Input,
first_finder(Search, is_iequal(Loc)), ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace all algorithm ( case insensitive ) //! Replace all algorithm ( case insensitive )
@ -702,10 +707,10 @@ namespace boost {
const Range2T& Format, const Range2T& Format,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return find_format_all_copy( return ::boost::algorithm::find_format_all_copy(
Input, Input,
first_finder(Search, is_iequal(Loc)), ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace all algorithm ( case insensitive ) //! Replace all algorithm ( case insensitive )
@ -726,10 +731,10 @@ namespace boost {
const Range2T& Format, const Range2T& Format,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
find_format_all( ::boost::algorithm::find_format_all(
Input, Input,
first_finder(Search, is_iequal(Loc)), ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
// replace_head --------------------------------------------------------------------// // replace_head --------------------------------------------------------------------//
@ -745,7 +750,9 @@ namespace boost {
\param Output An output iterator to which the result will be copied \param Output An output iterator to which the result will be copied
\param Input An input string \param Input An input string
\param N Length of the head \param N Length of the head.
For N>=0, at most N characters are extracted.
For N<0, size(Input)-|N| characters are extracted.
\param Format A substitute string \param Format A substitute string
\return An output iterator pointing just after the last inserted character or \return An output iterator pointing just after the last inserted character or
a modified copy of the input a modified copy of the input
@ -759,14 +766,14 @@ namespace boost {
inline OutputIteratorT replace_head_copy( inline OutputIteratorT replace_head_copy(
OutputIteratorT Output, OutputIteratorT Output,
const Range1T& Input, const Range1T& Input,
unsigned int N, int N,
const Range2T& Format ) const Range2T& Format )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
head_finder(N), ::boost::algorithm::head_finder(N),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace head algorithm //! Replace head algorithm
@ -776,13 +783,13 @@ namespace boost {
template<typename SequenceT, typename RangeT> template<typename SequenceT, typename RangeT>
inline SequenceT replace_head_copy( inline SequenceT replace_head_copy(
const SequenceT& Input, const SequenceT& Input,
unsigned int N, int N,
const RangeT& Format ) const RangeT& Format )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
head_finder(N), ::boost::algorithm::head_finder(N),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace head algorithm //! Replace head algorithm
@ -793,19 +800,21 @@ namespace boost {
considered to be the head. The input sequence is modified in-place. considered to be the head. The input sequence is modified in-place.
\param Input An input string \param Input An input string
\param N Length of the head \param N Length of the head.
For N>=0, at most N characters are extracted.
For N<0, size(Input)-|N| characters are extracted.
\param Format A substitute string \param Format A substitute string
*/ */
template<typename SequenceT, typename RangeT> template<typename SequenceT, typename RangeT>
inline void replace_head( inline void replace_head(
SequenceT& Input, SequenceT& Input,
unsigned int N, int N,
const RangeT& Format ) const RangeT& Format )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
head_finder(N), ::boost::algorithm::head_finder(N),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
// replace_tail --------------------------------------------------------------------// // replace_tail --------------------------------------------------------------------//
@ -821,7 +830,9 @@ namespace boost {
\param Output An output iterator to which the result will be copied \param Output An output iterator to which the result will be copied
\param Input An input string \param Input An input string
\param N Length of the tail \param N Length of the tail.
For N>=0, at most N characters are extracted.
For N<0, size(Input)-|N| characters are extracted.
\param Format A substitute string \param Format A substitute string
\return An output iterator pointing just after the last inserted character or \return An output iterator pointing just after the last inserted character or
a modified copy of the input a modified copy of the input
@ -835,14 +846,14 @@ namespace boost {
inline OutputIteratorT replace_tail_copy( inline OutputIteratorT replace_tail_copy(
OutputIteratorT Output, OutputIteratorT Output,
const Range1T& Input, const Range1T& Input,
unsigned int N, int N,
const Range2T& Format ) const Range2T& Format )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Output, Output,
Input, Input,
tail_finder(N), ::boost::algorithm::tail_finder(N),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace tail algorithm //! Replace tail algorithm
@ -852,13 +863,13 @@ namespace boost {
template<typename SequenceT, typename RangeT> template<typename SequenceT, typename RangeT>
inline SequenceT replace_tail_copy( inline SequenceT replace_tail_copy(
const SequenceT& Input, const SequenceT& Input,
unsigned int N, int N,
const RangeT& Format ) const RangeT& Format )
{ {
return find_format_copy( return ::boost::algorithm::find_format_copy(
Input, Input,
tail_finder(N), ::boost::algorithm::tail_finder(N),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
//! Replace tail algorithm //! Replace tail algorithm
@ -869,19 +880,21 @@ namespace boost {
considered to be the tail. The input sequence is modified in-place. considered to be the tail. The input sequence is modified in-place.
\param Input An input string \param Input An input string
\param N Length of the tail \param N Length of the tail.
For N>=0, at most N characters are extracted.
For N<0, size(Input)-|N| characters are extracted.
\param Format A substitute string \param Format A substitute string
*/ */
template<typename SequenceT, typename RangeT> template<typename SequenceT, typename RangeT>
inline void replace_tail( inline void replace_tail(
SequenceT& Input, SequenceT& Input,
unsigned int N, int N,
const RangeT& Format ) const RangeT& Format )
{ {
find_format( ::boost::algorithm::find_format(
Input, Input,
tail_finder(N), ::boost::algorithm::tail_finder(N),
const_formatter(Format) ); ::boost::algorithm::const_formatter(Format) );
} }
} // namespace algorithm } // namespace algorithm

View File

@ -1,11 +1,12 @@
// Boost string_algo library sequence_traits.hpp header file ---------------------------// // Boost string_algo library sequence_traits.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_SEQUENCE_TRAITS_HPP #ifndef BOOST_STRING_SEQUENCE_TRAITS_HPP
#define BOOST_STRING_SEQUENCE_TRAITS_HPP #define BOOST_STRING_SEQUENCE_TRAITS_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library find.hpp header file ---------------------------// // Boost string_algo library split.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2006.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_SPLIT_HPP #ifndef BOOST_STRING_SPLIT_HPP
#define BOOST_STRING_SPLIT_HPP #define BOOST_STRING_SPLIT_HPP
@ -55,7 +56,7 @@ namespace boost {
\note Prior content of the result will be overwritten. \note Prior content of the result will be overwritten.
\note This function provides the strong exception-safety guarantee \note This function provides the strong exception-safety guarantee
*/ */
template< typename SequenceSequenceT, typename Range1T, typename Range2T > template< typename SequenceSequenceT, typename Range1T, typename Range2T >
inline SequenceSequenceT& find_all( inline SequenceSequenceT& find_all(
@ -63,10 +64,10 @@ namespace boost {
Range1T& Input, Range1T& Input,
const Range2T& Search) const Range2T& Search)
{ {
return iter_find( return ::boost::algorithm::iter_find(
Result, Result,
Input, Input,
first_finder(Search) ); ::boost::algorithm::first_finder(Search) );
} }
//! Find all algorithm ( case insensitive ) //! Find all algorithm ( case insensitive )
@ -90,7 +91,7 @@ namespace boost {
\note Prior content of the result will be overwritten. \note Prior content of the result will be overwritten.
\note This function provides the strong exception-safety guarantee \note This function provides the strong exception-safety guarantee
*/ */
template< typename SequenceSequenceT, typename Range1T, typename Range2T > template< typename SequenceSequenceT, typename Range1T, typename Range2T >
inline SequenceSequenceT& ifind_all( inline SequenceSequenceT& ifind_all(
@ -99,10 +100,10 @@ namespace boost {
const Range2T& Search, const Range2T& Search,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
return iter_find( return ::boost::algorithm::iter_find(
Result, Result,
Input, Input,
first_finder(Search, is_iequal(Loc) ) ); ::boost::algorithm::first_finder(Search, is_iequal(Loc) ) );
} }
@ -142,10 +143,10 @@ namespace boost {
PredicateT Pred, PredicateT Pred,
token_compress_mode_type eCompress=token_compress_off ) token_compress_mode_type eCompress=token_compress_off )
{ {
return iter_split( return ::boost::algorithm::iter_split(
Result, Result,
Input, Input,
token_finder( Pred, eCompress ) ); ::boost::algorithm::token_finder( Pred, eCompress ) );
} }
} // namespace algorithm } // namespace algorithm

View File

@ -1,11 +1,12 @@
// Boost string_algo library list_traits.hpp header file ---------------------------// // Boost string_algo library list_traits.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_STD_LIST_TRAITS_HPP #ifndef BOOST_STRING_STD_LIST_TRAITS_HPP
#define BOOST_STRING_STD_LIST_TRAITS_HPP #define BOOST_STRING_STD_LIST_TRAITS_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library string_traits.hpp header file ---------------------------// // Boost string_algo library string_traits.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_STD_ROPE_TRAITS_HPP #ifndef BOOST_STRING_STD_ROPE_TRAITS_HPP
#define BOOST_STRING_STD_ROPE_TRAITS_HPP #define BOOST_STRING_STD_ROPE_TRAITS_HPP

View File

@ -1,18 +1,19 @@
// Boost string_algo library slist_traits.hpp header file ---------------------------// // Boost string_algo library slist_traits.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_STD_SLIST_TRAITS_HPP #ifndef BOOST_STRING_STD_SLIST_TRAITS_HPP
#define BOOST_STRING_STD_SLIST_TRAITS_HPP #define BOOST_STRING_STD_SLIST_TRAITS_HPP
#include <boost/algorithm/string/config.hpp> #include <boost/algorithm/string/config.hpp>
#include <boost/algorithm/string/yes_no_type.hpp> #include <boost/algorithm/string/yes_no_type.hpp>
#include <slist> #include BOOST_SLIST_HEADER
#include <boost/algorithm/string/sequence_traits.hpp> #include <boost/algorithm/string/sequence_traits.hpp>
namespace boost { namespace boost {

View File

@ -1,11 +1,12 @@
// Boost string_algo library string_traits.hpp header file ---------------------------// // Boost string_algo library string_traits.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_STD_STRING_TRAITS_HPP #ifndef BOOST_STRING_STD_STRING_TRAITS_HPP
#define BOOST_STRING_STD_STRING_TRAITS_HPP #define BOOST_STRING_STD_STRING_TRAITS_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library std_containers_traits.hpp header file ---------------------------// // Boost string_algo library std_containers_traits.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_STD_CONTAINERS_TRAITS_HPP #ifndef BOOST_STRING_STD_CONTAINERS_TRAITS_HPP
#define BOOST_STRING_STD_CONTAINERS_TRAITS_HPP #define BOOST_STRING_STD_CONTAINERS_TRAITS_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library trim.hpp header file ---------------------------// // Boost string_algo library trim.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_TRIM_HPP #ifndef BOOST_STRING_TRIM_HPP
#define BOOST_STRING_TRIM_HPP #define BOOST_STRING_TRIM_HPP
@ -15,6 +16,8 @@
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.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/detail/trim.hpp> #include <boost/algorithm/string/detail/trim.hpp>
#include <boost/algorithm/string/classification.hpp> #include <boost/algorithm/string/classification.hpp>
@ -60,12 +63,14 @@ namespace boost {
const RangeT& Input, const RangeT& Input,
PredicateT IsSpace) PredicateT IsSpace)
{ {
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(::boost::as_literal(Input));
std::copy( std::copy(
::boost::algorithm::detail::trim_begin( ::boost::algorithm::detail::trim_begin(
begin(Input), ::boost::begin(lit_range),
end(Input), ::boost::end(lit_range),
IsSpace ), IsSpace ),
end(Input), ::boost::end(lit_range),
Output); Output);
return Output; return Output;
@ -80,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
@ -101,7 +106,7 @@ namespace boost {
inline SequenceT trim_left_copy(const SequenceT& Input, const std::locale& Loc=std::locale()) inline SequenceT trim_left_copy(const SequenceT& Input, const std::locale& Loc=std::locale())
{ {
return return
trim_left_copy_if( ::boost::algorithm::trim_left_copy_if(
Input, Input,
is_space(Loc)); is_space(Loc));
} }
@ -119,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));
} }
@ -137,7 +142,7 @@ namespace boost {
template<typename SequenceT> template<typename SequenceT>
inline void trim_left(SequenceT& Input, const std::locale& Loc=std::locale()) inline void trim_left(SequenceT& Input, const std::locale& Loc=std::locale())
{ {
trim_left_if( ::boost::algorithm::trim_left_if(
Input, Input,
is_space(Loc)); is_space(Loc));
} }
@ -166,11 +171,13 @@ namespace boost {
const RangeT& Input, const RangeT& Input,
PredicateT IsSpace ) PredicateT IsSpace )
{ {
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(::boost::as_literal(Input));
std::copy( std::copy(
begin(Input), ::boost::begin(lit_range),
::boost::algorithm::detail::trim_end( ::boost::algorithm::detail::trim_end(
begin(Input), ::boost::begin(lit_range),
end(Input), ::boost::end(lit_range),
IsSpace ), IsSpace ),
Output ); Output );
@ -185,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)
); );
} }
@ -208,7 +215,7 @@ namespace boost {
inline SequenceT trim_right_copy(const SequenceT& Input, const std::locale& Loc=std::locale()) inline SequenceT trim_right_copy(const SequenceT& Input, const std::locale& Loc=std::locale())
{ {
return return
trim_right_copy_if( ::boost::algorithm::trim_right_copy_if(
Input, Input,
is_space(Loc)); is_space(Loc));
} }
@ -228,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)
); );
} }
@ -247,7 +254,7 @@ namespace boost {
template<typename SequenceT> template<typename SequenceT>
inline void trim_right(SequenceT& Input, const std::locale& Loc=std::locale()) inline void trim_right(SequenceT& Input, const std::locale& Loc=std::locale())
{ {
trim_right_if( ::boost::algorithm::trim_right_if(
Input, Input,
is_space(Loc) ); is_space(Loc) );
} }
@ -276,16 +283,18 @@ namespace boost {
const RangeT& Input, const RangeT& Input,
PredicateT IsSpace) PredicateT IsSpace)
{ {
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(::boost::as_literal(Input));
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(Input), ::boost::begin(lit_range),
end(Input), ::boost::end(lit_range),
IsSpace); IsSpace);
std::copy( std::copy(
detail::trim_begin( detail::trim_begin(
begin(Input), TrimEnd, IsSpace), ::boost::begin(lit_range), TrimEnd, IsSpace),
TrimEnd, TrimEnd,
Output Output
); );
@ -303,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
@ -331,7 +340,7 @@ namespace boost {
inline SequenceT trim_copy( const SequenceT& Input, const std::locale& Loc=std::locale() ) inline SequenceT trim_copy( const SequenceT& Input, const std::locale& Loc=std::locale() )
{ {
return return
trim_copy_if( ::boost::algorithm::trim_copy_if(
Input, Input,
is_space(Loc) ); is_space(Loc) );
} }
@ -348,8 +357,8 @@ namespace boost {
template<typename SequenceT, typename PredicateT> template<typename SequenceT, typename PredicateT>
inline void trim_if(SequenceT& Input, PredicateT IsSpace) inline void trim_if(SequenceT& Input, PredicateT IsSpace)
{ {
trim_right_if( Input, IsSpace ); ::boost::algorithm::trim_right_if( Input, IsSpace );
trim_left_if( Input, IsSpace ); ::boost::algorithm::trim_left_if( Input, IsSpace );
} }
//! Trim //! Trim
@ -363,7 +372,7 @@ namespace boost {
template<typename SequenceT> template<typename SequenceT>
inline void trim(SequenceT& Input, const std::locale& Loc=std::locale()) inline void trim(SequenceT& Input, const std::locale& Loc=std::locale())
{ {
trim_if( ::boost::algorithm::trim_if(
Input, Input,
is_space( Loc ) ); is_space( Loc ) );
} }

View File

@ -1,11 +1,12 @@
// Boost string_algo library yes_no_type.hpp header file ---------------------------// // Boost string_algo library yes_no_type.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and // Copyright Pavol Droba 2002-2003.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_YES_NO_TYPE_DETAIL_HPP #ifndef BOOST_STRING_YES_NO_TYPE_DETAIL_HPP
#define BOOST_STRING_YES_NO_TYPE_DETAIL_HPP #define BOOST_STRING_YES_NO_TYPE_DETAIL_HPP

View File

@ -1,11 +1,12 @@
// Boost string_algo library string_regex.hpp header file ---------------------------// // Boost string_algo library string_regex.hpp header file ---------------------------//
// Copyright Pavol Droba 2002-2004. Use, modification and // Copyright Pavol Droba 2002-2004.
// distribution is subject to the Boost Software License, Version //
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at // Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt) // (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org/ for updates, documentation, and revision history.
#ifndef BOOST_STRING_ALGO_REGEX_HPP #ifndef BOOST_STRING_ALGO_REGEX_HPP
#define BOOST_STRING_ALGO_REGEX_HPP #define BOOST_STRING_ALGO_REGEX_HPP

View File

@ -35,7 +35,7 @@ means that all the elements are distinct and in increasing order, <i>decrea</i>s
is the reverse, and <i>random</i> is produced by random_shuffle. is the reverse, and <i>random</i> is produced by random_shuffle.
<br> <br>
The program that created these tables is included in the distribution, The program that created these tables is included in the distribution,
under <a href=""../example/minmax_timer.cpp"">minmax_timer.cpp</a> under <a href="../example/minmax_timer.cpp">minmax_timer.cpp</a>
<br> <br>
<center><table BORDER NOSAVE > <center><table BORDER NOSAVE >
<tr NOSAVE> <tr NOSAVE>

View File

@ -7,8 +7,6 @@
# http://www.boost.org/LICENSE_1_0.txt) # http://www.boost.org/LICENSE_1_0.txt)
# #
subproject libs/algorithm/minmax/example ;
exe minmax_ex : minmax_ex.cpp ; exe minmax_ex : minmax_ex.cpp ;
exe minmax_timer : minmax_timer.cpp ; exe minmax_timer : minmax_timer.cpp ;

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
@ -95,7 +95,7 @@ namespace boost {
tuple&lt;T const&amp;, T const&amp;> > tuple&lt;T const&amp;, T const&amp;> >
minmax(const T&amp; a, const T&amp; b); minmax(const T&amp; a, const T&amp; b);
template &lt;class T, class <a href="http://www.sgi.com/tech/stl/ BinaryPredicate.html">BinaryPredicate</a>> template &lt;class T, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>>
tuple&lt;T const&amp;, T const&amp;> > tuple&lt;T const&amp;, T const&amp;> >
minmax(const T&amp; a, const T&amp; b, BinaryPredicate comp); minmax(const T&amp; a, const T&amp; b, BinaryPredicate comp);
@ -158,9 +158,9 @@ identical to
that they return the last instance of the largest element (and not the that they return the last instance of the largest element (and not the
first, as <tt>first_min_element</tt> and <tt>last_max_element</tt> would). first, as <tt>first_min_element</tt> and <tt>last_max_element</tt> would).
<p>The family of algorithms comprising <tt>first_min_first_max_element</tt>, <p>The family of algorithms comprising <tt>first_min_first_max_element</tt>,
<tt>first_min_first_max_element</tt>, <tt>first_min_last_max_element</tt>,
<tt>first_min_first_max_element</tt>, <tt>last_min_first_max_element</tt>,
and <tt>first_min_first_max_element</tt> can be described generically as and <tt>last_min_last_max_element</tt> can be described generically as
follows (using <i><tt>which</tt></i> and follows (using <i><tt>which</tt></i> and
<i><tt>what</tt></i> for <tt>first</tt> <i><tt>what</tt></i> for <tt>first</tt>
or <tt>last</tt>): <tt><i>which</i>_min_<i>what</i>_max_element</tt> finds or <tt>last</tt>): <tt><i>which</i>_min_<i>what</i>_max_element</tt> finds
@ -243,7 +243,7 @@ range
<a name="complexity"> <a name="complexity">
<h3> <h3>
<a NAME="Complexity"></a>Complexity</h3> Complexity</h3>
Minmax performs a single comparison and is otherwise of constant complexity. Minmax performs a single comparison and is otherwise of constant complexity.
The use of <tt>boost::tuple&lt;T const&amp;></tt> prevents copy The use of <tt>boost::tuple&lt;T const&amp;></tt> prevents copy
constructors in case the arguments are passed by reference. constructors in case the arguments are passed by reference.
@ -350,8 +350,7 @@ separation into two header files.</p>
std::max.</b></h4> std::max.</b></h4>
<p>I am aware of the problems with std::min and <p>I am aware of the problems with std::min and
std::max, and all the debate that has been going on (please consult std::max, and all the debate that has been going on (please consult
<a href="http://www.cuj.com/experts/1904/alexandr.htm?topic=experts&topic=experts">Alexandrescu's <a href="http://www.cuj.com/documents/s=7996/cujcexp1904alexandr/alexandr.htm">Alexandrescu's paper</a> and the links therein). But I don't see the purpose of this
paper</a> and the links therein). But I don't see the purpose of this
library as fixing something that is part of the C++ standard. I humbly library as fixing something that is part of the C++ standard. I humbly
think it's beyond the scope of this library. Rather, I am think it's beyond the scope of this library. Rather, I am
following the way of the standard in simply providing one more function following the way of the standard in simply providing one more function
@ -439,7 +438,7 @@ comparisons).</p>
slower than slower than
<tt>first_min_element</tt> alone, still much less than <tt>first_min_element</tt> <tt>first_min_element</tt> alone, still much less than <tt>first_min_element</tt>
and and
<tt>last_max_element</tt> called separately. <a href="#Performance">[2]</a> <tt>last_max_element</tt> called separately. <a href="#Note2">[2]</a>
<h4><b>Why algorithms and not accumulators?</b></h4> <h4><b>Why algorithms and not accumulators?</b></h4>
<p>The minmax algorithms are useful in computing the extent of a range. <p>The minmax algorithms are useful in computing the extent of a range.

View File

@ -1,33 +0,0 @@
# Boost.Minmax Library Test Jamfile
#
# Copyright (C) 2002--2004, Herve Bronnimann
#
# Use, modification, and distribution is subject to the Boost Software
# License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
#
subproject libs/algorithm/minmax/test ;
# bring in rules for testing
import testing ;
# Make tests run by default.
DEPENDS all : test ;
{
test-suite algorithm/minmax
: [ run
minmax_element_test.cpp
: :
:
: minmax_element
]
[ run
minmax_test.cpp
: :
:
: minmax
]
;
}

View File

@ -54,23 +54,23 @@ void test(BOOST_EXPLICIT_TEMPLATE_TYPE(Value))
less_count<Value> lc(counter); less_count<Value> lc(counter);
// Test functionality // Test functionality
tuple<Value const&, Value const&> result1 = minmax(zero, one); tuple<Value const&, Value const&> result1 = boost::minmax(zero, one);
BOOST_CHECK_EQUAL( get<0>(result1), zero ); BOOST_CHECK_EQUAL( get<0>(result1), zero );
BOOST_CHECK_EQUAL( get<1>(result1), one ); BOOST_CHECK_EQUAL( get<1>(result1), one );
tuple<Value const&, Value const&> result2 = minmax(one, zero); tuple<Value const&, Value const&> result2 = boost::minmax(one, zero);
BOOST_CHECK_EQUAL( get<0>(result2), zero ); BOOST_CHECK_EQUAL( get<0>(result2), zero );
BOOST_CHECK_EQUAL( get<1>(result2), one ); BOOST_CHECK_EQUAL( get<1>(result2), one );
// Test functionality and number of comparisons // Test functionality and number of comparisons
lc.reset(); lc.reset();
tuple<Value const&, Value const&> result3 = minmax(zero, one, lc ); tuple<Value const&, Value const&> result3 = boost::minmax(zero, one, lc );
BOOST_CHECK_EQUAL( get<0>(result3), zero ); BOOST_CHECK_EQUAL( get<0>(result3), zero );
BOOST_CHECK_EQUAL( get<1>(result3), one ); BOOST_CHECK_EQUAL( get<1>(result3), one );
BOOST_CHECK_EQUAL( counter, 1 ); BOOST_CHECK_EQUAL( counter, 1 );
lc.reset(); lc.reset();
tuple<Value const&, Value const&> result4 = minmax(one, zero, lc ); tuple<Value const&, Value const&> result4 = boost::minmax(one, zero, lc );
BOOST_CHECK_EQUAL( get<0>(result4), zero ); BOOST_CHECK_EQUAL( get<0>(result4), zero );
BOOST_CHECK_EQUAL( get<1>(result4), one ); BOOST_CHECK_EQUAL( get<1>(result4), one );
BOOST_CHECK_EQUAL( counter, 1); BOOST_CHECK_EQUAL( counter, 1);

View File

@ -10,7 +10,10 @@
import toolset ; import toolset ;
toolset.using doxygen ; toolset.using doxygen ;
boostbook string_algo : string_algo.xml ; boostbook string_algo : string_algo.xml autodoc
:
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html
;
doxygen autodoc doxygen autodoc
: :
@ -31,7 +34,9 @@ doxygen autodoc
[ glob ../../../../boost/algorithm/string/trim.hpp ] [ glob ../../../../boost/algorithm/string/trim.hpp ]
[ glob ../../../../boost/algorithm/string/predicate.hpp ] [ glob ../../../../boost/algorithm/string/predicate.hpp ]
[ glob ../../../../boost/algorithm/string/split.hpp ] [ glob ../../../../boost/algorithm/string/split.hpp ]
[ glob ../../../../boost/algorithm/string/iter_find.hpp ]
[ glob ../../../../boost/algorithm/string/erase.hpp ] [ glob ../../../../boost/algorithm/string/erase.hpp ]
[ glob ../../../../boost/algorithm/string/join.hpp ]
[ glob ../../../../boost/algorithm/string/replace.hpp ] [ glob ../../../../boost/algorithm/string/replace.hpp ]
[ glob ../../../../boost/algorithm/string/find_format.hpp ] [ glob ../../../../boost/algorithm/string/find_format.hpp ]
[ glob ../../../../boost/algorithm/string/formatter.hpp ] [ glob ../../../../boost/algorithm/string/formatter.hpp ]

View File

@ -1,6 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" <!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd"> "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
<!-- Copyright (c) 2002-2006 Pavol Droba.
Subject to the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
-->
<section id="string_algo.concept" last-revision="$Date$"> <section id="string_algo.concept" last-revision="$Date$">
<title>Concepts</title> <title>Concepts</title>
@ -96,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

@ -1,6 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" <!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd"> "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
<!-- Copyright (c) 2002-2006 Pavol Droba.
Subject to the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
-->
<section id="string_algo.credits" last-revision="$Date$"> <section id="string_algo.credits" last-revision="$Date$">
<title>Credits</title> <title>Credits</title>
<section id="string_algo.ack"> <section id="string_algo.ack">

View File

@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" <!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd"> "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
<!-- Copyright (c) 2002-2006 Pavol Droba.
Subject to the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
-->
<section id="string_algo.design" last-revision="$Date$"> <section id="string_algo.design" last-revision="$Date$">
<title>Design Topics</title> <title>Design Topics</title>
@ -18,7 +25,7 @@
</para> </para>
<para> <para>
<emphasis role="bold">Definition:</emphasis> A string is a <emphasis role="bold">Definition:</emphasis> A string is a
<ulink url="../../libs/range/doc/range.html">range</ulink> of characters accessible in sequential <ulink url="../../libs/range/index.html">range</ulink> of characters accessible in sequential
ordered fashion. Character is any value type with "cheap" copying and assignment. ordered fashion. Character is any value type with "cheap" copying and assignment.
</para> </para>
<para> <para>
@ -210,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="../../more/generic_exception_safety.html">link</ulink> <ulink url="http://www.boost.org/more/generic_exception_safety.html">link</ulink>
</para> </para>
</section> </section>
</section> </section>

View File

@ -1,6 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" <!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd"> "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
<!-- Copyright (c) 2002-2006 Pavol Droba.
Subject to the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
-->
<section id="string_algo.env" last-revision="$Date$"> <section id="string_algo.env" last-revision="$Date$">
<title>Environment</title> <title>Environment</title>
<section> <section>

View File

@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" <!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd"> "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
<!-- Copyright (c) 2002-2006 Pavol Droba.
Subject to the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
-->
<section id="string_algo.intro" last-revision="$Date$"> <section id="string_algo.intro" last-revision="$Date$">
<title>Introduction</title> <title>Introduction</title>

View File

@ -1,6 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" <!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd"> "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
<!-- Copyright (c) 2002-2006 Pavol Droba.
Subject to the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
-->
<section id="string_algo.quickref" last-revision="$Date$"> <section id="string_algo.quickref" last-revision="$Date$">
<title>Quick Reference</title> <title>Quick Reference</title>
@ -143,6 +149,16 @@
<functionname>iequals()</functionname> <functionname>iequals()</functionname>
</entry> </entry>
</row> </row>
<row>
<entry><code>lexicographical_compare</code></entry>
<entry>Check if a string is lexicographically less then another one</entry>
<entry>
<functionname>lexicographical_compare()</functionname>
<sbr/>
<functionname>ilexicographical_compare()</functionname>
</entry>
</row>
<row> <row>
<entry><code>all</code></entry> <entry><code>all</code></entry>
<entry>Check if all elements of a string satisfy the given predicate</entry> <entry>Check if all elements of a string satisfy the given predicate</entry>
@ -418,13 +434,55 @@
<functionname>find_all_regex()</functionname> <functionname>find_all_regex()</functionname>
</entry> </entry>
</row> </row>
<row> <row>
<entry>split</entry> <entry>split</entry>
<entry>Split input into parts</entry> <entry>Split input into parts</entry>
<entry> <entry>
<functionname>split()</functionname> <functionname>split()</functionname>
<sbr/> <sbr/>
<functionname>split_regex()</functionname> <functionname>split_regex()</functionname>
</entry>
</row>
<row>
<entry>iter_find</entry>
<entry>Iteratively apply the finder to the input to find all matching substrings</entry>
<entry>
<functionname>iter_find()</functionname>
</entry>
</row>
<row>
<entry>iter_split</entry>
<entry>Use the finder to find matching substrings in the input and use them as separators to split the input into parts</entry>
<entry>
<functionname>iter_split()</functionname>
</entry>
</row>
</tbody>
</tgroup>
</table>
<table>
<title>Join</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>Algorithm name</entry>
<entry>Description</entry>
<entry>Functions</entry>
</row>
</thead>
<tbody>
<row>
<entry>join</entry>
<entry>Join all elements in a container into a single string</entry>
<entry>
<functionname>join</functionname>
</entry>
</row>
<row>
<entry>join_if</entry>
<entry>Join all elements in a container that satisfies the condition into a single string</entry>
<entry>
<functionname>join_if()</functionname>
</entry> </entry>
</row> </row>
</tbody> </tbody>

View File

@ -1,6 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" <!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd"> "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
<!-- Copyright (c) 2002-2006 Pavol Droba.
Subject to the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
-->
<section id="string_algo.rationale" last-revision="$Date$"> <section id="string_algo.rationale" last-revision="$Date$">
<title>Rationale</title> <title>Rationale</title>

View File

@ -1,7 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" <!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd"> "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
<!-- Copyright (c) 2002-2006 Pavol Droba.
Subject to the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
-->
<section id="string_algo.release_notes" last-revision="$Date$"> <section id="string_algo.release_notes" last-revision="$Date$">
<using-namespace name="boost"/>
<using-namespace name="boost::algorithm"/>
<title>Release Notes</title> <title>Release Notes</title>
<itemizedlist> <itemizedlist>
@ -13,5 +23,23 @@
<para><emphasis role="bold">1.33</emphasis></para> <para><emphasis role="bold">1.33</emphasis></para>
<para>Internal version of collection traits removed, library adapted to Boost.Range</para> <para>Internal version of collection traits removed, library adapted to Boost.Range</para>
</listitem> </listitem>
<listitem>
<para><emphasis role="bold">1.34</emphasis></para>
<itemizedlist>
<listitem>
<functionname>lexicographical_compare()</functionname>
</listitem>
<listitem>
<functionname>join()</functionname> and <functionname>join_if()</functionname>
</listitem>
<listitem>
New comparison predicates <code>is_less</code>, <code>is_not_greater</code>
</listitem>
<listitem>
Negative indexes support (like Perl) in various algorihtms
(<code>*_head/tail</code>, <code>*_nth</code>).
</listitem>
</itemizedlist>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>

View File

@ -1,6 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" <!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd"> "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
<!-- Copyright (c) 2002-2006 Pavol Droba.
Subject to the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
-->
<library name="String Algorithms" dirname="algorithm/string" xmlns:xi="http://www.w3.org/2001/XInclude" <library name="String Algorithms" dirname="algorithm/string" xmlns:xi="http://www.w3.org/2001/XInclude"
id="string_algo" last-revision="$Date$"> id="string_algo" last-revision="$Date$">
<libraryinfo> <libraryinfo>
@ -38,7 +44,7 @@
<xi:include href="quickref.xml"/> <xi:include href="quickref.xml"/>
<xi:include href="design.xml"/> <xi:include href="design.xml"/>
<xi:include href="concept.xml"/> <xi:include href="concept.xml"/>
<xi:include href="autodoc.boostbook"/> <xi:include href="autodoc.xml"/>
<xi:include href="rationale.xml"/> <xi:include href="rationale.xml"/>
<xi:include href="environment.xml"/> <xi:include href="environment.xml"/>
<xi:include href="credits.xml"/> <xi:include href="credits.xml"/>

View File

@ -1,6 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" <!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd"> "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
<!-- Copyright (c) 2002-2006 Pavol Droba.
Subject to the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
-->
<section id="string_algo.usage" last-revision="$Date$"> <section id="string_algo.usage" last-revision="$Date$">
<title>Usage</title> <title>Usage</title>
@ -49,7 +57,7 @@
The magic of <ulink url="../../libs/range/index.html">Boost.Range</ulink> The magic of <ulink url="../../libs/range/index.html">Boost.Range</ulink>
provides a uniform way of handling different string types. provides a uniform way of handling different string types.
If there is a need to pass a pair of iterators, If there is a need to pass a pair of iterators,
<ulink url="../../libs/range/doc/utility_class.html"><code>boost::iterator_range</code></ulink> <ulink url="../../libs/range/doc/html/range/utilities/iterator_range.html"><code>boost::iterator_range</code></ulink>
can be used to package iterators into a structure with a compatible interface. can be used to package iterators into a structure with a compatible interface.
</para> </para>
</listitem> </listitem>
@ -122,7 +130,7 @@
string str1("command.com"); string str1("command.com");
cout cout
&lt;&lt; str1 &lt;&lt; str1
&lt;&lt; is_executable("command.com")? "is": "is not" &lt;&lt; (is_executable("command.com")? "is": "is not")
&lt;&lt; "an executable" &lt;&lt; "an executable"
&lt;&lt; endl; // prints "command.com is an executable" &lt;&lt; endl; // prints "command.com is an executable"
@ -130,7 +138,7 @@
char text1[]="hello world!"; char text1[]="hello world!";
cout cout
&lt;&lt; text1 &lt;&lt; text1
&lt;&lt; all( text1, is_lower() )? "is": "is not" &lt;&lt; (all( text1, is_lower() )? "is": "is not")
&lt;&lt; " written in the lower case" &lt;&lt; " written in the lower case"
&lt;&lt; endl; // prints "hello world! is written in the lower case" &lt;&lt; endl; // prints "hello world! is written in the lower case"
</programlisting> </programlisting>
@ -200,16 +208,16 @@
</programlisting> </programlisting>
<para> <para>
We have used <functionname>find_last()</functionname> to search the <code>text</code> for "ll". We have used <functionname>find_last()</functionname> to search the <code>text</code> for "ll".
The result is given in the <ulink url="../../libs/range/doc/utility_class.html"><code>boost::iterator_range</code></ulink>. The result is given in the <ulink url="../../libs/range/doc/html/range/utilities/iterator_range.html"><code>boost::iterator_range</code></ulink>.
This range delimits the This range delimits the
part of the input which satisfies the find criteria. In our example it is the last occurrence of "ll". part of the input which satisfies the find criteria. In our example it is the last occurrence of "ll".
As we can see, input of the <functionname>find_last()</functionname> algorithm can be also As we can see, input of the <functionname>find_last()</functionname> algorithm can be also
char[] because this type is supported by char[] because this type is supported by
<ulink linkend="../../libs/range/doc/index.html">Boost.Range</ulink>. <ulink url="../../libs/range/index.html">Boost.Range</ulink>.
The following lines transform the result. Notice that The following lines transform the result. Notice that
<ulink url="../../libs/range/doc/utility_class.html"><code>boost::iterator_range</code></ulink> has familiar <ulink url="../../libs/range/doc/html/range/utilities/iterator_range.html"><code>boost::iterator_range</code></ulink> has familiar
<code>begin()</code> and <code>end()</code> methods, so it can be used like any other STL container. <code>begin()</code> and <code>end()</code> methods, so it can be used like any other STL container.
Also it is convertible to bool therefore it is easy to use find algorithms for a simple containment checking. Also it is convertible to bool therefore it is easy to use find algorithms for a simple containment checking.
</para> </para>
@ -256,7 +264,7 @@
the find iterator allows us to iterate over the substrings matching the specified criteria. the find iterator allows us to iterate over the substrings matching the specified criteria.
This facility is using the <link linkend="string_algo.finder_concept">Finder</link> to incrementally This facility is using the <link linkend="string_algo.finder_concept">Finder</link> to incrementally
search the string. search the string.
Dereferencing a find iterator yields an <ulink url="../../libs/range/doc/utility_class.html"><code>boost::iterator_range</code></ulink> Dereferencing a find iterator yields an <ulink url="../../libs/range/doc/html/range/utilities/iterator_range.html"><code>boost::iterator_range</code></ulink>
object, that delimits the current match. object, that delimits the current match.
</para> </para>
<para> <para>
@ -283,9 +291,9 @@
// aBC // aBC
typedef split_iterator&lt;string::iterator&gt; string_split_iterator; typedef split_iterator&lt;string::iterator&gt; string_split_iterator;
for(string_find_iterator It= for(string_split_iterator It=
make_split_iterator(str1, first_finder("-*-", is_iequal())); make_split_iterator(str1, first_finder("-*-", is_iequal()));
It!=string_find_iterator(); It!=string_split_iterator();
++It) ++It)
{ {
cout &lt;&lt; copy_range&lt;std::string&gt;(*It) &lt;&lt; endl; cout &lt;&lt; copy_range&lt;std::string&gt;(*It) &lt;&lt; endl;

View File

@ -7,69 +7,12 @@
# #
# See http://www.boost.org for updates, documentation, and revision history. # See http://www.boost.org for updates, documentation, and revision history.
subproject libs/algorithm/string/example ;
exe conv_example exe conv_example : conv_example.cpp ;
: exe predicate_example : predicate_example.cpp ;
conv_example.cpp exe find_example : find_example.cpp ;
: exe replace_example : replace_example.cpp ;
<include>$(BOOST_ROOT) exe rle_example : rle_example.cpp ;
: exe trim_example : trim_example.cpp ;
; exe regex_example : regex_example.cpp /boost/regex//boost_regex ;
exe split_example : split_example.cpp ;
exe predicate_example
:
predicate_example.cpp
:
<include>$(BOOST_ROOT)
:
;
exe find_example
:
find_example.cpp
:
<include>$(BOOST_ROOT)
:
;
exe replace_example
:
replace_example.cpp
:
<include>$(BOOST_ROOT)
:
;
exe rle_example
:
rle_example.cpp
:
<include>$(BOOST_ROOT)
:
;
exe trim_example
:
trim_example.cpp
:
<include>$(BOOST_ROOT)
:
;
exe regex_example
:
regex_example.cpp
<lib>../../../regex/build/boost_regex
:
<include>$(BOOST_ROOT)
:
;
exe split_example
:
split_example.cpp
:
<include>$(BOOST_ROOT)
:
;

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

@ -4,6 +4,11 @@
</head> </head>
<body> <body>
Automatic redirection failed, please go to Automatic redirection failed, please go to
<a href="../../../doc/html/string_algo.html">../../doc/html/string_algo.html</a> <a href="../../../doc/html/string_algo.html">../../doc/html/string_algo.html</a>
&nbsp;<hr>
<p><EFBFBD> Copyright Beman Dawes, 2001</p>
<p>Distributed under the Boost Software License, Version 1.0. (See accompanying
file <a href="../../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or copy
at <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a>)</p>
</body> </body>
</html> </html>

View File

@ -1,77 +0,0 @@
# Boost string_algo library test suite Jamfile ----------------------------
#
# Copyright Pavol Droba 2002-2003. Use, modification and
# distribution is subject to the Boost Software License, Version
# 1.0. (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
#
# See http://www.boost.org for updates, documentation, and revision history.
subproject libs/algorithm/string/test ;
# bring in rules for testing
import testing ;
# Make tests run by default.
DEPENDS all : test ;
{
test-suite algorithm/string
: [ run
trim_test.cpp
: :
:
std::locale-support
std::facet-support
: trim
]
[ run
conv_test.cpp
: :
:
std::locale-support
std::facet-support
: conv
]
[ run
predicate_test.cpp
: :
:
std::locale-support
std::facet-support
: predicate
]
[ run
find_test.cpp
: :
:
std::locale-support
std::facet-support
: find
]
[ run
split_test.cpp
: :
:
std::locale-support
std::facet-support
: split
]
[ run
replace_test.cpp
: :
:
std::locale-support
std::facet-support
: replace
]
[ run
regex_test.cpp
<lib>../../../regex/build/boost_regex
: :
:
: regex
]
;
}

View File

@ -40,6 +40,12 @@ test-suite algorithm/string
: :
: split : split
] ]
[ run
join_test.cpp
: :
:
: join
]
[ run [ run
replace_test.cpp replace_test.cpp
: : : :

View File

@ -93,16 +93,33 @@ void find_test()
( (nc_result.begin()-str1.begin()) == 9) && ( (nc_result.begin()-str1.begin()) == 9) &&
( (nc_result.end()-str1.begin()) == 12) ); ( (nc_result.end()-str1.begin()) == 12) );
nc_result=find_nth( str1, string("abc"), -1 );
BOOST_CHECK(
( (nc_result.begin()-str1.begin()) == 15) &&
( (nc_result.end()-str1.begin()) == 18) );
cv_result=find_nth( const_cast<const string&>(str1), str2, 1 ); cv_result=find_nth( const_cast<const string&>(str1), str2, 1 );
BOOST_CHECK( BOOST_CHECK(
( (cv_result.begin()-str1.begin()) == 9) && ( (cv_result.begin()-str1.begin()) == 9) &&
( (cv_result.end()-str1.begin()) == 12) ); ( (cv_result.end()-str1.begin()) == 12) );
cv_result=find_nth( const_cast<const string&>(str1), str2, -1 );
BOOST_CHECK(
( (cv_result.begin()-str1.begin()) == 15) &&
( (cv_result.end()-str1.begin()) == 18) );
cv_result=ifind_nth( const_cast<const string&>(str1), "xxx", 1 ); cv_result=ifind_nth( const_cast<const string&>(str1), "xxx", 1 );
BOOST_CHECK( BOOST_CHECK(
( (cv_result.begin()-str1.begin()) == 12) && ( (cv_result.begin()-str1.begin()) == 12) &&
( (cv_result.end()-str1.begin()) == 15) ); ( (cv_result.end()-str1.begin()) == 15) );
cv_result=ifind_nth( const_cast<const string&>(str1), "xxx", 1 );
BOOST_CHECK(
( (cv_result.begin()-str1.begin()) == 12) &&
( (cv_result.end()-str1.begin()) == 15) );
ch_result=find_nth( pch1, "abc", 1 ); ch_result=find_nth( pch1, "abc", 1 );
BOOST_CHECK(( (ch_result.begin() - pch1 ) == 9) && ( (ch_result.end() - pch1 ) == 12 ) ); BOOST_CHECK(( (ch_result.begin() - pch1 ) == 9) && ( (ch_result.end() - pch1 ) == 12 ) );
@ -114,6 +131,11 @@ void find_test()
( (nc_result.begin()-str1.begin()) == 0) && ( (nc_result.begin()-str1.begin()) == 0) &&
( (nc_result.end()-str1.begin()) == 6) ); ( (nc_result.end()-str1.begin()) == 6) );
nc_result=find_head( str1, -6 );
BOOST_CHECK(
( (nc_result.begin()-str1.begin()) == 0) &&
( (str1.end()-nc_result.end()) == 6 ) );
cv_result=find_head( const_cast<const string&>(str1), 6 ); cv_result=find_head( const_cast<const string&>(str1), 6 );
BOOST_CHECK( BOOST_CHECK(
( (cv_result.begin()-str1.begin()) == 0) && ( (cv_result.begin()-str1.begin()) == 0) &&
@ -130,6 +152,12 @@ void find_test()
( (nc_result.begin()-str1.begin()) == 15) && ( (nc_result.begin()-str1.begin()) == 15) &&
( (nc_result.end()-str1.begin()) == 21) ); ( (nc_result.end()-str1.begin()) == 21) );
nc_result=find_tail( str1, -6 );
BOOST_CHECK(
( (nc_result.begin()-str1.begin()) == 6) &&
( (nc_result.end()-str1.begin()) == 21) );
cv_result=find_tail( const_cast<const string&>(str1), 6 ); cv_result=find_tail( const_cast<const string&>(str1), 6 );
BOOST_CHECK( BOOST_CHECK(
( (cv_result.begin()-str1.begin()) == 15) && ( (cv_result.begin()-str1.begin()) == 15) &&

79
string/test/join_test.cpp Normal file
View File

@ -0,0 +1,79 @@
// Boost string_algo library iterator_test.cpp file ---------------------------//
// Copyright Pavol Droba 2002-2003. Use, modification and
// distribution is subject to the Boost Software License, Version
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history.
#include <boost/algorithm/string/join.hpp>
#include <boost/algorithm/string/classification.hpp>
// equals predicate is used for result comparison
#include <boost/algorithm/string/predicate.hpp>
// Include unit test framework
#include <boost/test/included/test_exec_monitor.hpp>
#include <string>
#include <vector>
#include <iostream>
#include <boost/test/test_tools.hpp>
using namespace std;
using namespace boost;
bool is_not_empty(const std::string& str)
{
return !str.empty();
}
void join_test()
{
// Prepare inputs
vector<string> tokens1;
tokens1.push_back("xx");
tokens1.push_back("abc");
tokens1.push_back("xx");
vector<string> tokens2;
tokens2.push_back("");
tokens2.push_back("xx");
tokens2.push_back("abc");
tokens2.push_back("");
tokens2.push_back("abc");
tokens2.push_back("xx");
tokens2.push_back("");
vector<string> tokens3;
tokens3.push_back("");
tokens3.push_back("");
tokens3.push_back("");
vector<string> empty_tokens;
vector<vector<int> > vtokens;
for(unsigned int n=0; n<tokens2.size(); ++n)
{
vtokens.push_back(vector<int>(tokens2[n].begin(), tokens2[n].end()));
}
BOOST_CHECK( equals(join(tokens1, "-"), "xx-abc-xx") );
BOOST_CHECK( equals(join(tokens2, "-"), "-xx-abc--abc-xx-") );
BOOST_CHECK( equals(join(vtokens, "-"), "-xx-abc--abc-xx-") );
BOOST_CHECK( equals(join(empty_tokens, "-"), "") );
BOOST_CHECK( equals(join_if(tokens2, "-", is_not_empty), "xx-abc-abc-xx") );
BOOST_CHECK( equals(join_if(empty_tokens, "-", is_not_empty), "") );
BOOST_CHECK( equals(join_if(tokens3, "-", is_not_empty), "") );
}
// test main
int test_main( int, char*[] )
{
join_test();
return 0;
}

View File

@ -56,6 +56,14 @@ void predicate_test()
BOOST_CHECK( iequals( "AbC", "abc" ) ); BOOST_CHECK( iequals( "AbC", "abc" ) );
BOOST_CHECK( !iequals( "aBc", "yyy" ) ); BOOST_CHECK( !iequals( "aBc", "yyy" ) );
BOOST_CHECK( lexicographical_compare("abc", "abd") );
BOOST_CHECK( !lexicographical_compare("abc", "abc") );
BOOST_CHECK( lexicographical_compare("abc", "abd", is_less()) );
BOOST_CHECK( !ilexicographical_compare("aBD", "AbC") );
BOOST_CHECK( ilexicographical_compare("aBc", "AbD") );
BOOST_CHECK( lexicographical_compare("abC", "aBd", is_iless()) );
// multi-type comparison test // multi-type comparison test
BOOST_CHECK( starts_with( vec1, string("123") ) ); BOOST_CHECK( starts_with( vec1, string("123") ) );
BOOST_CHECK( ends_with( vec1, string("321") ) ); BOOST_CHECK( ends_with( vec1, string("321") ) );
@ -85,12 +93,32 @@ void predicate_test()
BOOST_CHECK( ends_with( "123xxx321", "321" ) ); BOOST_CHECK( ends_with( "123xxx321", "321" ) );
BOOST_CHECK( contains( "123xxx321", "xxx" ) ); BOOST_CHECK( contains( "123xxx321", "xxx" ) );
BOOST_CHECK( equals( "123xxx321", "123xxx321" ) ); BOOST_CHECK( equals( "123xxx321", "123xxx321" ) );
}
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()
@ -112,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

@ -8,7 +8,11 @@
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org for updates, documentation, and revision history.
#include <boost/algorithm/string/regex.hpp> #include <boost/algorithm/string/regex.hpp>
#include <boost/algorithm/string/join.hpp>
#include <boost/algorithm/string/sequence_traits.hpp> #include <boost/algorithm/string/sequence_traits.hpp>
// equals predicate is used for result comparison
#include <boost/algorithm/string/predicate.hpp>
// Include unit test framework // Include unit test framework
#include <boost/test/included/test_exec_monitor.hpp> #include <boost/test/included/test_exec_monitor.hpp>
@ -83,6 +87,23 @@ static void find_test()
} }
static void join_test()
{
// Prepare inputs
vector<string> tokens1;
tokens1.push_back("xx");
tokens1.push_back("abc");
tokens1.push_back("xx");
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
BOOST_CHECK( equals(join_if(tokens1, "-", regex("x+")), "xx-xx") );
BOOST_CHECK( equals(join_if(tokens1, "-", regex("[abc]+")), "abc") );
#else
BOOST_CHECK( equals(join_if_regex(tokens1, "-", regex("x+")), "xx-xx") );
BOOST_CHECK( equals(join_if_regex(tokens1, "-", regex("[abc]+")), "abc") );
#endif
}
static void replace_test() static void replace_test()
{ {
string str1("123a1cxxxa23cXXXa456c321"); string str1("123a1cxxxa23cXXXa456c321");
@ -131,6 +152,7 @@ static void replace_test()
int test_main( int, char*[] ) int test_main( int, char*[] )
{ {
find_test(); find_test();
join_test();
replace_test(); replace_test();
return 0; return 0;

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") );
@ -136,17 +137,27 @@ void replace_nth_test()
{ {
// replace nth // replace nth
TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 0 C_ string("YYY"), string("1YYY3abc2") ); TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 0 C_ string("YYY"), string("1YYY3abc2") );
TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ -1 C_ string("YYY"), string("1abc3YYY2") );
TEST_ALGO( ireplace_nth, "1AbC3abc2", "aBc" C_ 0 C_ "YYY", string("1YYY3abc2") ); TEST_ALGO( ireplace_nth, "1AbC3abc2", "aBc" C_ 0 C_ "YYY", string("1YYY3abc2") );
TEST_ALGO( ireplace_nth, "1AbC3abc2", "aBc" C_ -1 C_ "YYY", string("1AbC3YYY2") );
TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 0 C_ string("Z"), string("1Z3abc2") ); TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 0 C_ string("Z"), string("1Z3abc2") );
TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 0 C_ string("XXXX"), string("1XXXX3abc2") ); TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 0 C_ string("XXXX"), string("1XXXX3abc2") );
TEST_ALGO( replace_nth, "1abc3abc2", "abc" C_ 0 C_ "XXXX", string("1XXXX3abc2") ); TEST_ALGO( replace_nth, "1abc3abc2", "abc" C_ 0 C_ "XXXX", string("1XXXX3abc2") );
TEST_ALGO( replace_nth, "1abc3abc2", "abc" C_ 3 C_ "XXXX", string("1abc3abc2") );
TEST_ALGO( replace_nth, "1abc3abc2", "abc" C_ -3 C_ "XXXX", string("1abc3abc2") );
TEST_ALGO( replace_nth, "1abc3abc2", string("") C_ 0 C_ string("XXXX"), string("1abc3abc2") ); TEST_ALGO( replace_nth, "1abc3abc2", string("") C_ 0 C_ string("XXXX"), string("1abc3abc2") );
TEST_ALGO( replace_nth, "", string("") C_ 0 C_ string("XXXX"), string("") ); TEST_ALGO( replace_nth, "", string("") C_ 0 C_ string("XXXX"), string("") );
TEST_ALGO( replace_nth, "", string("") C_ -1 C_ string("XXXX"), string("") );
TEST_ALGO( erase_nth, "1abc3abc2", string("abc") C_ 0, string("13abc2") ); TEST_ALGO( erase_nth, "1abc3abc2", string("abc") C_ 0, string("13abc2") );
TEST_ALGO( erase_nth, "1abc3abc2", string("abc") C_ -1, string("1abc32") );
TEST_ALGO( erase_nth, "1abc3abc2", string("abc") C_ -3, string("1abc3abc2") );
TEST_ALGO( ierase_nth, "1aBc3aBc2", "ABC" C_ 0, string("13aBc2") ); TEST_ALGO( ierase_nth, "1aBc3aBc2", "ABC" C_ 0, string("13aBc2") );
TEST_ALGO( ierase_nth, "1aBc3aBc2", "ABC" C_ -1, string("1aBc32") );
TEST_ALGO( ierase_nth, "1aBc3aBc2", "ABC" C_ -3, string("1aBc3aBc2") );
TEST_ALGO( erase_nth, "1abc3abc2", "abc" C_ 0, string("13abc2") ); TEST_ALGO( erase_nth, "1abc3abc2", "abc" C_ 0, string("13abc2") );
TEST_ALGO( erase_nth, "1abc3abc2", string("") C_ 0, string("1abc3abc2") ); TEST_ALGO( erase_nth, "1abc3abc2", string("") C_ 0, string("1abc3abc2") );
TEST_ALGO( erase_nth, "", string("abc") C_ 0, string("") ); TEST_ALGO( erase_nth, "", string("abc") C_ 0, string("") );
TEST_ALGO( erase_nth, "", string("abc") C_ -1, string("") );
TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 1 C_ string("YYY"), string("1abc3YYY2") ); TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 1 C_ string("YYY"), string("1abc3YYY2") );
TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 2 C_ string("YYY"), string("1abc3abc2") ); TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 2 C_ string("YYY"), string("1abc3abc2") );
} }
@ -155,28 +166,37 @@ void replace_head_test()
{ {
// replace head // replace head
TEST_ALGO( replace_head, "abc3abc2", 3 C_ string("YYY"), string("YYY3abc2") ); TEST_ALGO( replace_head, "abc3abc2", 3 C_ string("YYY"), string("YYY3abc2") );
TEST_ALGO( replace_head, "abc3abc2", -3 C_ string("YYY"), string("YYYbc2") );
TEST_ALGO( replace_head, "abc3abc2", 3 C_ "YYY", string("YYY3abc2") ); TEST_ALGO( replace_head, "abc3abc2", 3 C_ "YYY", string("YYY3abc2") );
TEST_ALGO( replace_head, "abc", 3 C_ string("Z"), string("Z") ); TEST_ALGO( replace_head, "abc", 3 C_ string("Z"), string("Z") );
TEST_ALGO( replace_head, "abc", 6 C_ string("XXXX"), string("XXXX") ); TEST_ALGO( replace_head, "abc", 6 C_ string("XXXX"), string("XXXX") );
TEST_ALGO( replace_head, "abc", -6 C_ string("XXXX"), string("abc") );
TEST_ALGO( replace_head, "abc3abc2", 0 C_ string("XXXX"), string("abc3abc2") ); TEST_ALGO( replace_head, "abc3abc2", 0 C_ string("XXXX"), string("abc3abc2") );
TEST_ALGO( replace_head, "", 4 C_ string("XXXX"), string("") ); TEST_ALGO( replace_head, "", 4 C_ string("XXXX"), string("") );
TEST_ALGO( replace_head, "", -4 C_ string("XXXX"), string("") );
TEST_ALGO( erase_head, "abc3abc2", 3, string("3abc2") ); TEST_ALGO( erase_head, "abc3abc2", 3, string("3abc2") );
TEST_ALGO( erase_head, "abc3abc2", -3, string("bc2") );
TEST_ALGO( erase_head, "abc3abc2", 0, string("abc3abc2") ); TEST_ALGO( erase_head, "abc3abc2", 0, string("abc3abc2") );
TEST_ALGO( erase_head, "", 4, string("") ); TEST_ALGO( erase_head, "", 4, string("") );
TEST_ALGO( erase_head, "", -4, string("") );
} }
void replace_tail_test() void replace_tail_test()
{ {
// replace tail // replace tail
TEST_ALGO( replace_tail, "abc3abc", 3 C_ string("YYY"), string("abc3YYY") ); TEST_ALGO( replace_tail, "abc3abc", 3 C_ string("YYY"), string("abc3YYY") );
TEST_ALGO( replace_tail, "abc3abc", 3 C_ "YYY", string("abc3YYY") ); TEST_ALGO( replace_tail, "abc3abc", -3 C_ "YYY", string("abcYYY") );
TEST_ALGO( replace_tail, "abc", 3 C_ string("Z"), string("Z") ); TEST_ALGO( replace_tail, "abc", 3 C_ string("Z"), string("Z") );
TEST_ALGO( replace_tail, "abc", 6 C_ string("XXXX"), string("XXXX") ); TEST_ALGO( replace_tail, "abc", 6 C_ string("XXXX"), string("XXXX") );
TEST_ALGO( replace_tail, "abc", -6 C_ string("XXXX"), string("abc") );
TEST_ALGO( replace_tail, "abc3abc", 0 C_ string("XXXX"), string("abc3abc") ); TEST_ALGO( replace_tail, "abc3abc", 0 C_ string("XXXX"), string("abc3abc") );
TEST_ALGO( replace_tail, "", 4 C_ string("XXXX"), string("") ); TEST_ALGO( replace_tail, "", 4 C_ string("XXXX"), string("") );
TEST_ALGO( replace_tail, "", -4 C_ string("XXXX"), string("") );
TEST_ALGO( erase_tail, "abc3abc", 3, string("abc3") ); TEST_ALGO( erase_tail, "abc3abc", 3, string("abc3") );
TEST_ALGO( erase_tail, "abc3abc", -3, string("abc") );
TEST_ALGO( erase_tail, "abc3abc", 0, string("abc3abc") ); TEST_ALGO( erase_tail, "abc3abc", 0, string("abc3abc") );
TEST_ALGO( erase_tail, "", 4, string("") ); TEST_ALGO( erase_tail, "", 4, string("") );
TEST_ALGO( erase_tail, "", -4, string("") );
} }
void replace_range_test() void replace_range_test()

View File

@ -122,6 +122,25 @@ void iterator_test()
BOOST_CHECK( tokens[2]==string("") ); BOOST_CHECK( tokens[2]==string("") );
BOOST_CHECK( tokens[3]==string("xx") ); BOOST_CHECK( tokens[3]==string("xx") );
BOOST_CHECK( tokens[4]==string("abb") ); BOOST_CHECK( tokens[4]==string("abb") );
find_iterator<string::iterator> fiter=make_find_iterator(str1, first_finder("xx"));
BOOST_CHECK(equals(*fiter, "xx"));
++fiter;
BOOST_CHECK(equals(*fiter, "xx"));
++fiter;
BOOST_CHECK(fiter==find_iterator<string::iterator>());
split_iterator<string::iterator> siter=make_split_iterator(str1, token_finder(is_any_of("-"), token_compress_on));
BOOST_CHECK(equals(*siter, "xx"));
++siter;
BOOST_CHECK(equals(*siter, "abc"));
++siter;
BOOST_CHECK(equals(*siter, "xx"));
++siter;
BOOST_CHECK(equals(*siter, "abb"));
++siter;
BOOST_CHECK(siter==split_iterator<string::iterator>());
} }
// test main // test main