diff --git a/include/boost/utility/string_view.hpp b/include/boost/utility/string_view.hpp index 24633d6..fda078e 100644 --- a/include/boost/utility/string_view.hpp +++ b/include/boost/utility/string_view.hpp @@ -10,7 +10,8 @@ Based on the StringRef implementation in LLVM (http://llvm.org) and N3422 by Jeffrey Yasskin http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html - + Updated July 2015 to reflect the Library Fundamentals TS + http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4480.html */ #ifndef BOOST_STRING_VIEW_HPP @@ -191,6 +192,8 @@ namespace boost { return substr(pos1, n1).compare(basic_string_view(x, n2)); } + // Searches + BOOST_CONSTEXPR bool starts_with(charT c) const { // Boost extension return !empty() && traits::eq ( c, front()); } @@ -206,9 +209,11 @@ namespace boost { x.ptr_, x.len_ ) == 0; } - BOOST_CONSTEXPR size_type find(basic_string_view s, - size_type pos = 0) const BOOST_NOEXCEPT { - if (pos >= size()) + // find + /*BOOST_CONSTEXPR*/ size_type find(basic_string_view s, size_type pos = 0) const BOOST_NOEXCEPT { + if (s.empty() && pos == size()) + return pos; + if (pos > size()) return npos; const_iterator iter = std::search(this->cbegin() + pos, this->cend(), s.cbegin (), s.cend (), traits::eq ); @@ -224,7 +229,9 @@ namespace boost { return find(basic_string_view(s), pos); } - BOOST_CONSTEXPR size_type rfind(basic_string_view s) const BOOST_NOEXCEPT { + // rfind + BOOST_CONSTEXPR size_type rfind(basic_string_view s, size_type pos = npos) + const BOOST_NOEXCEPT { const_reverse_iterator iter = std::search ( this->crbegin (), this->crend (), s.crbegin (), s.crend (), traits::eq ); return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter ); @@ -236,6 +243,7 @@ namespace boost { return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter ); } + // find_first_of 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 ); @@ -243,6 +251,7 @@ namespace boost { } BOOST_CONSTEXPR size_type find_first_of(charT c) const BOOST_NOEXCEPT { return find (c); } + // find_last_of BOOST_CONSTEXPR size_type find_last_of(basic_string_view s) const BOOST_NOEXCEPT { const_reverse_iterator iter = std::find_first_of ( this->crbegin (), this->crend (), s.cbegin (), s.cend (), traits::eq ); @@ -250,6 +259,7 @@ namespace boost { } BOOST_CONSTEXPR size_type find_last_of (charT c) const BOOST_NOEXCEPT { return rfind (c); } + // find_first_not_of BOOST_CONSTEXPR size_type find_first_not_of(basic_string_view s) const { const_iterator iter = find_not_of ( this->cbegin (), this->cend (), s ); return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter ); @@ -262,6 +272,7 @@ namespace boost { return npos; } + // find_last_not_of BOOST_CONSTEXPR size_type find_last_not_of(basic_string_view s) const BOOST_NOEXCEPT { const_reverse_iterator iter = find_not_of ( this->crbegin (), this->crend (), s ); return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter ); diff --git a/include/boost/utility/string_view_fwd.hpp b/include/boost/utility/string_view_fwd.hpp index 18ae6c6..dbda0de 100644 --- a/include/boost/utility/string_view_fwd.hpp +++ b/include/boost/utility/string_view_fwd.hpp @@ -9,6 +9,8 @@ Based on the StringRef implementation in LLVM (http://llvm.org) and N3422 by Jeffrey Yasskin http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html + Updated July 2015 to reflect the Library Fundamentals TS + http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4480.html */ diff --git a/test/string_view_test3.cpp b/test/string_view_test3.cpp index fb9f161..c4dbbb2 100644 --- a/test/string_view_test3.cpp +++ b/test/string_view_test3.cpp @@ -21,54 +21,51 @@ namespace { void find_test() { - // find, two modified and two new signatures + // find - test two modified and two new signatures std::string s1("ababcab"); boost::string_view sv1(s1); std::string s2("abc"); boost::string_view sv2(s2); + std::string s3; + boost::string_view sv3(s3); - 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); + // first signature + BOOST_TEST_EQ(sv3.find(sv3), s3.find(s3)); + BOOST_TEST_EQ(sv2.find(sv3), s2.find(s3)); + BOOST_TEST_EQ(sv3.find(sv2), s3.find(s2)); + BOOST_TEST_EQ(sv1.find(sv3, 7), s1.find(s3, 7)); - 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(sv2), s1.find(s2)); + for (std::string::size_type i = 0; i <= 8; ++i) + { + //std::cout << i << std::endl; + BOOST_TEST_EQ(sv1.find(sv2, i), s1.find(s2, i)); + } + for (std::string::size_type i = 0; i <= 8; ++i) + { + //std::cout << i << std::endl; + BOOST_TEST_EQ(sv1.find(sv3, i), s1.find(s3, i)); + } - 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); + // second signature + for (std::string::size_type i = 0; i <= 8; ++i) + { + //std::cout << i << std::endl; + BOOST_TEST_EQ(sv1.find('b', i), s1.find('b', i)); + } - 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); + // third signature + for (std::string::size_type i = 0; i <= 8; ++i) + for (std::string::size_type j = 0; j <= 4; ++j) + { + //std::cout << i << " " << j << std::endl; + BOOST_TEST_EQ(sv1.find("abc", i, j), s1.find("abc", i, j)); + } + + // fourth signature + BOOST_TEST_EQ(sv1.find("abc"), s1.find("abc")); + for (std::string::size_type i = 0; i <= 8; ++i) + BOOST_TEST_EQ(sv1.find("abc", i), s1.find("abc", i)); } } // unnamed namespace