diff --git a/include/boost/algorithm/string/detail/find_format.hpp b/include/boost/algorithm/string/detail/find_format.hpp index 0d8b104..4014f38 100644 --- a/include/boost/algorithm/string/detail/find_format.hpp +++ b/include/boost/algorithm/string/detail/find_format.hpp @@ -49,17 +49,17 @@ namespace boost { if ( !M ) { // 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; } // 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 // 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 - std::copy( M.end(), ::boost::end(Input), Output ); + Output = std::copy( M.end(), ::boost::end(Input), Output ); return Output; } diff --git a/include/boost/algorithm/string/detail/find_format_all.hpp b/include/boost/algorithm/string/detail/find_format_all.hpp index 36edf56..07e6124 100644 --- a/include/boost/algorithm/string/detail/find_format_all.hpp +++ b/include/boost/algorithm/string/detail/find_format_all.hpp @@ -57,9 +57,9 @@ namespace boost { while( M ) { // Copy the beginning of the sequence - std::copy( LastMatch, M.begin(), Output ); + Output = std::copy( LastMatch, M.begin(), Output ); // 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 LastMatch=M.end(); @@ -67,7 +67,7 @@ namespace boost { } // Copy the rest of the sequence - std::copy( LastMatch, ::boost::end(Input), Output ); + Output = std::copy( LastMatch, ::boost::end(Input), Output ); return Output; } diff --git a/string/test/Jamfile.v2 b/string/test/Jamfile.v2 index d85bdec..8b38e2c 100644 --- a/string/test/Jamfile.v2 +++ b/string/test/Jamfile.v2 @@ -59,5 +59,11 @@ test-suite algorithm/string : : regex ] + [ run + find_format_test.cpp + : : + : + : find_format + ] ; diff --git a/string/test/find_format_test.cpp b/string/test/find_format_test.cpp new file mode 100644 index 0000000..803c178 --- /dev/null +++ b/string/test/find_format_test.cpp @@ -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 +#include +#include + +// Include unit test framework +#include + +#include + +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; +}