#ifndef _WX_HASH_H__
#define _WX_HASH_H__
-#if defined(__GNUG__) && !defined(__APPLE__)
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma interface "hash.h"
#endif
void*,
wxHashTableHash,
wxHashTableEqual,
- wxHashTableBaseBase );
+ wxHashTableBaseBaseBase );
+
+// hack: we should really have HASH_MULTI(MAP|SET), but this requires
+// less work
+
+class WXDLLIMPEXP_BASE wxHashTableBaseBase : public wxHashTableBaseBaseBase
+{
+public:
+ wxHashTableBaseBase(size_t size, const wxHashTableHash& hash,
+ const wxHashTableEqual& equal)
+ : wxHashTableBaseBaseBase(size, hash, equal)
+ { }
+
+ void multi_insert(const wxHashKeyValue& key, void* value)
+ {
+ CreateNodeLast(value_type(key, value));
+ }
+};
class WXDLLIMPEXP_BASE wxHashTableBase
{
wxHashTableEqual( keyType ) ),
m_keyType( keyType ) { }
- ~wxHashTableBase()
+ ~wxHashTableBase() { Clear(); }
+
+ size_t GetCount() const { return m_map.size(); }
+
+ void Clear()
{
if( m_keyType == wxKEY_STRING )
{
delete[] tmp; // used in operator++
}
}
+ m_map.clear();
}
-
- size_t GetCount() const { return m_map.size(); }
protected:
void DoPut( long key, void* data )
{
+ wxASSERT( m_keyType == wxKEY_INTEGER );
+
wxHashKeyValue k; k.integer = key;
- m_map[k] = data;
+ m_map.multi_insert(k, data);
}
void DoPut( const wxChar* key, void* data )
{
+ wxASSERT( m_keyType == wxKEY_STRING );
+
wxHashKeyValue k;
- k.string = new wxChar[wxStrlen(key) + 1];
- wxStrcpy(k.string, key);
- m_map[k] = data;
+ k.string = wxStrcpy(new wxChar[wxStrlen(key) + 1], key);
+ m_map.multi_insert(k, data);
}
void* DoGet( long key ) const
{
+ wxASSERT( m_keyType == wxKEY_INTEGER );
+
wxHashKeyValue k; k.integer = key;
wxHashTableBaseBase::const_iterator it = m_map.find( k );
void* DoGet( const wxChar* key ) const
{
+ wxASSERT( m_keyType == wxKEY_STRING );
+
wxHashKeyValue k; k.string = (wxChar*)key;
wxHashTableBaseBase::const_iterator it = m_map.find( k );
void* DoDelete( long key )
{
+ wxASSERT( m_keyType == wxKEY_INTEGER );
+
wxHashKeyValue k; k.integer = key;
wxHashTableBaseBase::iterator it = m_map.find( k );
void* DoDelete( const wxChar* key )
{
+ wxASSERT( m_keyType == wxKEY_STRING );
+
wxHashKeyValue k; k.string = (wxChar*)key;
wxHashTableBaseBase::iterator it = m_map.find( k );
dummy* operator->() { return (dummy*)this; }
};
- typedef class compatibility_iterator citer;
+ typedef compatibility_iterator citer;
class dummy
{
it lit = i->m_iter;
return citer( i->m_hash, ++lit );
}
- citer GetPrevious() const
- {
- citer* i = (citer*)this;
- it lit = i->m_iter;
- return citer( i->m_hash, ++lit );
- }
void SetData( wxObject* e )
{
citer* i = (citer*)this;
wxObject *Get(const wxChar *value) const { return (wxObject*)DoGet( value ); }
// Deletes entry and returns data if found
- wxObject *Delete(long key) { return (wxObject*)DoGet( key ); }
- wxObject *Delete(const wxChar *key) { return (wxObject*)DoGet( key ); }
+ wxObject *Delete(long key) { return (wxObject*)DoDelete( key ); }
+ wxObject *Delete(const wxChar *key) { return (wxObject*)DoDelete( key ); }
#if 0
// Construct your own integer key from a string, e.g. in case
return it;
}
- void Clear() { m_map.clear(); }
+ void Clear() { wxHashTableBase::Clear(); }
+
+ size_t GetCount() const { return wxHashTableBase::GetCount(); }
private:
compatibility_iterator m_iter;
};
((listclass *)m_hashTable[slot])->Append(value, data); \
m_count++; \
} \
+ \
+ DECLARE_NO_COPY_CLASS(hashclass) \
}
#endif