mirror of
https://github.com/boostorg/utility.git
synced 2025-05-09 15:04:00 +00:00
Add more extensive find() tests. Fix bugs detected by these tests. Get string_view_test3 working on GCC -std=c++11, and verify tests passing on older VC++ releases.
This commit is contained in:
parent
306bbfdaf1
commit
6c5a955c85
@ -10,7 +10,8 @@
|
|||||||
Based on the StringRef implementation in LLVM (http://llvm.org) and
|
Based on the StringRef implementation in LLVM (http://llvm.org) and
|
||||||
N3422 by Jeffrey Yasskin
|
N3422 by Jeffrey Yasskin
|
||||||
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html
|
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
|
#ifndef BOOST_STRING_VIEW_HPP
|
||||||
@ -191,6 +192,8 @@ namespace boost {
|
|||||||
return substr(pos1, n1).compare(basic_string_view(x, n2));
|
return substr(pos1, n1).compare(basic_string_view(x, n2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Searches
|
||||||
|
|
||||||
BOOST_CONSTEXPR bool starts_with(charT c) const { // Boost extension
|
BOOST_CONSTEXPR bool starts_with(charT c) const { // Boost extension
|
||||||
return !empty() && traits::eq ( c, front());
|
return !empty() && traits::eq ( c, front());
|
||||||
}
|
}
|
||||||
@ -206,9 +209,11 @@ namespace boost {
|
|||||||
x.ptr_, x.len_ ) == 0;
|
x.ptr_, x.len_ ) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_CONSTEXPR size_type find(basic_string_view s,
|
// find
|
||||||
size_type pos = 0) const BOOST_NOEXCEPT {
|
/*BOOST_CONSTEXPR*/ size_type find(basic_string_view s, size_type pos = 0) const BOOST_NOEXCEPT {
|
||||||
if (pos >= size())
|
if (s.empty() && pos == size())
|
||||||
|
return pos;
|
||||||
|
if (pos > size())
|
||||||
return npos;
|
return npos;
|
||||||
const_iterator iter = std::search(this->cbegin() + pos, this->cend(),
|
const_iterator iter = std::search(this->cbegin() + pos, this->cend(),
|
||||||
s.cbegin (), s.cend (), traits::eq );
|
s.cbegin (), s.cend (), traits::eq );
|
||||||
@ -224,7 +229,9 @@ namespace boost {
|
|||||||
return find(basic_string_view(s), pos);
|
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 (),
|
const_reverse_iterator iter = std::search ( this->crbegin (), this->crend (),
|
||||||
s.crbegin (), s.crend (), traits::eq );
|
s.crbegin (), s.crend (), traits::eq );
|
||||||
return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter );
|
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 );
|
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 {
|
BOOST_CONSTEXPR size_type find_first_of(basic_string_view s) const BOOST_NOEXCEPT {
|
||||||
const_iterator iter = std::find_first_of
|
const_iterator iter = std::find_first_of
|
||||||
( this->cbegin (), this->cend (), s.cbegin (), s.cend (), traits::eq );
|
( 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); }
|
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 {
|
BOOST_CONSTEXPR size_type find_last_of(basic_string_view s) const BOOST_NOEXCEPT {
|
||||||
const_reverse_iterator iter = std::find_first_of
|
const_reverse_iterator iter = std::find_first_of
|
||||||
( this->crbegin (), this->crend (), s.cbegin (), s.cend (), traits::eq );
|
( 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); }
|
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 {
|
BOOST_CONSTEXPR size_type find_first_not_of(basic_string_view s) const {
|
||||||
const_iterator iter = find_not_of ( this->cbegin (), this->cend (), s );
|
const_iterator iter = find_not_of ( this->cbegin (), this->cend (), s );
|
||||||
return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter );
|
return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter );
|
||||||
@ -262,6 +272,7 @@ namespace boost {
|
|||||||
return npos;
|
return npos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// find_last_not_of
|
||||||
BOOST_CONSTEXPR size_type find_last_not_of(basic_string_view s) const BOOST_NOEXCEPT {
|
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 );
|
const_reverse_iterator iter = find_not_of ( this->crbegin (), this->crend (), s );
|
||||||
return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter );
|
return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter );
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
Based on the StringRef implementation in LLVM (http://llvm.org) and
|
Based on the StringRef implementation in LLVM (http://llvm.org) and
|
||||||
N3422 by Jeffrey Yasskin
|
N3422 by Jeffrey Yasskin
|
||||||
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html
|
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
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -21,54 +21,51 @@ namespace
|
|||||||
{
|
{
|
||||||
void find_test()
|
void find_test()
|
||||||
{
|
{
|
||||||
// find, two modified and two new signatures
|
// find - test two modified and two new signatures
|
||||||
std::string s1("ababcab");
|
std::string s1("ababcab");
|
||||||
boost::string_view sv1(s1);
|
boost::string_view sv1(s1);
|
||||||
std::string s2("abc");
|
std::string s2("abc");
|
||||||
boost::string_view sv2(s2);
|
boost::string_view sv2(s2);
|
||||||
|
std::string s3;
|
||||||
|
boost::string_view sv3(s3);
|
||||||
|
|
||||||
BOOST_TEST_EQ(sv1.find(sv2), 2);
|
// first signature
|
||||||
BOOST_TEST_EQ(sv1.find(sv2, 0), 2);
|
BOOST_TEST_EQ(sv3.find(sv3), s3.find(s3));
|
||||||
BOOST_TEST_EQ(sv1.find(sv2, 1), 2);
|
BOOST_TEST_EQ(sv2.find(sv3), s2.find(s3));
|
||||||
BOOST_TEST_EQ(sv1.find(sv2, 2), 2);
|
BOOST_TEST_EQ(sv3.find(sv2), s3.find(s2));
|
||||||
BOOST_TEST_EQ(sv1.find(sv2, 3), boost::string_view::npos);
|
BOOST_TEST_EQ(sv1.find(sv3, 7), s1.find(s3, 7));
|
||||||
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(sv2), s1.find(s2));
|
||||||
BOOST_TEST_EQ(sv1.find('b', 0), 1);
|
for (std::string::size_type i = 0; i <= 8; ++i)
|
||||||
BOOST_TEST_EQ(sv1.find('b', 1), 1);
|
{
|
||||||
BOOST_TEST_EQ(sv1.find('b', 2), 3);
|
//std::cout << i << std::endl;
|
||||||
BOOST_TEST_EQ(sv1.find('b', 3), 3);
|
BOOST_TEST_EQ(sv1.find(sv2, i), s1.find(s2, i));
|
||||||
BOOST_TEST_EQ(sv1.find('b', 4), 6);
|
}
|
||||||
BOOST_TEST_EQ(sv1.find('b', 5), 6);
|
for (std::string::size_type i = 0; i <= 8; ++i)
|
||||||
BOOST_TEST_EQ(sv1.find('b', 6), 6);
|
{
|
||||||
BOOST_TEST_EQ(sv1.find('b', 7), boost::string_view::npos);
|
//std::cout << i << std::endl;
|
||||||
BOOST_TEST_EQ(sv1.find('b', 8), boost::string_view::npos);
|
BOOST_TEST_EQ(sv1.find(sv3, i), s1.find(s3, i));
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_TEST_EQ(sv1.find("abc", 0, 2), 0);
|
// second signature
|
||||||
BOOST_TEST_EQ(sv1.find("abc", 1, 2), 2);
|
for (std::string::size_type i = 0; i <= 8; ++i)
|
||||||
BOOST_TEST_EQ(sv1.find("abc", 2, 2), 2);
|
{
|
||||||
BOOST_TEST_EQ(sv1.find("abc", 3, 2), 5);
|
//std::cout << i << std::endl;
|
||||||
BOOST_TEST_EQ(sv1.find("abc", 4, 2), 5);
|
BOOST_TEST_EQ(sv1.find('b', i), s1.find('b', i));
|
||||||
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);
|
// third signature
|
||||||
BOOST_TEST_EQ(sv1.find("abc", 0), 2);
|
for (std::string::size_type i = 0; i <= 8; ++i)
|
||||||
BOOST_TEST_EQ(sv1.find("abc", 1), 2);
|
for (std::string::size_type j = 0; j <= 4; ++j)
|
||||||
BOOST_TEST_EQ(sv1.find("abc", 2), 2);
|
{
|
||||||
BOOST_TEST_EQ(sv1.find("abc", 3), boost::string_view::npos);
|
//std::cout << i << " " << j << std::endl;
|
||||||
BOOST_TEST_EQ(sv1.find("abc", 4), boost::string_view::npos);
|
BOOST_TEST_EQ(sv1.find("abc", i, j), s1.find("abc", i, j));
|
||||||
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);
|
// fourth signature
|
||||||
BOOST_TEST_EQ(sv1.find("abc", 8), boost::string_view::npos);
|
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
|
} // unnamed namespace
|
||||||
|
Loading…
x
Reference in New Issue
Block a user