diff --git a/example/static_cstring/static_cstring.hpp b/example/static_cstring/static_cstring.hpp index e674932..be01681 100644 --- a/example/static_cstring/static_cstring.hpp +++ b/example/static_cstring/static_cstring.hpp @@ -363,7 +363,17 @@ public: constexpr int compare(const CharT* s) const noexcept { - return compare(basic_static_cstring(s)); + const size_type lhs_sz = size(); + const size_type rhs_sz = traits_type::length(s); + const int result = traits_type::compare(data_, s, (std::min)(lhs_sz, rhs_sz)); + + return result != 0 + ? result + : lhs_sz < rhs_sz + ? -1 + : lhs_sz > rhs_sz + ? 1 + : 0; } // Conversions. diff --git a/example/static_cstring/static_cstring_test.cpp b/example/static_cstring/static_cstring_test.cpp index 145e693..96aa4b2 100644 --- a/example/static_cstring/static_cstring_test.cpp +++ b/example/static_cstring/static_cstring_test.cpp @@ -443,6 +443,35 @@ testCStringComparison() BOOST_TEST(s.compare("abd") < 0); BOOST_TEST(s.compare("abb") > 0); } + + // compare(const CharT*) must not throw when the argument is longer + // than the static capacity. + { + static_cstring<3> s("abc"); + BOOST_TEST(s.compare("abcd") < 0); + BOOST_TEST(s.compare("abcdefghijklmnop") < 0); + BOOST_TEST(s.compare("abb") > 0); + BOOST_TEST(s.compare("abd") < 0); + BOOST_TEST(s.compare("abc") == 0); + BOOST_TEST(s.compare("ab") > 0); + BOOST_TEST(s.compare("") > 0); + } + + // Same via operator== / operator!= with an over-long C string. + { + static_cstring<3> s("abc"); + BOOST_TEST(!(s == "abcd")); + BOOST_TEST(s != "abcd"); + BOOST_TEST(!("abcd" == s)); + BOOST_TEST("abcd" != s); + } + + // Empty static_cstring vs non-empty C string. + { + static_cstring<5> empty; + BOOST_TEST(empty.compare("hello") < 0); + BOOST_TEST(empty.compare("") == 0); + } } static