From 2740969f948dcf1e27d1a23dd1e45afadbf9857e Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Thu, 1 Nov 2018 15:14:02 +0100 Subject: Use template args for the class, not on the find method. --- vespalib/src/tests/stllike/hash_test.cpp | 8 ++--- vespalib/src/vespa/vespalib/stllike/hash_fun.h | 36 +++++------------------ vespalib/src/vespa/vespalib/stllike/hash_map.h | 19 ++++-------- vespalib/src/vespa/vespalib/stllike/hash_map.hpp | 2 +- vespalib/src/vespa/vespalib/stllike/hash_set.h | 20 ++++--------- vespalib/src/vespa/vespalib/stllike/hash_set.hpp | 4 +-- vespalib/src/vespa/vespalib/stllike/hashtable.h | 16 +++++----- vespalib/src/vespa/vespalib/stllike/hashtable.hpp | 32 +++++++++----------- 8 files changed, 46 insertions(+), 91 deletions(-) (limited to 'vespalib') diff --git a/vespalib/src/tests/stllike/hash_test.cpp b/vespalib/src/tests/stllike/hash_test.cpp index 4feeaef8349..017a16ee7b6 100644 --- a/vespalib/src/tests/stllike/hash_test.cpp +++ b/vespalib/src/tests/stllike/hash_test.cpp @@ -341,11 +341,11 @@ private: struct myhash { size_t operator() (const S & arg) const { return arg.hash(); } + size_t operator() (uint32_t arg) const { return arg; } }; -struct myextract { - uint32_t operator() (const S & arg) const { return arg.a(); } -}; +bool operator == (uint32_t a, const S & b) { return a == b.a(); } +bool operator == (const S & a, uint32_t b) { return a.a() == b; } TEST("test hash set find") { @@ -354,7 +354,7 @@ TEST("test hash set find") set.insert(S(i)); } EXPECT_TRUE(*set.find(S(1)) == S(1)); - hash_set::iterator cit = set.find, std::equal_to >(7); + auto cit = set.find(7); EXPECT_TRUE(*cit == S(7)); } diff --git a/vespalib/src/vespa/vespalib/stllike/hash_fun.h b/vespalib/src/vespa/vespalib/stllike/hash_fun.h index de849b8924e..a3401083f95 100644 --- a/vespalib/src/vespa/vespalib/stllike/hash_fun.h +++ b/vespalib/src/vespa/vespalib/stllike/hash_fun.h @@ -6,20 +6,6 @@ namespace vespalib { -template -struct cast_static { - T operator() (const F & o) const { - return static_cast(o); - } -}; - -template -struct equal_to : public std::binary_function -{ - bool operator()(const L & __x, const R & __y) const { return __x == __y; } - bool operator()(const R & __x, const L & __y) const { return __x == __y; } -}; - template struct hash { // specializations operate as functor for known key types size_t operator() (const K & v) const { @@ -76,22 +62,18 @@ template struct hash { size_t hashValue(const char *str); size_t hashValue(const void *str, size_t sz); -template<> struct hash { - size_t operator() (const char * arg) const { return hashValue(arg); } -}; - -template<> struct hash { - size_t operator() (vespalib::stringref arg) const { return hashValue(arg.data(), arg.size()); } -}; - -template<> struct hash { +struct hash_strings { size_t operator() (const vespalib::string & arg) const { return hashValue(arg.c_str()); } -}; - -template<> struct hash { + size_t operator() (vespalib::stringref arg) const { return hashValue(arg.data(), arg.size()); } + size_t operator() (const char * arg) const { return hashValue(arg); } size_t operator() (const std::string& arg) const { return hashValue(arg.c_str()); } }; +template<> struct hash : hash_strings { }; +template<> struct hash : public hash_strings { }; +template<> struct hash : hash_strings {}; +template<> struct hash : hash_strings {}; + template struct size { size_t operator() (const V & arg) const { return arg.size(); } }; @@ -100,6 +82,4 @@ template struct zero { size_t operator() (const V & ) const { return 0; } }; - } // namespace vespalib - diff --git a/vespalib/src/vespa/vespalib/stllike/hash_map.h b/vespalib/src/vespa/vespalib/stllike/hash_map.h index 929a3740a1d..34b22ba7ca3 100644 --- a/vespalib/src/vespa/vespalib/stllike/hash_map.h +++ b/vespalib/src/vespa/vespalib/stllike/hash_map.h @@ -6,7 +6,7 @@ namespace vespalib { -template< typename K, typename V, typename H = vespalib::hash, typename EQ = std::equal_to, typename M=hashtable_base::prime_modulator > +template< typename K, typename V, typename H = vespalib::hash, typename EQ = std::equal_to<>, typename M=hashtable_base::prime_modulator > class hash_map { public: @@ -51,22 +51,13 @@ public: iterator find(const K & key) { return _ht.find(key); } const_iterator find(const K & key) const { return _ht.find(key); } - template< typename AltKey, typename AltExtract=std::_Identity, typename AltHash=vespalib::hash, typename AltEqual=equal_to > + template< typename AltKey > const_iterator find(const AltKey & key) const { - return _ht.template find(key); + return _ht.template find(key); } - template< typename AltKey, typename AltExtract=std::_Identity, typename AltHash=vespalib::hash, typename AltEqual=equal_to > + template< typename AltKey> iterator find(const AltKey & key) { - return _ht.template find(key); - } - template< typename AltKey, typename AltExtract, typename AltHash=vespalib::hash, typename AltEqual=equal_to > - const_iterator find(const AltKey & key, const AltExtract & altExtract) const { - return _ht.template find(key, altExtract); - } - - template< typename AltKey, typename AltExtract, typename AltHash=vespalib::hash, typename AltEqual=equal_to > - iterator find(const AltKey & key, const AltExtract & altExtract) { - return _ht.template find(key, altExtract); + return _ht.template find(key); } void clear(); diff --git a/vespalib/src/vespa/vespalib/stllike/hash_map.hpp b/vespalib/src/vespa/vespalib/stllike/hash_map.hpp index b526188b8b2..74f1594965a 100644 --- a/vespalib/src/vespa/vespalib/stllike/hash_map.hpp +++ b/vespalib/src/vespa/vespalib/stllike/hash_map.hpp @@ -71,7 +71,7 @@ hash_map::getMemoryUsed() const #define VESPALIB_HASH_MAP_INSTANTIATE_H_E(K, V, H, E) \ VESPALIB_HASH_MAP_INSTANTIATE_H_E_M(K, V, H, E, vespalib::hashtable_base::prime_modulator) -#define VESPALIB_HASH_MAP_INSTANTIATE_H(K, V, H) VESPALIB_HASH_MAP_INSTANTIATE_H_E(K, V, H, std::equal_to) +#define VESPALIB_HASH_MAP_INSTANTIATE_H(K, V, H) VESPALIB_HASH_MAP_INSTANTIATE_H_E(K, V, H, std::equal_to<>) #define VESPALIB_HASH_MAP_INSTANTIATE(K, V) VESPALIB_HASH_MAP_INSTANTIATE_H(K, V, vespalib::hash) diff --git a/vespalib/src/vespa/vespalib/stllike/hash_set.h b/vespalib/src/vespa/vespalib/stllike/hash_set.h index 9756a3083df..7a2db4735aa 100644 --- a/vespalib/src/vespa/vespalib/stllike/hash_set.h +++ b/vespalib/src/vespa/vespalib/stllike/hash_set.h @@ -7,7 +7,7 @@ namespace vespalib { -template< typename K, typename H = vespalib::hash, typename EQ = std::equal_to, typename M=hashtable_base::prime_modulator> +template< typename K, typename H = vespalib::hash, typename EQ = std::equal_to<>, typename M=hashtable_base::prime_modulator> class hash_set { private: @@ -48,21 +48,11 @@ public: template void for_each(Func func) const { _ht.for_each(func); } - template< typename AltKey, typename AltExtract=std::_Identity, typename AltHash=vespalib::hash, typename AltEqual=equal_to > - const_iterator find(const AltKey & key) const { return _ht.template find(key); } + template< typename AltKey > + const_iterator find(const AltKey & key) const { return _ht.template find(key); } - template< typename AltKey, typename AltExtract=std::_Identity, typename AltHash=vespalib::hash, typename AltEqual=equal_to > - iterator find(const AltKey & key) { return _ht.template find(key); } - - template< typename AltKey, typename AltExtract, typename AltHash=vespalib::hash, typename AltEqual=equal_to > - const_iterator find(const AltKey & key, const AltExtract & altExtract) const { - return _ht.template find(key, altExtract); - } - - template< typename AltKey, typename AltExtract, typename AltHash=vespalib::hash, typename AltEqual=equal_to > - iterator find(const AltKey & key, const AltExtract & altExtract) { - return _ht.template find(key, altExtract); - } + template< typename AltKey> + iterator find(const AltKey & key) { return _ht.template find(key); } void clear(); void resize(size_t newSize); diff --git a/vespalib/src/vespa/vespalib/stllike/hash_set.hpp b/vespalib/src/vespa/vespalib/stllike/hash_set.hpp index cf6341218f1..f0427595382 100644 --- a/vespalib/src/vespa/vespalib/stllike/hash_set.hpp +++ b/vespalib/src/vespa/vespalib/stllike/hash_set.hpp @@ -84,11 +84,11 @@ hash_set::insert(K &&value) { #define VESPALIB_HASH_SET_INSTANTIATE(K) \ template class vespalib::hash_set; \ - template class vespalib::hashtable, std::equal_to, std::_Identity>; \ + template class vespalib::hashtable, std::equal_to<>, std::_Identity>; \ template class vespalib::Array>; #define VESPALIB_HASH_SET_INSTANTIATE_H(K, H) \ template class vespalib::hash_set; \ - template class vespalib::hashtable, std::_Identity>; \ + template class vespalib::hashtable, std::_Identity>; \ template class vespalib::Array>; diff --git a/vespalib/src/vespa/vespalib/stllike/hashtable.h b/vespalib/src/vespa/vespalib/stllike/hashtable.h index 612c50ffb61..fa418cbad02 100644 --- a/vespalib/src/vespa/vespalib/stllike/hashtable.h +++ b/vespalib/src/vespa/vespalib/stllike/hashtable.h @@ -235,15 +235,12 @@ public: size_t capacity() const { return _nodes.capacity(); } size_t size() const { return _count; } bool empty() const { return _count == 0; } - template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual > - iterator find(const AltKey & key, const AltExtract & altExtract); - template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual > - iterator find(const AltKey & key) { return find(key, AltExtract()); } + template< typename AltKey> + iterator find(const AltKey & key); iterator find(const Key & key); - template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual > - const_iterator find(const AltKey & key, const AltExtract & altExtract) const; - template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual > - const_iterator find(const AltKey & key) const { return find(key, AltExtract()); } + + template< typename AltKey> + const_iterator find(const AltKey & key) const; const_iterator find(const Key & key) const; template insert_result insert(V && node) { @@ -285,7 +282,8 @@ protected: const Value & getByInternalIndex(size_t index) const { return _nodes[index].getValue(); } template void erase(MoveHandler & moveHandler, next_t h, const const_iterator & key); - next_t hash(const Key & key) const { return modulator(_hasher(key)); } + template + next_t hash(const K & key) const { return modulator(_hasher(key)); } private: Modulator _modulator; size_t _count; diff --git a/vespalib/src/vespa/vespalib/stllike/hashtable.hpp b/vespalib/src/vespa/vespalib/stllike/hashtable.hpp index 2fbe83eb226..60c391a0b7e 100644 --- a/vespalib/src/vespa/vespalib/stllike/hashtable.hpp +++ b/vespalib/src/vespa/vespalib/stllike/hashtable.hpp @@ -95,17 +95,15 @@ hashtable::find(const Key & key) } template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator > -template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual> -typename hashtable::const_iterator -hashtable::find(const AltKey & key, const AltExtract & altExtract) const +template< typename AltKey> +typename hashtable::iterator +hashtable::find(const AltKey & key) { - AltHash altHasher; - next_t h = modulator(altHasher(key)); - if (_nodes[h].valid()) { - AltEqual altEqual; + next_t h = hash(key); + if (__builtin_expect(_nodes[h].valid(), true)) { do { - if (altEqual(altExtract(_keyExtractor(_nodes[h].getValue())), key)) { - return const_iterator(this, h); + if (__builtin_expect(_equal(_keyExtractor(_nodes[h].getValue()), key), true)) { + return iterator(this, h); } h = _nodes[h].getNext(); } while (h != Node::npos); @@ -114,17 +112,15 @@ hashtable::find(const AltKey & k } template< typename Key, typename Value, typename Hash, typename Equal, typename KeyExtract, typename Modulator > -template< typename AltKey, typename AltExtract, typename AltHash, typename AltEqual> -typename hashtable::iterator -hashtable::find(const AltKey & key, const AltExtract & altExtract) +template< typename AltKey> +typename hashtable::const_iterator +hashtable::find(const AltKey & key) const { - AltHash altHasher; - next_t h = modulator(altHasher(key)); - if (_nodes[h].valid()) { - AltEqual altEqual; + next_t h = hash(key); + if (__builtin_expect(_nodes[h].valid(), true)) { do { - if (altEqual(altExtract(_keyExtractor(_nodes[h].getValue())), key)) { - return iterator(this, h); + if (__builtin_expect(_equal(_keyExtractor(_nodes[h].getValue()), key), true)) { + return const_iterator(this, h); } h = _nodes[h].getNext(); } while (h != Node::npos); -- cgit v1.2.3