diff options
| author | Dan Engelbrecht <[email protected]> | 2022-05-12 10:40:31 +0200 |
|---|---|---|
| committer | Dan Engelbrecht <[email protected]> | 2022-05-12 10:41:37 +0200 |
| commit | 992f21133f83f6e0a2a99136906cb2e07d6c0842 (patch) | |
| tree | c6097bea3e0a6da924c63f06418b1e83779a0c25 | |
| parent | manual <=> calls for strings in CacheKey (diff) | |
| download | zen-992f21133f83f6e0a2a99136906cb2e07d6c0842.tar.xz zen-992f21133f83f6e0a2a99136906cb2e07d6c0842.zip | |
Add caseSensitiveCompareStrings and manual <=> and == operator for CacheKey
MacOS clang compiler does not implement a default <=> operator for string
| -rw-r--r-- | zencore/include/zencore/string.h | 23 | ||||
| -rw-r--r-- | zenutil/include/zenutil/cache/cachekey.h | 14 |
2 files changed, 33 insertions, 4 deletions
diff --git a/zencore/include/zencore/string.h b/zencore/include/zencore/string.h index 012ee73ee..fe838ac19 100644 --- a/zencore/include/zencore/string.h +++ b/zencore/include/zencore/string.h @@ -9,6 +9,7 @@ #include <string.h> #include <charconv> #include <codecvt> +#include <compare> #include <concepts> #include <optional> #include <span> @@ -795,6 +796,28 @@ StrCaseCompare(const char* Lhs, const char* Rhs, int64_t Length = -1) #endif } +/** + * @brief + * Helper function to implement case sensitive spaceship operator for strings. + * MacOS clang version we use does not implement <=> for std::string + * @param Lhs string + * @param Rhs string + * @return std::strong_ordering indicating relationship between Lhs and Rhs + */ +inline auto +caseSensitiveCompareStrings(const std::string& Lhs, const std::string& Rhs) +{ + if (Lhs == Rhs) + { + return std::strong_ordering::equal; + } + if (Lhs < Rhs) + { + return std::strong_ordering::less; + } + return std::strong_ordering::greater; +} + ////////////////////////////////////////////////////////////////////////// /** diff --git a/zenutil/include/zenutil/cache/cachekey.h b/zenutil/include/zenutil/cache/cachekey.h index 569a31441..427c99435 100644 --- a/zenutil/include/zenutil/cache/cachekey.h +++ b/zenutil/include/zenutil/cache/cachekey.h @@ -23,13 +23,19 @@ struct CacheKey auto operator<=>(const CacheKey& that) const { - if (auto cmp = Namespace <=> that.Namespace; cmp != 0) - return cmp; - if (auto cmp = Bucket <=> that.Bucket; cmp != 0) - return cmp; + if (auto n = caseSensitiveCompareStrings(Namespace, that.Namespace); n != std::strong_ordering::equal) + { + return n; + } + if (auto b = caseSensitiveCompareStrings(Bucket, that.Bucket); b != std::strong_ordering::equal) + { + return b; + } return Hash <=> that.Hash; } + auto operator==(const CacheKey& that) const { return (*this <=> that) == std::strong_ordering::equal; } + static const CacheKey Empty; }; |