@@ -56,16 +56,26 @@ template <typename K> class Hash {
5656template <> class Hash <char *> {
5757 public:
5858 uint32_t operator ()(const char *s) const { return _str_hash (s); }
59+ uint32_t operator ()(const std::string_view &s) const { return _str_hash_len (s.data (), s.size ()); }
5960};
6061
6162template <> class Hash <const char *> {
6263 public:
6364 uint32_t operator ()(const char *s) const { return _str_hash (s); }
65+ uint32_t operator ()(const std::string_view &s) const { return _str_hash_len (s.data (), s.size ()); }
66+ };
67+
68+ template <> class Hash <std::string_view> {
69+ public:
70+ uint32_t operator ()(const std::string &s) const { return _str_hash_len (s.c_str (), s.length ()); }
71+ uint32_t operator ()(const std::string_view &s) const { return _str_hash_len (s.data (), s.size ()); }
72+ uint32_t operator ()(const char *s) const { return _str_hash (s); }
6473};
6574
6675template <> class Hash <std::string> {
6776 public:
6877 uint32_t operator ()(const std::string &s) const { return _str_hash_len (s.c_str (), s.length ()); }
78+ uint32_t operator ()(const std::string_view &s) const { return _str_hash_len (s.data (), s.size ()); }
6979 uint32_t operator ()(const char *s) const { return _str_hash (s); }
7080};
7181
@@ -77,11 +87,13 @@ template <typename K> class Equal : std::equal_to<K> {
7787template <> class Equal <char *> {
7888 public:
7989 bool operator ()(const char *k1, const char *k2) const { return strcmp (k1, k2) == 0 ; }
90+ bool operator ()(const char *k1, std::string_view k2) const { return k2 == k1; }
8091};
8192
8293template <> class Equal <const char *> {
8394 public:
8495 bool operator ()(const char *k1, const char *k2) const { return strcmp (k1, k2) == 0 ; }
96+ bool operator ()(const char *k1, std::string_view k2) const { return k2 == k1; }
8597};
8698
8799template <> class Equal <std::string> {
@@ -138,11 +150,17 @@ class HashSet32 : HashFunc, KeyEqual, Allocator {
138150 HashSet32 (const HashSet32 &rhs) = delete ;
139151 HashSet32 &operator =(const HashSet32 &rhs) = delete ;
140152
141- HashSet32 (HashSet32 &&rhs) noexcept { (*this ) = std::move (rhs); }
153+ HashSet32 (HashSet32 &&rhs) noexcept : ctrl_(nullptr ), nodes_(nullptr ), capacity_(0 ), size_(0 ) {
154+ (*this ) = std::move (rhs);
155+ }
142156 HashSet32 &operator =(HashSet32 &&rhs) noexcept {
143157 if (this == &rhs) {
144158 return (*this );
145159 }
160+ if (ctrl_) {
161+ clear ();
162+ this ->deallocate (ctrl_, mem_size (capacity_));
163+ }
146164 if constexpr (std::allocator_traits<Allocator>::propagate_on_container_move_assignment::value) {
147165 Allocator::operator =(static_cast <Allocator &&>(rhs));
148166 }
@@ -252,7 +270,7 @@ class HashSet32 : HashFunc, KeyEqual, Allocator {
252270 }
253271
254272 template <typename K2 > K *Find (const uint32_t hash, const K2 &key) {
255- return const_cast <K *>(const_cast < const HashSet32 *>( this )-> Find (hash, key));
273+ return const_cast <K *>(std::as_const (* this ). Find (hash, key));
256274 }
257275
258276 Node *GetOrNull (const uint32_t index) {
0 commit comments