Commit 9523b2e5 authored by Sergei Golubchik's avatar Sergei Golubchik

cleanup: C++11 range-based for loop for Hash_set<>

parent 42d0579c
...@@ -71,7 +71,7 @@ my_bool my_hash_init2(PSI_memory_key psi_key, HASH *hash, size_t growth_size, ...@@ -71,7 +71,7 @@ my_bool my_hash_init2(PSI_memory_key psi_key, HASH *hash, size_t growth_size,
void (*free_element)(void*), uint flags); void (*free_element)(void*), uint flags);
void my_hash_free(HASH *tree); void my_hash_free(HASH *tree);
void my_hash_reset(HASH *hash); void my_hash_reset(HASH *hash);
uchar *my_hash_element(HASH *hash, size_t idx); uchar *my_hash_element(const HASH *hash, size_t idx);
uchar *my_hash_search(const HASH *info, const uchar *key, size_t length); uchar *my_hash_search(const HASH *info, const uchar *key, size_t length);
uchar *my_hash_search_using_hash_value(const HASH *info, uchar *my_hash_search_using_hash_value(const HASH *info,
my_hash_value_type hash_value, my_hash_value_type hash_value,
......
...@@ -762,7 +762,7 @@ my_bool my_hash_update(HASH *hash, uchar *record, uchar *old_key, ...@@ -762,7 +762,7 @@ my_bool my_hash_update(HASH *hash, uchar *record, uchar *old_key,
} }
uchar *my_hash_element(HASH *hash, size_t idx) uchar *my_hash_element(const HASH *hash, size_t idx)
{ {
if (idx < hash->records) if (idx < hash->records)
return dynamic_element(&hash->array,idx,HASH_LINK*)->data; return dynamic_element(&hash->array,idx,HASH_LINK*)->data;
......
...@@ -97,10 +97,8 @@ struct st_debug_sync_globals ...@@ -97,10 +97,8 @@ struct st_debug_sync_globals
void clear_set() void clear_set()
{ {
Hash_set<LEX_CSTRING>::Iterator it{ds_signal_set}; for (LEX_CSTRING &s : ds_signal_set)
LEX_CSTRING *s; my_free(&s);
while ((s= it++))
my_free(s);
ds_signal_set.clear(); ds_signal_set.clear();
} }
......
...@@ -85,26 +85,53 @@ class Hash_set ...@@ -85,26 +85,53 @@ class Hash_set
return reinterpret_cast<T*>(my_hash_element(const_cast<HASH*>(&m_hash), i)); return reinterpret_cast<T*>(my_hash_element(const_cast<HASH*>(&m_hash), i));
} }
/** An iterator over hash elements. Is not insert-stable. */ /** An iterator over hash elements. Is not insert-stable. */
class Iterator;
using value_type= T;
using iterator= Iterator;
using const_iterator= const Iterator;
Iterator begin() const { return Iterator(*this, 0); }
Iterator end() const { return Iterator(*this, m_hash.records); }
class Iterator class Iterator
{ {
public: public:
Iterator(Hash_set &hash_set) using iterator_category= std::forward_iterator_tag;
: m_hash(&hash_set.m_hash), using value_type= T;
m_idx(0) using difference_type= std::ptrdiff_t;
{} using pointer= T *;
/** using reference= T &;
Return the current element and reposition the iterator to the next
element. Iterator(const Hash_set &hash_set, uint idx=0) :
*/ m_hash(&hash_set.m_hash), m_idx(idx) {}
inline T *operator++(int)
Iterator &operator++()
{
DBUG_ASSERT(m_idx < m_hash->records);
m_idx++;
return *this;
}
T &operator*()
{
return *reinterpret_cast<T *>(my_hash_element(m_hash, m_idx));
}
T *operator->()
{
return reinterpret_cast<T *>(my_hash_element(m_hash, m_idx));
}
bool operator==(const typename Hash_set<T>::iterator &rhs)
{
return m_idx == rhs.m_idx && m_hash == rhs.m_hash;
}
bool operator!=(const typename Hash_set<T>::iterator &rhs)
{ {
if (m_idx < m_hash->records) return m_idx != rhs.m_idx || m_hash != rhs.m_hash;
return reinterpret_cast<T*>(my_hash_element(m_hash, m_idx++));
return NULL;
} }
void rewind() { m_idx= 0; }
private: private:
HASH *m_hash; const HASH *m_hash;
uint m_idx; uint m_idx;
}; };
private: private:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment