From 6069151a061208d53774915cef9b9292c90cded9 Mon Sep 17 00:00:00 2001 From: Beman Date: Tue, 14 Jul 2015 15:24:11 -0400 Subject: [PATCH] Add copy and swap tests. Fix wrong return value from copy. --- include/boost/utility/string_view.hpp | 4 +- test/string_view_test3.cpp | 80 +++++++++++++++++++++++++-- 2 files changed, 79 insertions(+), 5 deletions(-) diff --git a/include/boost/utility/string_view.hpp b/include/boost/utility/string_view.hpp index 1280ffb..cd22b32 100644 --- a/include/boost/utility/string_view.hpp +++ b/include/boost/utility/string_view.hpp @@ -158,7 +158,9 @@ namespace boost { size_type copy( charT* s, size_type n, size_type pos = 0 ) const { if ( pos > size()) BOOST_THROW_EXCEPTION( std::out_of_range ( "string_view::copy" ) ); - return std::copy_n(begin() + pos, (std::min)(n, len_ - pos), s); + size_type rlen = (std::min)(n, len_ - pos); + std::copy_n(begin() + pos, rlen, s); + return rlen; } BOOST_CONSTEXPR basic_string_view substr(size_type pos, size_type n=npos) const { diff --git a/test/string_view_test3.cpp b/test/string_view_test3.cpp index c8cd519..f0b9bbd 100644 --- a/test/string_view_test3.cpp +++ b/test/string_view_test3.cpp @@ -7,6 +7,10 @@ For more information, see http://www.boost.org */ +#ifndef _SCL_SECURE_NO_WARNINGS +# define _SCL_SECURE_NO_WARNINGS +#endif + #include #include @@ -19,6 +23,75 @@ namespace { + void swap_test() + { + std::cout << "swap test..." << std::endl; + + std::string s1("abcdefg"); + boost::string_view sv1(s1); + std::string s2("xyz"); + boost::string_view sv2(s2); + std::string s3; + boost::string_view sv3(s3); + + boost::string_view sv1_org(sv1); + boost::string_view sv2_org(sv2); + boost::string_view sv3_org(sv3); + + sv1.swap(sv2); + BOOST_TEST_EQ(sv1.data(), sv2_org.data()); + BOOST_TEST_EQ(sv2.data(), sv1_org.data()); + BOOST_TEST_EQ(sv1.size(), sv2_org.size()); + BOOST_TEST_EQ(sv2.size(), sv1_org.size()); + sv1.swap(sv2); + BOOST_TEST_EQ(sv1.data(), sv1_org.data()); + BOOST_TEST_EQ(sv2.data(), sv2_org.data()); + BOOST_TEST_EQ(sv1.size(), sv1_org.size()); + BOOST_TEST_EQ(sv2.size(), sv2_org.size()); + + sv3.swap(sv1); + BOOST_TEST_EQ(sv3.data(), sv1_org.data()); + BOOST_TEST_EQ(sv1.data(), sv3_org.data()); + BOOST_TEST_EQ(sv3.size(), sv1_org.size()); + BOOST_TEST_EQ(sv1.size(), sv3_org.size()); + sv3.swap(sv1); + BOOST_TEST_EQ(sv1.data(), sv1_org.data()); + BOOST_TEST_EQ(sv3.data(), sv3_org.data()); + BOOST_TEST_EQ(sv1.size(), sv1_org.size()); + BOOST_TEST_EQ(sv3.size(), sv3_org.size()); + } + + void copy_test() + { + std::cout << "copy test..." << std::endl; + + std::string s1("abcdefg"); + boost::string_view sv1(s1); + const std::size_t sz = 128u; + char a[sz]; + + std::fill(a, a + sz, 'x'); + sv1.copy(a, sv1.size()); + BOOST_TEST(std::memcmp(sv1.data(), &a, sv1.size()) == 0); + const char* p; + for (p = a + sv1.size(); + p != a + sz && *p == 'x'; ++p) {} + BOOST_TEST(p == a + sz); + + std::fill(a, a + sz, 'x'); + sv1.copy(a, sv1.size()-2, 2); + BOOST_TEST(std::memcmp(sv1.data()+2, &a, sv1.size()-2) == 0); + for (p = a + sv1.size() - 2; + p != a + sz && *p == 'x'; ++p) {} + BOOST_TEST(p == a + sz); + } + + void compare_test() + { + std::cout << "compare test..." << std::endl; + + } + void find_test() { std::cout << "find test..." << std::endl; @@ -394,10 +467,9 @@ int cpp_main(int argc, char* argv[]) typedef boost::string_view::traits_type string_traits; typedef boost::string_view::const_pointer const_pointer; - // swap - // copy - // compare, five new signatures - + swap_test(); + copy_test(); + compare_test(); find_test(); rfind_test(); find_first_of_test();