From 048204b0123b8589cd0e603cce81a51bf1b108ab Mon Sep 17 00:00:00 2001 From: Mike Bloom Date: Thu, 16 Jul 2026 20:11:56 -0400 Subject: [PATCH 1/4] remove_prefix, premove_suffix, clamp n to size() --- include/etl/string_view.h | 10 +++++++-- test/test_string_view.cpp | 44 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/include/etl/string_view.h b/include/etl/string_view.h index 1178e4c4..7fb82c96 100644 --- a/include/etl/string_view.h +++ b/include/etl/string_view.h @@ -428,7 +428,10 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 void remove_prefix(size_type n) ETL_NOEXCEPT { - mbegin += n; + if (n < size()) + mbegin += n; + else + mbegin = mend; } //************************************************************************* @@ -436,7 +439,10 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 void remove_suffix(size_type n) ETL_NOEXCEPT { - mend -= n; + if (n < size()) + mend -= n; + else + mend = mbegin; } //************************************************************************* diff --git a/test/test_string_view.cpp b/test/test_string_view.cpp index a9314dd2..18374e38 100644 --- a/test/test_string_view.cpp +++ b/test/test_string_view.cpp @@ -542,6 +542,50 @@ namespace CHECK(isEqual); } + //************************************************************************* + TEST(test_remove_prefix_to_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()); + } + { + View view(original.c_str()); + + // remove n > size() should result in an empty view + view.remove_prefix(original.size() + 1); + CHECK_EQUAL(view.begin(), view.end()); + CHECK(view.empty()); + } + } + + //************************************************************************* + TEST(test_remove_suffix_to_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()); + } + { + View view(original.c_str()); + + // remove n > size() should result in an empty view + view.remove_suffix(original.size() + 1); + CHECK_EQUAL(view.begin(), view.end()); + CHECK(view.empty()); + } + } + //************************************************************************* TEST(test_copy) { From c0bf9dfd4b75291cc77142dc0fca48289725a4cd Mon Sep 17 00:00:00 2001 From: Mike Bloom Date: Thu, 16 Jul 2026 20:22:49 -0400 Subject: [PATCH 2/4] Add function documentation --- include/etl/string_view.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/etl/string_view.h b/include/etl/string_view.h index 7fb82c96..b1d41ca4 100644 --- a/include/etl/string_view.h +++ b/include/etl/string_view.h @@ -425,6 +425,7 @@ 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 { @@ -436,6 +437,7 @@ namespace etl //************************************************************************* /// 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 { From db2dd952c3d93c4dd04a5c6d7c9ac37ba6bff8b2 Mon Sep 17 00:00:00 2001 From: Mike Bloom Date: Sun, 19 Jul 2026 20:00:43 -0400 Subject: [PATCH 3/4] Add ETL_ASSERT --- include/etl/string_view.h | 6 ++-- test/test_string_view.cpp | 62 +++++++++++++++++++-------------------- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/include/etl/string_view.h b/include/etl/string_view.h index b1d41ca4..fb76da28 100644 --- a/include/etl/string_view.h +++ b/include/etl/string_view.h @@ -427,8 +427,9 @@ 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) ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS) { + ETL_ASSERT(n <= size(), ETL_ERROR(string_view_bounds)); if (n < size()) mbegin += n; else @@ -439,8 +440,9 @@ namespace etl /// 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) ETL_NOEXCEPT_IF(ETL_NOT_USING_EXCEPTIONS) { + ETL_ASSERT(n <= size(), ETL_ERROR(string_view_bounds)); if (n < size()) mend -= n; else diff --git a/test/test_string_view.cpp b/test/test_string_view.cpp index 18374e38..1d016160 100644 --- a/test/test_string_view.cpp +++ b/test/test_string_view.cpp @@ -543,47 +543,47 @@ namespace } //************************************************************************* - TEST(test_remove_prefix_to_empty) + TEST(test_remove_prefix_empty) { std::string original = "Hello World"; - { - View view(original.c_str()); + 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()); - } - { - View view(original.c_str()); - - // remove n > size() should result in an empty view - view.remove_prefix(original.size() + 1); - CHECK_EQUAL(view.begin(), view.end()); - CHECK(view.empty()); - } + // 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_suffix_to_empty) + TEST(test_remove_prefix_assert) { std::string original = "Hello World"; - { - View view(original.c_str()); + 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()); - } - { - View view(original.c_str()); + // remove n > size() should trigger ETL_ASSERT + CHECK_THROW(view.remove_prefix(original.size() + 1), etl::string_view_bounds); + } - // remove n > size() should result in an empty view - view.remove_suffix(original.size() + 1); - CHECK_EQUAL(view.begin(), view.end()); - CHECK(view.empty()); - } + //************************************************************************* + 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); } //************************************************************************* From 44793651d1f447d4f3705dd61fdb8ae1b31a45d5 Mon Sep 17 00:00:00 2001 From: Mike Bloom Date: Wed, 22 Jul 2026 19:38:15 -0400 Subject: [PATCH 4/4] Remove ETL_NOEXCEPT_IF --- include/etl/string_view.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/etl/string_view.h b/include/etl/string_view.h index fb76da28..81446bcf 100644 --- a/include/etl/string_view.h +++ b/include/etl/string_view.h @@ -427,7 +427,7 @@ 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_IF(ETL_NOT_USING_EXCEPTIONS) + ETL_CONSTEXPR14 void remove_prefix(size_type n) { ETL_ASSERT(n <= size(), ETL_ERROR(string_view_bounds)); if (n < size()) @@ -440,7 +440,7 @@ namespace etl /// 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_IF(ETL_NOT_USING_EXCEPTIONS) + ETL_CONSTEXPR14 void remove_suffix(size_type n) { ETL_ASSERT(n <= size(), ETL_ERROR(string_view_bounds)); if (n < size())