From c2bb85e9e38ee35758e0076485bb6665f2c229f5 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 29 Feb 2000 17:19:36 +0000 Subject: [PATCH] added wxHashTableLong git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6354 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/hash.h | 37 ++++++++++++++++ src/common/hash.cpp | 102 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) diff --git a/include/wx/hash.h b/include/wx/hash.h index 650ffe1eee..4320f720c8 100644 --- a/include/wx/hash.h +++ b/include/wx/hash.h @@ -17,6 +17,7 @@ #endif #include "wx/list.h" +#include "wx/dynarray.h" // the default size of the hash #define wxHASH_SIZE_DEFAULT (1000) @@ -71,6 +72,42 @@ private: DECLARE_NO_COPY_CLASS(wxHashTableBase); }; +// ---------------------------------------------------------------------------- +// a hash table which stores longs +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxHashTableLong : public wxObject +{ +public: + wxHashTableLong(size_t size = wxHASH_SIZE_DEFAULT) { Init(size); } + + void Create(size_t size = wxHASH_SIZE_DEFAULT); + void Destroy(); + + size_t GetSize() const { return m_hashSize; } + size_t GetCount() const { return m_count; } + + void Put(long key, long value); + long Get(long key) const; + long Delete(long key); + +protected: + void Init(size_t size); + +private: + wxArrayLong **m_values, + **m_keys; + + // the size of array above + size_t m_hashSize; + + // the total number of elements in the hash + size_t m_count; + + // not implemented yet + DECLARE_NO_COPY_CLASS(wxHashTableLong); +}; + // ---------------------------------------------------------------------------- // for compatibility only // ---------------------------------------------------------------------------- diff --git a/src/common/hash.cpp b/src/common/hash.cpp index ef635a1be1..1aa13adf84 100644 --- a/src/common/hash.cpp +++ b/src/common/hash.cpp @@ -119,6 +119,108 @@ wxNodeBase *wxHashTableBase::GetNode(long key, long value) const return node; } +// ---------------------------------------------------------------------------- +// wxHashTableLong +// ---------------------------------------------------------------------------- + +void wxHashTableLong::Init(size_t size) +{ + m_hashSize = size; + m_values = new wxArrayLong *[size]; + m_keys = new wxArrayLong *[size]; + + for ( size_t n = 0; n < m_hashSize; n++ ) + { + m_values[n] = + m_keys[n] = (wxArrayLong *)NULL; + } + + m_count = 0; +} + +void wxHashTableLong::Destroy() +{ + for ( size_t n = 0; n < m_hashSize; n++ ) + { + delete m_values[n]; + delete m_keys[n]; + } + + delete [] m_values; + delete [] m_keys; + m_hashSize = 0; + m_count = 0; +} + +void wxHashTableLong::Put(long key, long value) +{ + wxCHECK_RET( m_hashSize, _T("must call Create() first") ); + + size_t slot = (size_t)abs(key % m_hashSize); + + if ( !m_keys[slot] ) + { + m_keys[slot] = new wxArrayLong; + m_values[slot] = new wxArrayLong; + } + + m_keys[slot]->Add(key); + m_values[slot]->Add(value); + + m_count++; +} + +long wxHashTableLong::Get(long key) const +{ + wxCHECK_MSG( m_hashSize, wxNOT_FOUND, _T("must call Create() first") ); + + size_t slot = (size_t)abs(key % m_hashSize); + + wxArrayLong *keys = m_keys[slot]; + if ( keys ) + { + size_t count = keys->GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( keys->Item(n) == key ) + { + return m_values[slot]->Item(n); + } + } + } + + return wxNOT_FOUND; +} + +long wxHashTableLong::Delete(long key) +{ + wxCHECK_MSG( m_hashSize, wxNOT_FOUND, _T("must call Create() first") ); + + size_t slot = (size_t)abs(key % m_hashSize); + + wxArrayLong *keys = m_keys[slot]; + if ( keys ) + { + size_t count = keys->GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( keys->Item(n) == key ) + { + long val = m_values[slot]->Item(n); + + keys->RemoveAt(n); + m_values[slot]->RemoveAt(n); + + m_count--; + + return val; + } + } + } + + return wxNOT_FOUND; +} + // ---------------------------------------------------------------------------- // old not type safe wxHashTable // ---------------------------------------------------------------------------- -- 2.45.2