Make string_{view|ref} remove_prefix and remove_suffix throw on invalid lengths. Addresses issue #73

This commit is contained in:
Marshall Clow 2021-03-01 06:52:49 -08:00
parent 7aafdf92a0
commit 601fc9371f
4 changed files with 36 additions and 8 deletions

View File

@ -147,15 +147,15 @@ namespace boost {
// modifiers
void clear() { len_ = 0; }
void remove_prefix(size_type n) {
if ( n > len_ )
n = len_;
if ( n > size())
BOOST_THROW_EXCEPTION( std::out_of_range ( "string_ref::substr" ) );
ptr_ += n;
len_ -= n;
}
void remove_suffix(size_type n) {
if ( n > len_ )
n = len_;
if ( n > size())
BOOST_THROW_EXCEPTION( std::out_of_range ( "string_ref::substr" ) );
len_ -= n;
}

View File

@ -141,15 +141,15 @@ namespace boost {
void clear() BOOST_NOEXCEPT { len_ = 0; } // Boost extension
BOOST_CXX14_CONSTEXPR void remove_prefix(size_type n) {
if ( n > len_ )
n = len_;
if ( n > size())
BOOST_THROW_EXCEPTION( std::out_of_range ( "string_ref::substr" ) );
ptr_ += n;
len_ -= n;
}
BOOST_CXX14_CONSTEXPR void remove_suffix(size_type n) {
if ( n > len_ )
n = len_;
if ( n > size())
BOOST_THROW_EXCEPTION( std::out_of_range ( "string_ref::substr" ) );
len_ -= n;
}

View File

@ -74,6 +74,13 @@ void test_remove ( const std::string &str ) {
}
}
ref = str;
try {
ref.remove_prefix(ref.size() + 1);
BOOST_TEST(false);
}
catch ( const std::out_of_range &) {}
for ( size_t i = 1; i < sz; ++ i ) {
work = str;
ref = str;
@ -83,6 +90,13 @@ void test_remove ( const std::string &str ) {
ref.remove_suffix (i);
}
}
ref = str;
try {
ref.remove_suffix(ref.size() + 1);
BOOST_TEST(false);
}
catch ( const std::out_of_range &) {}
}
const char *test_strings [] = {

View File

@ -75,6 +75,13 @@ void test_remove ( const std::string &str ) {
}
}
ref = str;
try {
ref.remove_prefix(ref.size() + 1);
BOOST_TEST(false);
}
catch ( const std::out_of_range &) {}
for ( size_t i = 1; i < sz; ++ i ) {
work = str;
ref = str;
@ -84,6 +91,13 @@ void test_remove ( const std::string &str ) {
ref.remove_suffix (i);
}
}
ref = str;
try {
ref.remove_suffix(ref.size() + 1);
BOOST_TEST(false);
}
catch ( const std::out_of_range &) {}
}
void test_hash(const std::string& str) {