mirror of
https://github.com/boostorg/algorithm.git
synced 2025-06-30 06:21:08 +02:00
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:
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -59,5 +59,11 @@ test-suite algorithm/string
|
|||||||
:
|
:
|
||||||
: regex
|
: regex
|
||||||
]
|
]
|
||||||
|
[ run
|
||||||
|
find_format_test.cpp
|
||||||
|
: :
|
||||||
|
:
|
||||||
|
: find_format
|
||||||
|
]
|
||||||
;
|
;
|
||||||
|
|
||||||
|
105
string/test/find_format_test.cpp
Normal file
105
string/test/find_format_test.cpp
Normal 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;
|
||||||
|
}
|
Reference in New Issue
Block a user