diff --git a/include/boost/utility/string_view.hpp b/include/boost/utility/string_view.hpp index db934e6..24633d6 100644 --- a/include/boost/utility/string_view.hpp +++ b/include/boost/utility/string_view.hpp @@ -1,5 +1,6 @@ /* - Copyright (c) Marshall Clow 2012-2015. + © Copyright (c) Marshall Clow 2012-2015. + © Copyright Beman Dawes 2015 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) @@ -197,22 +198,30 @@ namespace boost { return len_ >= x.len_ && traits::compare ( ptr_, x.ptr_, x.len_ ) == 0; } - BOOST_CONSTEXPR bool ends_with(charT c) const { return !empty() && traits::eq ( c, back()); } // Boost extension - + BOOST_CONSTEXPR bool ends_with(charT c) const { + return !empty() && traits::eq ( c, back()); // Boost extension + } BOOST_CONSTEXPR bool ends_with(basic_string_view x) const { // Boost extension - return len_ >= x.len_ && traits::compare ( ptr_ + len_ - x.len_, x.ptr_, x.len_ ) == 0; + return len_ >= x.len_ && traits::compare ( ptr_ + len_ - x.len_, + x.ptr_, x.len_ ) == 0; } - BOOST_CONSTEXPR size_type find(basic_string_view s) const { - const_iterator iter = std::search ( this->cbegin (), this->cend (), - s.cbegin (), s.cend (), traits::eq ); + BOOST_CONSTEXPR size_type find(basic_string_view s, + size_type pos = 0) const BOOST_NOEXCEPT { + if (pos >= size()) + return npos; + const_iterator iter = std::search(this->cbegin() + pos, this->cend(), + s.cbegin (), s.cend (), traits::eq ); return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter ); } - - BOOST_CONSTEXPR size_type find(charT c) const BOOST_NOEXCEPT { - const_iterator iter = std::find_if ( this->cbegin (), this->cend (), - detail::string_view_traits_eq ( c )); - return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter ); + BOOST_CONSTEXPR size_type find(charT c, size_type pos = 0) const BOOST_NOEXCEPT { + return find(basic_string_view(&c, 1), pos); + } + BOOST_CONSTEXPR size_type find(const charT* s, size_type pos, size_type n) const { + return find(basic_string_view(s, n), pos); + } + BOOST_CONSTEXPR size_type find(const charT* s, size_type pos = 0) const { + return find(basic_string_view(s), pos); } BOOST_CONSTEXPR size_type rfind(basic_string_view s) const BOOST_NOEXCEPT { @@ -227,7 +236,6 @@ namespace boost { return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter ); } - BOOST_CONSTEXPR size_type find_first_of(basic_string_view s) const BOOST_NOEXCEPT { const_iterator iter = std::find_first_of ( this->cbegin (), this->cend (), s.cbegin (), s.cend (), traits::eq ); diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 276dc22..abb6714 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -30,6 +30,10 @@ test-suite utility [ run string_ref_test1.cpp unit_test_framework ] [ run string_ref_test2.cpp unit_test_framework ] [ run string_ref_test_io.cpp unit_test_framework ] + [ run string_view_test1.cpp unit_test_framework ] + [ run string_view_test2.cpp unit_test_framework ] + [ run string_view_test3.cpp ] + [ run string_view_test_io.cpp unit_test_framework ] [ run ../value_init_test.cpp ] [ run ../value_init_workaround_test.cpp ] [ run ../initialized_test.cpp ] diff --git a/test/string_view_test2.cpp b/test/string_view_test2.cpp index 86c96e1..962ef98 100644 --- a/test/string_view_test2.cpp +++ b/test/string_view_test2.cpp @@ -253,10 +253,10 @@ void to_string ( const char *arg ) { str2 = sr1.to_string (); BOOST_CHECK ( str1 == str2 ); -#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS - std::string str3 = static_cast ( sr1 ); - BOOST_CHECK ( str1 == str3 ); -#endif +//#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS +// std::string str3 = static_cast ( sr1 ); +// BOOST_CHECK ( str1 == str3 ); +//#endif } void compare ( const char *arg ) { diff --git a/test/string_view_test3.cpp b/test/string_view_test3.cpp index ce0a32c..fb9f161 100644 --- a/test/string_view_test3.cpp +++ b/test/string_view_test3.cpp @@ -1,10 +1,10 @@ /* - Copyright (c) Beman Dawes 2015 + © Copyright Beman Dawes 2015 Distributed under the Boost Software License, Version 1.0 See http://www.boost.org/LICENSE_1_0.txt - For more information, see http://www.boost.org + For more information, see http://www.boost.org */ #include @@ -15,13 +15,65 @@ #define BOOST_LIGHTWEIGHT_TEST_OSTREAM std::cout #include +#include namespace { + void find_test() + { + // find, two modified and two new signatures + std::string s1("ababcab"); + boost::string_view sv1(s1); + std::string s2("abc"); + boost::string_view sv2(s2); + + BOOST_TEST_EQ(sv1.find(sv2), 2); + BOOST_TEST_EQ(sv1.find(sv2, 0), 2); + BOOST_TEST_EQ(sv1.find(sv2, 1), 2); + BOOST_TEST_EQ(sv1.find(sv2, 2), 2); + BOOST_TEST_EQ(sv1.find(sv2, 3), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find(sv2, 4), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find(sv2, 5), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find(sv2, 6), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find(sv2, 7), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find(sv2, 8), boost::string_view::npos); + + BOOST_TEST_EQ(sv1.find('b'), 1); + BOOST_TEST_EQ(sv1.find('b', 0), 1); + BOOST_TEST_EQ(sv1.find('b', 1), 1); + BOOST_TEST_EQ(sv1.find('b', 2), 3); + BOOST_TEST_EQ(sv1.find('b', 3), 3); + BOOST_TEST_EQ(sv1.find('b', 4), 6); + BOOST_TEST_EQ(sv1.find('b', 5), 6); + BOOST_TEST_EQ(sv1.find('b', 6), 6); + BOOST_TEST_EQ(sv1.find('b', 7), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find('b', 8), boost::string_view::npos); + + BOOST_TEST_EQ(sv1.find("abc", 0, 2), 0); + BOOST_TEST_EQ(sv1.find("abc", 1, 2), 2); + BOOST_TEST_EQ(sv1.find("abc", 2, 2), 2); + BOOST_TEST_EQ(sv1.find("abc", 3, 2), 5); + BOOST_TEST_EQ(sv1.find("abc", 4, 2), 5); + BOOST_TEST_EQ(sv1.find("abc", 5, 2), 5); + BOOST_TEST_EQ(sv1.find("abc", 6, 2), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find("abc", 7, 2), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find("abc", 8, 2), boost::string_view::npos); + + BOOST_TEST_EQ(sv1.find("abc"), 2); + BOOST_TEST_EQ(sv1.find("abc", 0), 2); + BOOST_TEST_EQ(sv1.find("abc", 1), 2); + BOOST_TEST_EQ(sv1.find("abc", 2), 2); + BOOST_TEST_EQ(sv1.find("abc", 3), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find("abc", 4), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find("abc", 5), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find("abc", 6), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find("abc", 7), boost::string_view::npos); + BOOST_TEST_EQ(sv1.find("abc", 8), boost::string_view::npos); + } } // unnamed namespace -int main() +int cpp_main(int argc, char* argv[]) { typedef boost::string_view::traits_type string_traits; typedef boost::string_view::const_pointer const_pointer; @@ -29,6 +81,8 @@ int main() // swap // copy // compare, five new signatures + + find_test(); return boost::report_errors(); }