diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-02-14 20:38:46 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-02-14 20:38:46 +0000 |
commit | 42a9c0fc609db364029a05948026d192f09a7618 (patch) | |
tree | fa181b6cd03b755f1e4f69c75fed167e0d13a7cb /vespalib | |
parent | bdc3bb0498c334aa70976c876c3451de3ce01251 (diff) |
Use spaceship operator for stringref ordering.
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/vespa/vespalib/stllike/string.h | 44 |
1 files changed, 19 insertions, 25 deletions
diff --git a/vespalib/src/vespa/vespalib/stllike/string.h b/vespalib/src/vespa/vespalib/stllike/string.h index 6c40c33853b..e310793ecbe 100644 --- a/vespalib/src/vespa/vespalib/stllike/string.h +++ b/vespalib/src/vespa/vespalib/stllike/string.h @@ -122,10 +122,6 @@ public: */ size_type rfind(const char * s, size_type e=npos) const noexcept; [[nodiscard]] int compare(stringref s) const noexcept { return compare(s.data(), s.size()); } - int compare(const char *s, size_type sz) const noexcept { - int diff(memcmp(_s, s, std::min(sz, size()))); - return (diff != 0) ? diff : (size() - sz); - } /** * Returns true iff input string is a prefix of this string. @@ -139,30 +135,28 @@ public: const char & operator [] (size_t i) const noexcept { return _s[i]; } operator std::string () const { return {_s, _sz}; } - bool operator < (const char * s) const noexcept { return compare(s, strlen(s)) < 0; } - bool operator < (const std::string & s) const noexcept { return compare(s.data(), s.size()) < 0; } - bool operator < (stringref s) const noexcept { return compare(s.data(), s.size()) < 0; } - bool operator <= (const char * s) const noexcept { return compare(s, strlen(s)) <= 0; } - bool operator <= (const std::string & s) const noexcept { return compare(s.data(), s.size()) <= 0; } - bool operator <= (stringref s) const noexcept { return compare(s.data(), s.size()) <= 0; } - bool operator != (const char * s) const noexcept { return compare(s, strlen(s)) != 0; } - bool operator != (const std::string & s) const noexcept { return compare(s.data(), s.size()) != 0; } - bool operator != (stringref s) const noexcept { return compare(s.data(), s.size()) != 0; } - bool operator == (const char * s) const noexcept { return compare(s, strlen(s)) == 0; } - bool operator == (const std::string & s) const noexcept { return compare(s.data(), s.size()) == 0; } - bool operator == (stringref s) const noexcept { return compare(s.data(), s.size()) == 0; } - bool operator >= (const char * s) const noexcept { return compare(s, strlen(s)) >= 0; } - bool operator >= (const std::string & s) const noexcept { return compare(s.data(), s.size()) >= 0; } - bool operator >= (stringref s) const noexcept { return compare(s.data(), s.size()) >= 0; } - bool operator > (const char * s) const noexcept { return compare(s, strlen(s)) > 0; } - bool operator > (const std::string & s) const noexcept { return compare(s.data(), s.size()) > 0; } - bool operator > (stringref s) const noexcept { return compare(s.data(), s.size()) > 0; } + std::strong_ordering operator <=>(const char * s) const noexcept { return strong_compare(s, strlen(s)); } + std::strong_ordering operator <=>(const std::string & s) const noexcept { return strong_compare(s.data(), s.size()); } + std::strong_ordering operator <=>(stringref s) const noexcept { return strong_compare(s.data(), s.size()); } + bool operator ==(const char * s) const noexcept { return strong_compare(s, strlen(s)) == std::strong_ordering::equal; } + bool operator ==(const std::string & s) const noexcept { return strong_compare(s.data(), s.size()) == std::strong_ordering::equal; } + bool operator ==(stringref s) const noexcept { return strong_compare(s.data(), s.size()) == std::strong_ordering::equal; } + friend std::ostream & operator << (std::ostream & os, stringref v); private: + std::strong_ordering strong_compare(const char *s, size_type sz) const noexcept { + int res = compare(s, sz); + return (res < 0) + ? std::strong_ordering::less + : (res > 0) + ? std::strong_ordering::greater + : std::strong_ordering::equal; + } + int compare(const char *s, size_type sz) const noexcept { + int diff(memcmp(_s, s, std::min(sz, size()))); + return (diff != 0) ? diff : (size() - sz); + } const char *_s; size_type _sz; - friend bool operator == (const std::string & a, stringref b) noexcept { return b == a; } - friend bool operator != (const std::string & a, stringref b) noexcept { return b != a; } - friend std::ostream & operator << (std::ostream & os, stringref v); }; |