Index: src/core/SkTHash.h |
diff --git a/src/core/SkTHash.h b/src/core/SkTHash.h |
index b47f8fa766009f5fd455b1a98e06317917dc2a21..849c850b702f08dacd1782f6a64cf9b9f5802172 100644 |
--- a/src/core/SkTHash.h |
+++ b/src/core/SkTHash.h |
@@ -65,12 +65,21 @@ public: |
} |
// Call fn on every entry in the table. You may mutate the entries, but be very careful. |
- template <typename Arg> |
- void foreach(void(*fn)(T*, Arg), Arg arg) { |
+ template <typename Fn> // f(T*) |
+ void foreach(Fn&& fn) { |
for (int i = 0; i < fCapacity; i++) { |
- Slot& s = fSlots[i]; |
- if (!s.empty()) { |
- fn(&s.val, arg); |
+ if (!fSlots[i].empty()) { |
+ fn(&fSlots[i].val); |
+ } |
+ } |
+ } |
+ |
+ // Call fn on every entry in the table. You may not mutate anything. |
+ template <typename Fn> // f(T) or f(const T&) |
+ void foreach(Fn&& fn) const { |
+ for (int i = 0; i < fCapacity; i++) { |
+ if (!fSlots[i].empty()) { |
+ fn(fSlots[i].val); |
} |
} |
} |
@@ -145,7 +154,7 @@ private: |
// Maps K->V. A more user-friendly wrapper around SkTHashTable, suitable for most use cases. |
// K and V are treated as ordinary copyable C++ types, with no assumed relationship between the two. |
-template <typename K, typename V, uint32_t(*HashK)(const K&)> |
+template <typename K, typename V, uint32_t(*HashK)(const K&) = &SkGoodHash> |
class SkTHashMap : SkNoncopyable { |
public: |
SkTHashMap() {} |
@@ -176,7 +185,16 @@ public: |
} |
// Call fn on every key/value pair in the table. You may mutate the value but not the key. |
- void foreach(void(*fn)(K, V*)) { fTable.foreach(ForEach, fn); } |
+ template <typename Fn> // f(K, V*) or f(const K&, V*) |
+ void foreach(Fn&& fn) { |
+ fTable.foreach([&fn](Pair* p){ fn(p->key, &p->val); }); |
+ } |
+ |
+ // Call fn on every key/value pair in the table. You may not mutate anything. |
+ template <typename Fn> // f(K, V), f(const K&, V), f(K, const V&) or f(const K&, const V&). |
+ void foreach(Fn&& fn) const { |
+ fTable.foreach([&fn](const Pair& p){ fn(p.key, p.val); }); |
+ } |
private: |
struct Pair { |
@@ -185,13 +203,12 @@ private: |
static const K& GetKey(const Pair& p) { return p.key; } |
static uint32_t Hash(const K& key) { return HashK(key); } |
}; |
- static void ForEach(Pair* p, void (*fn)(K, V*)) { fn(p->key, &p->val); } |
SkTHashTable<Pair, K> fTable; |
}; |
// A set of T. T is treated as an ordiary copyable C++ type. |
-template <typename T, uint32_t(*HashT)(const T&)> |
+template <typename T, uint32_t(*HashT)(const T&) = &SkGoodHash> |
class SkTHashSet : SkNoncopyable { |
public: |
SkTHashSet() {} |