diff options
Diffstat (limited to 'abseil-cpp/absl/container/internal/hash_function_defaults.h')
-rw-r--r-- | abseil-cpp/absl/container/internal/hash_function_defaults.h | 78 |
1 files changed, 63 insertions, 15 deletions
diff --git a/abseil-cpp/absl/container/internal/hash_function_defaults.h b/abseil-cpp/absl/container/internal/hash_function_defaults.h index 0683422..a3613b4 100644 --- a/abseil-cpp/absl/container/internal/hash_function_defaults.h +++ b/abseil-cpp/absl/container/internal/hash_function_defaults.h @@ -56,6 +56,10 @@ #include "absl/strings/cord.h" #include "absl/strings/string_view.h" +#ifdef ABSL_HAVE_STD_STRING_VIEW +#include <string_view> +#endif + namespace absl { ABSL_NAMESPACE_BEGIN namespace container_internal { @@ -78,24 +82,26 @@ struct StringHash { } }; +struct StringEq { + using is_transparent = void; + bool operator()(absl::string_view lhs, absl::string_view rhs) const { + return lhs == rhs; + } + bool operator()(const absl::Cord& lhs, const absl::Cord& rhs) const { + return lhs == rhs; + } + bool operator()(const absl::Cord& lhs, absl::string_view rhs) const { + return lhs == rhs; + } + bool operator()(absl::string_view lhs, const absl::Cord& rhs) const { + return lhs == rhs; + } +}; + // Supports heterogeneous lookup for string-like elements. struct StringHashEq { using Hash = StringHash; - struct Eq { - using is_transparent = void; - bool operator()(absl::string_view lhs, absl::string_view rhs) const { - return lhs == rhs; - } - bool operator()(const absl::Cord& lhs, const absl::Cord& rhs) const { - return lhs == rhs; - } - bool operator()(const absl::Cord& lhs, absl::string_view rhs) const { - return lhs == rhs; - } - bool operator()(absl::string_view lhs, const absl::Cord& rhs) const { - return lhs == rhs; - } - }; + using Eq = StringEq; }; template <> @@ -105,6 +111,48 @@ struct HashEq<absl::string_view> : StringHashEq {}; template <> struct HashEq<absl::Cord> : StringHashEq {}; +#ifdef ABSL_HAVE_STD_STRING_VIEW + +template <typename TChar> +struct BasicStringHash { + using is_transparent = void; + + size_t operator()(std::basic_string_view<TChar> v) const { + return absl::Hash<std::basic_string_view<TChar>>{}(v); + } +}; + +template <typename TChar> +struct BasicStringEq { + using is_transparent = void; + bool operator()(std::basic_string_view<TChar> lhs, + std::basic_string_view<TChar> rhs) const { + return lhs == rhs; + } +}; + +// Supports heterogeneous lookup for w/u16/u32 string + string_view + char*. +template <typename TChar> +struct BasicStringHashEq { + using Hash = BasicStringHash<TChar>; + using Eq = BasicStringEq<TChar>; +}; + +template <> +struct HashEq<std::wstring> : BasicStringHashEq<wchar_t> {}; +template <> +struct HashEq<std::wstring_view> : BasicStringHashEq<wchar_t> {}; +template <> +struct HashEq<std::u16string> : BasicStringHashEq<char16_t> {}; +template <> +struct HashEq<std::u16string_view> : BasicStringHashEq<char16_t> {}; +template <> +struct HashEq<std::u32string> : BasicStringHashEq<char32_t> {}; +template <> +struct HashEq<std::u32string_view> : BasicStringHashEq<char32_t> {}; + +#endif // ABSL_HAVE_STD_STRING_VIEW + // Supports heterogeneous lookup for pointers and smart pointers. template <class T> struct HashEq<T*> { |