Skip to content

Commit 0720e5f

Browse files
committed
Fix string_view::compare to take sizes into account
1 parent 95aaa82 commit 0720e5f

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

include/nonstd/string.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,11 @@ class basic_string_view
482482

483483
string_nodiscard string_constexpr int compare( basic_string_view v ) const string_noexcept
484484
{
485-
return Traits::compare( data(), v.data(), (std::min)(size(), v.size()) );
485+
auto const result = Traits::compare( data(), v.data(), (std::min)(size(), v.size()) );
486+
487+
return result != 0
488+
? result
489+
: (size() == v.size()) ? 0 : (size() < v.size()) ? -1 : +1;
486490
}
487491

488492
string_nodiscard string_constexpr bool empty() const string_noexcept { return size_ == 0; }

test/string.t.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -792,24 +792,31 @@ CASE( "split_right: split string into two-element tuple given set of delimiter c
792792

793793
CASE( "compare: negative, zero or positive for lsh is less than, equal to or greater than rhs" )
794794
{
795+
EXPECT( compare("abc", "abc") == 0 );
796+
EXPECT( compare("aaa", "abc") != 0 );
795797
EXPECT( compare("aaa", "abc") < 0 );
796798
EXPECT( compare("aaa", "abc") <= 0 );
797799
EXPECT( compare("abc", "abc") <= 0 );
798-
EXPECT( compare("abc", "abc") == 0 );
799800
EXPECT( compare("abc", "aaa") >= 0 );
800801
EXPECT( compare("abc", "aaa") > 0 );
801802

803+
EXPECT_NOT( compare("abc", "abcd") == 0 );
804+
EXPECT ( compare("abc", "abcd") != 0 );
805+
806+
EXPECT( compare(std::string("abc"), std::string("abc")) == 0 );
807+
EXPECT( compare(std::string("aaa"), std::string("abc")) != 0 );
802808
EXPECT( compare(std::string("aaa"), std::string("abc")) < 0 );
803809
EXPECT( compare(std::string("aaa"), std::string("abc")) <= 0 );
804810
EXPECT( compare(std::string("abc"), std::string("abc")) <= 0 );
805811
EXPECT( compare(std::string("abc"), std::string("abc")) == 0 );
806812
EXPECT( compare(std::string("abc"), std::string("aaa")) >= 0 );
807813
EXPECT( compare(std::string("abc"), std::string("aaa")) > 0 );
808814

815+
EXPECT( compare(std17::string_view("abc"), std17::string_view("abc")) == 0 );
816+
EXPECT( compare(std17::string_view("aaa"), std17::string_view("abc")) != 0 );
809817
EXPECT( compare(std17::string_view("aaa"), std17::string_view("abc")) < 0 );
810818
EXPECT( compare(std17::string_view("aaa"), std17::string_view("abc")) <= 0 );
811819
EXPECT( compare(std17::string_view("abc"), std17::string_view("abc")) <= 0 );
812-
EXPECT( compare(std17::string_view("abc"), std17::string_view("abc")) == 0 );
813820
EXPECT( compare(std17::string_view("abc"), std17::string_view("aaa")) >= 0 );
814821
EXPECT( compare(std17::string_view("abc"), std17::string_view("aaa")) > 0 );
815822
}

0 commit comments

Comments
 (0)