Assign the iterator returned by std::copy back to Output, so that string algorithms will work with iterators other than inserters

[SVN r62694]
This commit is contained in:
Steven Watanabe
2010-06-09 21:12:06 +00:00
parent 6289ed7f98
commit 46ed1bf987
4 changed files with 118 additions and 7 deletions

View File

@ -49,17 +49,17 @@ namespace boost {
if ( !M ) if ( !M )
{ {
// Match not found - return original sequence // Match not found - return original sequence
std::copy( ::boost::begin(Input), ::boost::end(Input), Output ); 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( ::boost::begin(Input), ::boost::begin(M), Output ); Output = std::copy( ::boost::begin(Input), ::boost::begin(M), Output );
// Format find result // Format find result
// Copy formated result // Copy formated result
std::copy( ::boost::begin(M.format_result()), ::boost::end(M.format_result()), Output ); 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(), ::boost::end(Input), Output ); Output = std::copy( M.end(), ::boost::end(Input), Output );
return Output; return Output;
} }

View File

@ -57,9 +57,9 @@ namespace boost {
while( M ) while( M )
{ {
// Copy the beginning of the sequence // Copy the beginning of the sequence
std::copy( LastMatch, M.begin(), Output ); Output = std::copy( LastMatch, M.begin(), Output );
// Copy formated result // Copy formated result
std::copy( ::boost::begin(M.format_result()), ::boost::end(M.format_result()), Output ); 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();
@ -67,7 +67,7 @@ namespace boost {
} }
// Copy the rest of the sequence // Copy the rest of the sequence
std::copy( LastMatch, ::boost::end(Input), Output ); Output = std::copy( LastMatch, ::boost::end(Input), Output );
return Output; return Output;
} }

View File

@ -59,5 +59,11 @@ test-suite algorithm/string
: :
: regex : regex
] ]
[ run
find_format_test.cpp
: :
:
: find_format
]
; ;

View File

@ -0,0 +1,105 @@
// Boost string_algo library find_format_test.cpp file ------------------//
// Copyright (c) 2009 Steven Watanabe
// 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.
#include <boost/algorithm/string/find_format.hpp>
#include <boost/algorithm/string/finder.hpp>
#include <boost/algorithm/string/formatter.hpp>
// Include unit test framework
#include <boost/test/included/test_exec_monitor.hpp>
#include <boost/test/test_tools.hpp>
void find_format_test()
{
const std::string source = "$replace $replace";
std::string expected = "ok $replace";
std::string output(80, '\0');
std::string::iterator pos =
boost::find_format_copy(output.begin(),
source,
boost::first_finder("$replace"),
boost::const_formatter("ok"));
BOOST_CHECK(pos == output.begin() + expected.size());
output.erase(std::remove(output.begin(), output.end(), '\0'), output.end());
BOOST_CHECK_EQUAL(output, expected);
output = boost::find_format_copy(source, boost::first_finder("$replace"), boost::const_formatter("ok"));
BOOST_CHECK_EQUAL(output, expected);
// now try finding a string that doesn't exist
output.resize(80);
pos = boost::find_format_copy(output.begin(),
source,
boost::first_finder("$noreplace"),
boost::const_formatter("bad"));
BOOST_CHECK(pos == output.begin() + source.size());
output.erase(std::remove(output.begin(), output.end(), '\0'), output.end());
BOOST_CHECK_EQUAL(output, source);
output = boost::find_format_copy(source, boost::first_finder("$noreplace"), boost::const_formatter("bad"));
BOOST_CHECK_EQUAL(output, source);
// in place version
output = source;
boost::find_format(output, boost::first_finder("$replace"), boost::const_formatter("ok"));
BOOST_CHECK_EQUAL(output, expected);
output = source;
boost::find_format(output, boost::first_finder("$noreplace"), boost::const_formatter("bad"));
BOOST_CHECK_EQUAL(output, source);
}
void find_format_all_test()
{
const std::string source = "$replace $replace";
std::string expected = "ok ok";
std::string output(80, '\0');
std::string::iterator pos =
boost::find_format_all_copy(output.begin(),
source,
boost::first_finder("$replace"),
boost::const_formatter("ok"));
BOOST_CHECK(pos == output.begin() + expected.size());
output.erase(std::remove(output.begin(), output.end(), '\0'), output.end());
BOOST_CHECK_EQUAL(output, expected);
output = boost::find_format_all_copy(source, boost::first_finder("$replace"), boost::const_formatter("ok"));
BOOST_CHECK_EQUAL(output, expected);
// now try finding a string that doesn't exist
output.resize(80);
pos = boost::find_format_all_copy(output.begin(),
source,
boost::first_finder("$noreplace"),
boost::const_formatter("bad"));
BOOST_CHECK(pos == output.begin() + source.size());
output.erase(std::remove(output.begin(), output.end(), '\0'), output.end());
BOOST_CHECK_EQUAL(output, source);
output = boost::find_format_all_copy(source, boost::first_finder("$noreplace"), boost::const_formatter("bad"));
BOOST_CHECK_EQUAL(output, source);
// in place version
output = source;
boost::find_format_all(output, boost::first_finder("$replace"), boost::const_formatter("ok"));
BOOST_CHECK_EQUAL(output, expected);
output = source;
boost::find_format_all(output, boost::first_finder("$noreplace"), boost::const_formatter("bad"));
BOOST_CHECK_EQUAL(output, source);
}
int test_main( int, char*[] )
{
find_format_test();
find_format_all_test();
return 0;
}