diff --git a/include/etl/string_view.h b/include/etl/string_view.h index 1178e4c4..81446bcf 100644 --- a/include/etl/string_view.h +++ b/include/etl/string_view.h @@ -425,18 +425,28 @@ namespace etl //************************************************************************* /// Shrinks the view by moving its start forward. + /// When n >= size(), the view is set to empty. //************************************************************************* - ETL_CONSTEXPR14 void remove_prefix(size_type n) ETL_NOEXCEPT + ETL_CONSTEXPR14 void remove_prefix(size_type n) { - mbegin += n; + ETL_ASSERT(n <= size(), ETL_ERROR(string_view_bounds)); + if (n < size()) + mbegin += n; + else + mbegin = mend; } //************************************************************************* /// Shrinks the view by moving its end backward. + /// When n >= size(), the view is set to empty. //************************************************************************* - ETL_CONSTEXPR14 void remove_suffix(size_type n) ETL_NOEXCEPT + ETL_CONSTEXPR14 void remove_suffix(size_type n) { - mend -= n; + ETL_ASSERT(n <= size(), ETL_ERROR(string_view_bounds)); + if (n < size()) + mend -= n; + else + mend = mbegin; } //************************************************************************* diff --git a/test/test_string_view.cpp b/test/test_string_view.cpp index a9314dd2..1d016160 100644 --- a/test/test_string_view.cpp +++ b/test/test_string_view.cpp @@ -542,6 +542,50 @@ namespace CHECK(isEqual); } + //************************************************************************* + TEST(test_remove_prefix_empty) + { + std::string original = "Hello World"; + View view(original.c_str()); + + // remove n == size() should result in an empty view + view.remove_prefix(original.size()); + CHECK_EQUAL(view.begin(), view.end()); + CHECK(view.empty()); + } + + //************************************************************************* + TEST(test_remove_prefix_assert) + { + std::string original = "Hello World"; + View view(original.c_str()); + + // remove n > size() should trigger ETL_ASSERT + CHECK_THROW(view.remove_prefix(original.size() + 1), etl::string_view_bounds); + } + + //************************************************************************* + TEST(test_remove_suffix_empty) + { + std::string original = "Hello World"; + View view(original.c_str()); + + // remove n == size() should result in an empty view + view.remove_suffix(original.size()); + CHECK_EQUAL(view.begin(), view.end()); + CHECK(view.empty()); + } + + //************************************************************************* + TEST(test_remove_suffix_assert) + { + std::string original = "Hello World"; + View view(original.c_str()); + + // remove n > size() should trigger ETL_ASSERT + CHECK_THROW(view.remove_suffix(original.size() + 1), etl::string_view_bounds); + } + //************************************************************************* TEST(test_copy) {