Commit a007ec35 authored by knowledge4igor's avatar knowledge4igor

Make string_view find and rfind methods really nothrow

parent cd8a771d
......@@ -83,10 +83,18 @@ namespace std {
operator=(const string_view &view) noexcept = default;
size_type find(string_view v, size_type pos = 0) const noexcept {
for(; size_ - pos >= v.size_; pos++) {
string_view compare = substr(pos, v.size_);
if (v == compare) {
return pos;
if (v.size_ <= (size_ - pos)) {
for (; pos <= (size_ - v.size_); ++pos) {
bool found = true;
for (size_type i = 0; i < v.size_; ++i) {
if (data_[pos + i] != v.data_[i]) {
found = false;
break;
}
}
if (found) {
return pos;
}
}
}
return npos;
......@@ -105,17 +113,24 @@ namespace std {
}
size_type rfind(string_view v, size_type pos = npos) const noexcept {
if (pos >= size_) {
pos = size_ - v.size_;
}
for(; pos != npos; pos--) {
string_view compare = substr(pos, v.size_);
if (v == compare) {
return pos;
if (v.size_ <= size_) {
size_t start = size_ - v.size_;
if (pos != std::string::npos)
start = pos;
for (size_t offset = 0; offset <= pos; ++offset, --start) {
bool found = true;
for (size_t j = 0; j < v.size_; ++j) {
if (data_[start + j] != v.data_[j]) {
found = false;
break;
}
}
if (found) {
return start;
}
}
}
return npos;
return std::string::npos;
}
size_type rfind(char c, size_type pos = npos) const noexcept {
......
......@@ -53,6 +53,32 @@ TEST(string_view_test, rfind_test) {
ASSERT_EQ(orig.rfind("set"), std::size_t(-1));
}
TEST(string_view_test, rfind_test_2) {
std::string_view orig1 ("e");
std::string_view find1 ("e");
ASSERT_EQ(orig1.rfind(find1), std::size_t(0));
ASSERT_EQ(orig1.rfind(find1, 1), std::size_t(0));
std::string_view orig2 ("e");
std::string_view find2 ("");
ASSERT_EQ(orig2.rfind(find2), std::size_t(1));
ASSERT_EQ(orig2.rfind(find2, 1), std::size_t(1));
std::string_view orig3 ("");
std::string_view find3 ("e");
ASSERT_EQ(orig3.rfind(find3), std::size_t(-1));
ASSERT_EQ(orig3.rfind(find3, 1), std::size_t(-1));
std::string_view orig4 ("");
std::string_view find4 ("");
ASSERT_EQ(orig4.rfind(find4), std::size_t(0));
ASSERT_EQ(orig4.rfind(find4, 1), std::size_t(0));
}
TEST(string_view_test, emptiness) {
std::string_view e1;
std::string_view e2 ("");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment