Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(430)

Unified Diff: mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h

Issue 2339413004: Allow Mojo structs as map keys (Closed)
Patch Set: Remove left-over import Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h
diff --git a/mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h b/mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h
index edbf27b7d3059e0a1f1429af64a2a62f68688ae3..97ee18ac7e7cd13967ec156bfa6d0f3ed28b9456 100644
--- a/mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h
+++ b/mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h
@@ -8,9 +8,12 @@
#include <type_traits>
#include "mojo/public/cpp/bindings/lib/clone_equals_util.h"
+#include "mojo/public/cpp/bindings/struct_ptr.h"
+#include "third_party/WebKit/Source/wtf/HashFunctions.h"
#include "third_party/WebKit/Source/wtf/HashMap.h"
#include "third_party/WebKit/Source/wtf/Optional.h"
#include "third_party/WebKit/Source/wtf/Vector.h"
+#include "third_party/WebKit/Source/wtf/text/StringHash.h"
#include "third_party/WebKit/Source/wtf/text/WTFString.h"
namespace mojo {
@@ -70,7 +73,103 @@ struct EqualsTraits<WTF::HashMap<K, V>, false> {
}
};
+template <typename T>
+struct HashTraits<WTF::Vector<T>, false> {
Sam McNally 2016/09/21 04:57:58 Ditto for these two.
tibell 2016/09/21 07:10:53 Done.
+ static size_t Hash(size_t seed, const WTF::Vector<T>& value) {
+ for (size_t i = 0; i < value.size(); ++i) {
+ seed = Hash(seed, value[i]);
+ }
+ return seed;
+ }
+};
+
+template <typename K, typename V>
+struct HashTraits<WTF::HashMap<K, V>, false> {
+ static size_t Hash(size_t seed, const WTF::HashMap<K, V>& value) {
+ for (auto iter = value.begin(); iter != value.end(); ++iter) {
+ seed = Hash(seed, iter->key);
+ seed = Hash(seed, iter->value);
+ }
+ return seed;
+ }
+};
+
+template <>
+struct HashTraits<WTF::String, false> {
+ static size_t Hash(size_t seed, const WTF::String& value) {
+ return HashCombine(seed, WTF::StringHash::hash(value));
+ }
+};
+
+template <typename T>
+struct StructPtrHashFn {
+ static unsigned hash(const mojo::StructPtr<T>& value) {
yzshen1 2016/09/20 23:44:39 nit: namespace is not needed (here and changes bel
tibell 2016/09/21 07:10:53 Done. These now all uses hashing/equality on the
+ return mojo::internal::Hash(mojo::internal::kHashSeed, *value.get());
yzshen1 2016/09/20 23:44:39 *value.get(): Is it possible to dereference null p
tibell 2016/09/21 07:10:53 Done.
+ }
+ static bool equal(const mojo::StructPtr<T>& left,
+ const mojo::StructPtr<T>& right) {
+ return left->Equals(*right);
yzshen1 2016/09/20 23:44:39 ditto
tibell 2016/09/21 07:10:53 Done.
+ }
+ static const bool safeToCompareToEmptyOrDeleted = false;
+};
+
+template <typename T>
+struct InlinedStructPtrHashFn {
+ static unsigned hash(const mojo::InlinedStructPtr<T>& value) {
+ return mojo::internal::Hash(mojo::internal::kHashSeed, *value.get());
yzshen1 2016/09/20 23:44:39 ditto
tibell 2016/09/21 07:10:53 Done.
+ }
+ static bool equal(const mojo::InlinedStructPtr<T>& left,
+ const mojo::InlinedStructPtr<T>& right) {
+ return left->Equals(*right);
yzshen1 2016/09/20 23:44:39 ditto
tibell 2016/09/21 07:10:53 Done.
+ }
+ static const bool safeToCompareToEmptyOrDeleted = false;
+};
+
} // namespace internal
} // namespace mojo
+namespace WTF {
+
+template <typename T>
+struct DefaultHash<mojo::StructPtr<T>> {
+ using Hash = mojo::internal::StructPtrHashFn<T>;
+};
+
+template <typename T>
+struct HashTraits<mojo::StructPtr<T>>
+ : public GenericHashTraits<mojo::StructPtr<T>> {
+ static const bool hasIsEmptyValueFunction = true;
+ static bool isEmptyValue(const mojo::StructPtr<T>& value) {
+ return value.is_null();
+ }
+ static void constructDeletedValue(mojo::StructPtr<T>& slot, bool) {
+ mojo::StructPtr<T>::constructDeletedValue(slot);
+ }
+ static bool isDeletedValue(const mojo::StructPtr<T>& value) {
+ return value.isHashTableDeletedValue();
+ }
+};
+
+template <typename T>
+struct DefaultHash<mojo::InlinedStructPtr<T>> {
+ using Hash = mojo::internal::InlinedStructPtrHashFn<T>;
+};
+
+template <typename T>
+struct HashTraits<mojo::InlinedStructPtr<T>>
+ : public GenericHashTraits<mojo::InlinedStructPtr<T>> {
+ static const bool hasIsEmptyValueFunction = true;
+ static bool isEmptyValue(const mojo::InlinedStructPtr<T>& value) {
+ return value.is_null();
+ }
+ static void constructDeletedValue(mojo::InlinedStructPtr<T>& slot, bool) {
+ mojo::InlinedStructPtr<T>::constructDeletedValue(slot);
+ }
+ static bool isDeletedValue(const mojo::InlinedStructPtr<T>& value) {
+ return value.isHashTableDeletedValue();
+ }
+};
+
+} // namespace WTF
+
#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_CLONE_EQUALS_UTIL_H_

Powered by Google App Engine
This is Rietveld 408576698