aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-02-14 20:38:46 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-02-14 20:38:46 +0000
commit42a9c0fc609db364029a05948026d192f09a7618 (patch)
treefa181b6cd03b755f1e4f69c75fed167e0d13a7cb /vespalib
parentbdc3bb0498c334aa70976c876c3451de3ce01251 (diff)
Use spaceship operator for stringref ordering.
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/vespa/vespalib/stllike/string.h44
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);
};