X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6aa33060cd9132116fa3431b4889342e2f655853..17808a759627b03c2acbe7333dd2386557e1b804:/include/wx/hash.h diff --git a/include/wx/hash.h b/include/wx/hash.h index 194302ae7a..e825e0c2d1 100644 --- a/include/wx/hash.h +++ b/include/wx/hash.h @@ -5,35 +5,20 @@ // Modified by: VZ at 25.02.00: type safe hashes with WX_DECLARE_HASH() // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) +// Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_HASH_H__ #define _WX_HASH_H__ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma interface "hash.h" -#endif - #include "wx/defs.h" - -#if !wxUSE_STL && WXWIN_COMPATIBILITY_2_4 - #define wxUSE_OLD_HASH_TABLE 1 -#else - #define wxUSE_OLD_HASH_TABLE 0 -#endif +#include "wx/string.h" #if !wxUSE_STL #include "wx/object.h" #else - class WXDLLIMPEXP_BASE wxObject; -#endif -#if wxUSE_OLD_HASH_TABLE - #include "wx/list.h" -#endif -#if WXWIN_COMPATIBILITY_2_4 - #include "wx/dynarray.h" + class WXDLLIMPEXP_FWD_BASE wxObject; #endif // the default size of the hash @@ -46,84 +31,29 @@ * the list to find the desired item. */ -// ---------------------------------------------------------------------------- -// this is the base class for object hashes: hash tables which contain -// pointers to objects -// ---------------------------------------------------------------------------- - -#if wxUSE_OLD_HASH_TABLE - -class WXDLLIMPEXP_BASE wxHashTableBase : public wxObject -{ -public: - wxHashTableBase(); - - void Create(wxKeyType keyType = wxKEY_INTEGER, - size_t size = wxHASH_SIZE_DEFAULT); - void Destroy(); - - size_t GetSize() const { return m_hashSize; } - size_t GetCount() const { return m_count; } - - void DeleteContents(bool flag); - -protected: - // find the node for (key, value) - wxNodeBase *GetNode(long key, long value) const; - - // the array of lists in which we store the values for given key hash - wxListBase **m_hashTable; - - // the size of m_lists array - size_t m_hashSize; - - // the type of indexing we use - wxKeyType m_keyType; - - // the total number of elements in the hash - size_t m_count; - - // should we delete our data? - bool m_deleteContents; - -private: - // no copy ctor/assignment operator (yet) - DECLARE_NO_COPY_CLASS(wxHashTableBase) -}; - -#else // if !wxUSE_OLD_HASH_TABLE - -#if !defined(wxENUM_KEY_TYPE_DEFINED) -#define wxENUM_KEY_TYPE_DEFINED - -enum wxKeyType -{ - wxKEY_NONE, - wxKEY_INTEGER, - wxKEY_STRING -}; - -#endif - union wxHashKeyValue { long integer; - wxChar *string; + wxString *string; }; +// for some compilers (AIX xlC), defining it as friend inside the class is not +// enough, so provide a real forward declaration +class WXDLLIMPEXP_FWD_BASE wxHashTableBase; + class WXDLLIMPEXP_BASE wxHashTableBase_Node { - friend class WXDLLIMPEXP_BASE wxHashTableBase; - typedef class WXDLLIMPEXP_BASE wxHashTableBase_Node _Node; + friend class WXDLLIMPEXP_FWD_BASE wxHashTableBase; + typedef class WXDLLIMPEXP_FWD_BASE wxHashTableBase_Node _Node; public: wxHashTableBase_Node( long key, void* value, wxHashTableBase* table ); - wxHashTableBase_Node( const wxChar* key, void* value, + wxHashTableBase_Node( const wxString& key, void* value, wxHashTableBase* table ); ~wxHashTableBase_Node(); long GetKeyInteger() const { return m_key.integer; } - const wxChar* GetKeyString() const { return m_key.string; } + const wxString& GetKeyString() const { return *m_key.string; } void* GetData() const { return m_value; } void SetData( void* data ) { m_value = data; } @@ -154,12 +84,12 @@ class WXDLLIMPEXP_BASE wxHashTableBase : public wxObject #endif { - friend class WXDLLIMPEXP_BASE wxHashTableBase_Node; + friend class WXDLLIMPEXP_FWD_BASE wxHashTableBase_Node; public: typedef wxHashTableBase_Node Node; wxHashTableBase(); - virtual ~wxHashTableBase() { }; + virtual ~wxHashTableBase() { } void Create( wxKeyType keyType = wxKEY_INTEGER, size_t size = wxHASH_SIZE_DEFAULT ); @@ -171,15 +101,15 @@ public: void DeleteContents( bool flag ) { m_deleteContents = flag; } - static long MakeKey(const wxChar *string); + static long MakeKey(const wxString& string); protected: void DoPut( long key, long hash, void* data ); - void DoPut( const wxChar* key, long hash, void* data ); + void DoPut( const wxString& key, long hash, void* data ); void* DoGet( long key, long hash ) const; - void* DoGet( const wxChar* key, long hash ) const; + void* DoGet( const wxString& key, long hash ) const; void* DoDelete( long key, long hash ); - void* DoDelete( const wxChar* key, long hash ); + void* DoDelete( const wxString& key, long hash ); private: // Remove the node from the hash, *only called from @@ -223,101 +153,18 @@ private: DECLARE_NO_COPY_CLASS(wxHashTableBase) }; -#endif // wxUSE_OLD_HASH_TABLE - -#if !wxUSE_STL - -#if WXWIN_COMPATIBILITY_2_4 - -// ---------------------------------------------------------------------------- -// a hash table which stores longs -// ---------------------------------------------------------------------------- - -class WXDLLIMPEXP_BASE wxHashTableLong : public wxObject -{ -public: - wxHashTableLong(size_t size = wxHASH_SIZE_DEFAULT) - { Init(size); } - virtual ~wxHashTableLong(); - - 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) -}; - -// ---------------------------------------------------------------------------- -// wxStringHashTable: a hash table which indexes strings with longs -// ---------------------------------------------------------------------------- - -class WXDLLIMPEXP_BASE wxStringHashTable : public wxObject -{ -public: - wxStringHashTable(size_t sizeTable = wxHASH_SIZE_DEFAULT); - virtual ~wxStringHashTable(); - - // add a string associated with this key to the table - void Put(long key, const wxString& value); - - // get the string from the key: if not found, an empty string is returned - // and the wasFound is set to FALSE if not NULL - wxString Get(long key, bool *wasFound = NULL) const; - - // remove the item, returning TRUE if the item was found and deleted - bool Delete(long key) const; - - // clean up - void Destroy(); - -private: - wxArrayLong **m_keys; - wxArrayString **m_values; - - // the size of array above - size_t m_hashSize; - - DECLARE_NO_COPY_CLASS(wxStringHashTable) -}; - -#endif // WXWIN_COMPATIBILITY_2_4 - -#endif // !wxUSE_STL - // ---------------------------------------------------------------------------- // for compatibility only // ---------------------------------------------------------------------------- -#if !wxUSE_OLD_HASH_TABLE - class WXDLLIMPEXP_BASE wxHashTable_Node : public wxHashTableBase_Node { - friend class WXDLLIMPEXP_BASE wxHashTable; + friend class WXDLLIMPEXP_FWD_BASE wxHashTable; public: wxHashTable_Node( long key, void* value, wxHashTableBase* table ) : wxHashTableBase_Node( key, value, table ) { } - wxHashTable_Node( const wxChar* key, void* value, + wxHashTable_Node( const wxString& key, void* value, wxHashTableBase* table ) : wxHashTableBase_Node( key, value, table ) { } @@ -348,42 +195,35 @@ public: const wxHashTable& operator=( const wxHashTable& ); - void Destroy() { Clear(); } - // key and value are the same void Put(long value, wxObject *object) { DoPut( value, value, object ); } - void Put(long hash, long value, wxObject *object) - { DoPut( value, hash, object ); } - void Put(const wxChar *value, wxObject *object) + void Put(long lhash, long value, wxObject *object) + { DoPut( value, lhash, object ); } + void Put(const wxString& value, wxObject *object) { DoPut( value, MakeKey( value ), object ); } - void Put(long hash, const wxChar *value, wxObject *object) - { DoPut( value, hash, object ); } + void Put(long lhash, const wxString& value, wxObject *object) + { DoPut( value, lhash, object ); } // key and value are the same wxObject *Get(long value) const { return (wxObject*)DoGet( value, value ); } - wxObject *Get(long hash, long value) const - { return (wxObject*)DoGet( value, hash ); } - wxObject *Get(const wxChar *value) const + wxObject *Get(long lhash, long value) const + { return (wxObject*)DoGet( value, lhash ); } + wxObject *Get(const wxString& value) const { return (wxObject*)DoGet( value, MakeKey( value ) ); } - wxObject *Get(long hash, const wxChar *value) const - { return (wxObject*)DoGet( value, hash ); } + wxObject *Get(long lhash, const wxString& value) const + { return (wxObject*)DoGet( value, lhash ); } // Deletes entry and returns data if found wxObject *Delete(long key) { return (wxObject*)DoDelete( key, key ); } - wxObject *Delete(long hash, long key) - { return (wxObject*)DoDelete( key, hash ); } - wxObject *Delete(const wxChar *key) + wxObject *Delete(long lhash, long key) + { return (wxObject*)DoDelete( key, lhash ); } + wxObject *Delete(const wxString& key) { return (wxObject*)DoDelete( key, MakeKey( key ) ); } - wxObject *Delete(long hash, const wxChar *key) - { return (wxObject*)DoDelete( key, hash ); } - - // Construct your own integer key from a string, e.g. in case - // you need to combine it with something - long MakeKey(const wxChar *string) const - { return wxHashTableBase::MakeKey(string); } + wxObject *Delete(long lhash, const wxString& key) + { return (wxObject*)DoDelete( key, lhash ); } // Way of iterating through whole hash table (e.g. to delete everything) // Not necessary, of course, if you're only storing pointers to @@ -395,8 +235,6 @@ public: size_t GetCount() const { return wxHashTableBase::GetCount(); } protected: - virtual void DoDeleteContents( wxHashTableBase_Node* node ); - // copy helper void DoCopy( const wxHashTable& copy ); @@ -404,6 +242,8 @@ protected: // m_curr to it and m_currBucket to its bucket void GetNextNode( size_t bucketStart ); private: + virtual void DoDeleteContents( wxHashTableBase_Node* node ); + // current node Node* m_curr; @@ -411,101 +251,6 @@ private: size_t m_currBucket; }; -#else // if wxUSE_OLD_HASH_TABLE - -class WXDLLIMPEXP_BASE wxHashTable : public wxObject -{ -public: - typedef wxNode Node; - typedef wxNode* compatibility_iterator; - - int n; - int current_position; - wxNode *current_node; - - unsigned int key_type; - wxList **hash_table; - - wxHashTable(int the_key_type = wxKEY_INTEGER, - int size = wxHASH_SIZE_DEFAULT); - ~wxHashTable(); - - // copy ctor and assignment operator - wxHashTable(const wxHashTable& table) : wxObject() - { DoCopy(table); } - wxHashTable& operator=(const wxHashTable& table) - { Clear(); DoCopy(table); return *this; } - - void DoCopy(const wxHashTable& table); - - void Destroy(); - - bool Create(int the_key_type = wxKEY_INTEGER, - int size = wxHASH_SIZE_DEFAULT); - - // Note that there are 2 forms of Put, Get. - // With a key and a value, the *value* will be checked - // when a collision is detected. Otherwise, if there are - // 2 items with a different value but the same key, - // we'll retrieve the WRONG ONE. So where possible, - // supply the required value along with the key. - // In fact, the value-only versions make a key, and still store - // the value. The use of an explicit key might be required - // e.g. when combining several values into one key. - // When doing that, it's highly likely we'll get a collision, - // e.g. 1 + 2 = 3, 2 + 1 = 3. - - // key and value are NOT necessarily the same - void Put(long key, long value, wxObject *object); - void Put(long key, const wxChar *value, wxObject *object); - - // key and value are the same - void Put(long value, wxObject *object); - void Put(const wxChar *value, wxObject *object); - - // key and value not the same - wxObject *Get(long key, long value) const; - wxObject *Get(long key, const wxChar *value) const; - - // key and value are the same - wxObject *Get(long value) const; - wxObject *Get(const wxChar *value) const; - - // Deletes entry and returns data if found - wxObject *Delete(long key); - wxObject *Delete(const wxChar *key); - - wxObject *Delete(long key, int value); - wxObject *Delete(long key, const wxChar *value); - - // Construct your own integer key from a string, e.g. in case - // you need to combine it with something - long MakeKey(const wxChar *string) const; - - // Way of iterating through whole hash table (e.g. to delete everything) - // Not necessary, of course, if you're only storing pointers to - // objects maintained separately - - void BeginFind(); - Node* Next(); - - void DeleteContents(bool flag); - void Clear(); - - // Returns number of nodes - size_t GetCount() const { return m_count; } - -private: - size_t m_count; // number of elements in the hashtable - bool m_deleteContents; - - DECLARE_DYNAMIC_CLASS(wxHashTable) -}; - -#endif // wxUSE_OLD_HASH_TABLE - -#if !wxUSE_OLD_HASH_TABLE - // defines a new type safe hash table which stores the elements of type eltype // in lists of class listclass #define _WX_DECLARE_HASH(eltype, dummy, hashclass, classexp) \ @@ -518,86 +263,22 @@ private: \ virtual ~hashclass() { Destroy(); } \ \ - void Destroy() { Clear(); } \ void Put(long key, eltype *data) { DoPut(key, key, (void*)data); } \ - void Put(long hash, long key, eltype *data) \ - { DoPut(key, hash, (void*)data); } \ + void Put(long lhash, long key, eltype *data) \ + { DoPut(key, lhash, (void*)data); } \ eltype *Get(long key) const { return (eltype*)DoGet(key, key); } \ - eltype *Get(long hash, long key) const \ - { return (eltype*)DoGet(key, hash); } \ + eltype *Get(long lhash, long key) const \ + { return (eltype*)DoGet(key, lhash); } \ eltype *Delete(long key) { return (eltype*)DoDelete(key, key); } \ - eltype *Delete(long hash, long key) \ - { return (eltype*)DoDelete(key, hash); } \ - protected: \ + eltype *Delete(long lhash, long key) \ + { return (eltype*)DoDelete(key, lhash); } \ + private: \ virtual void DoDeleteContents( wxHashTableBase_Node* node ) \ { delete (eltype*)node->GetData(); } \ \ DECLARE_NO_COPY_CLASS(hashclass) \ } -#else // if wxUSE_OLD_HASH_TABLE - -#define _WX_DECLARE_HASH(eltype, listclass, hashclass, classexp) \ - classexp hashclass : public wxHashTableBase \ - { \ - public: \ - hashclass(wxKeyType keyType = wxKEY_INTEGER, \ - size_t size = wxHASH_SIZE_DEFAULT) \ - { Create(keyType, size); } \ - \ - ~hashclass() { Destroy(); } \ - \ - void Put(long key, long val, eltype *data) { DoPut(key, val, data); } \ - void Put(long key, eltype *data) { DoPut(key, key, data); } \ - \ - eltype *Get(long key, long value) const \ - { \ - wxNodeBase *node = GetNode(key, value); \ - return node ? ((listclass::Node *)node)->GetData() : (eltype *)0; \ - } \ - eltype *Get(long key) const { return Get(key, key); } \ - \ - eltype *Delete(long key, long value) \ - { \ - eltype *data; \ - \ - wxNodeBase *node = GetNode(key, value); \ - if ( node ) \ - { \ - data = ((listclass::Node *)node)->GetData(); \ - \ - delete node; \ - m_count--; \ - } \ - else \ - { \ - data = (eltype *)0; \ - } \ - \ - return data; \ - } \ - eltype *Delete(long key) { return Delete(key, key); } \ - \ - protected: \ - void DoPut(long key, long value, eltype *data) \ - { \ - size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); \ - \ - if ( !m_hashTable[slot] ) \ - { \ - m_hashTable[slot] = new listclass(m_keyType); \ - if ( m_deleteContents ) \ - m_hashTable[slot]->DeleteContents(TRUE); \ - } \ - \ - ((listclass *)m_hashTable[slot])->Append(value, data); \ - m_count++; \ - } \ - \ - DECLARE_NO_COPY_CLASS(hashclass) \ - } - -#endif // wxUSE_OLD_HASH_TABLE // this macro is to be used in the user code #define WX_DECLARE_HASH(el, list, hash) \ @@ -629,5 +310,4 @@ private: (hash).Clear(); \ } -#endif - // _WX_HASH_H__ +#endif // _WX_HASH_H__