/*------------------------------------------------------------------------*/ /* */ /* DICT.H */ /* */ /* Copyright (c) 1993, 1994 Borland International */ /* All Rights Reserved */ /* */ /*------------------------------------------------------------------------*/ #if !defined( CLASSLIB_DICT_H ) #define CLASSLIB_DICT_H #if !defined( CLASSLIB_DEFS_H ) #include #endif #if !defined( CLASSLIB_SHDDEL_H ) #include #endif #if !defined( CLASSLIB_HASHIMP_H ) #include #endif #pragma option -Vo- #if defined( BI_CLASSLIB_NO_po ) #pragma option -po- #endif /*------------------------------------------------------------------------*/ /* */ /* template class TMDictionaryAsHashTable */ /* template class TMDictionaryAsHashTableIterator */ /* */ /* Managed dictionary and iterator */ /* */ /* Implements the dictionary container using a hash table. Assumes */ /* that T is of class TAssociation. */ /* */ /*------------------------------------------------------------------------*/ template class TMDictionaryAsHashTableIterator; template class TMDictionaryAsHashTable : public TShouldDelete { public: friend class TMDictionaryAsHashTableIterator; TMDictionaryAsHashTable( unsigned size = DEFAULT_HASH_TABLE_SIZE ) : HashTable(size) { } int Add( const T& t ) { return Find( t ) ? 0 : HashTable.Add( t ); } int Detach( const T& t, DeleteType dt = DefDelete ); T *Find( const T& t ) { return HashTable.Find( t ); } void Flush( DeleteType dt = DefDelete ); void ForEach( void (*func)(T&, void *), void *args ) { HashTable.ForEach( func, args ); } unsigned GetItemsInContainer() const { return HashTable.GetItemsInContainer(); } int IsEmpty() const { return HashTable.IsEmpty(); } protected: TMHashTableImp HashTable; private: static void DeleteElement( T& t, void * ); }; template int TMDictionaryAsHashTable::Detach( const T& t, DeleteType dt = DefDelete ) { if( DelObj(dt) ) { T *assoc = Find(t); if( assoc ) assoc->DeleteElements(); } return HashTable.Detach( t ); } template void TMDictionaryAsHashTable::Flush( DeleteType dt = DefDelete ) { if( DelObj(dt) ) { HashTable.ForEach( DeleteElement, 0 ); } HashTable.Flush(); } template void TMDictionaryAsHashTable::DeleteElement( T& t, void * ) { t.DeleteElements(); } template class TMDictionaryAsHashTableIterator : public TMHashTableIteratorImp { public: TMDictionaryAsHashTableIterator( const TMDictionaryAsHashTable& t ) : TMHashTableIteratorImp( t.HashTable ) { } }; /*------------------------------------------------------------------------*/ /* */ /* template class TDictionaryAsHashTable */ /* template class TDictionaryAsHashTableIterator */ /* */ /* Standard dictionary and iterator */ /* */ /*------------------------------------------------------------------------*/ template class TDictionaryAsHashTable : public TMDictionaryAsHashTable { public: TDictionaryAsHashTable( unsigned size = DEFAULT_HASH_TABLE_SIZE ) : TMDictionaryAsHashTable(size) { } }; template class TDictionaryAsHashTableIterator : public TMDictionaryAsHashTableIterator { public: TDictionaryAsHashTableIterator( const TDictionaryAsHashTable& t ) : TMDictionaryAsHashTableIterator( t ) { } }; /*------------------------------------------------------------------------*/ /* */ /* template class TMIDictionaryAsHashTable */ /* template class TMIDictionaryAsHashTableIterator */ /* */ /* Managed indirect dictionary and iterator */ /* */ /*------------------------------------------------------------------------*/ template class TMIDictionaryAsHashTableIterator; template class TMIDictionaryAsHashTable : public TShouldDelete { public: friend class TMIDictionaryAsHashTableIterator; TMIDictionaryAsHashTable( unsigned size = DEFAULT_HASH_TABLE_SIZE ) : HashTable(size) { } int Add( T *t ) { return Find( t ) ? 0 : HashTable.Add( t ); } int Detach( T *t, DeleteType dt = DefDelete ); T *Find( T *t ) { return HashTable.Find( t ); } void Flush( DeleteType dt = DefDelete ); void ForEach( void (*func)(T&, void *), void *args ) { HashTable.ForEach( func, args ); } unsigned GetItemsInContainer() const { return HashTable.GetItemsInContainer(); } int IsEmpty() const { return HashTable.IsEmpty(); } protected: TMIHashTableImp HashTable; private: static void DeleteElement( T& t, void * ); }; template int TMIDictionaryAsHashTable::Detach( T *t, DeleteType dt = DefDelete ) { if( DelObj(dt) ) { T *assoc = Find(t); if( assoc ) assoc->DeleteElements(); } return HashTable.Detach( t, DelObj(dt) ); } template void TMIDictionaryAsHashTable::Flush( DeleteType dt = DefDelete ) { if( DelObj(dt) ) { HashTable.ForEach( DeleteElement, 0 ); } HashTable.Flush(DelObj(dt)); } template void TMIDictionaryAsHashTable::DeleteElement( T& t, void * ) { t.DeleteElements(); } template class TMIDictionaryAsHashTableIterator : public TMIHashTableIteratorImp { public: TMIDictionaryAsHashTableIterator( const TMIDictionaryAsHashTable& t ) : TMIHashTableIteratorImp( t.HashTable ) { } }; /*------------------------------------------------------------------------*/ /* */ /* template class TIDictionaryAsHashTable */ /* template class TIDictionaryAsHashTableIterator */ /* */ /* Standard indirect dictionary and iterator */ /* */ /*------------------------------------------------------------------------*/ template class TIDictionaryAsHashTableIterator; template class TIDictionaryAsHashTable : public TMIDictionaryAsHashTable { public: friend class TIDictionaryAsHashTableIterator; TIDictionaryAsHashTable( unsigned size = DEFAULT_HASH_TABLE_SIZE ) : TMIDictionaryAsHashTable(size) { } }; template class TIDictionaryAsHashTableIterator : public TMIDictionaryAsHashTableIterator { public: TIDictionaryAsHashTableIterator( const TIDictionaryAsHashTable& t ) : TMIDictionaryAsHashTableIterator( t ) { } }; /*------------------------------------------------------------------------*/ /* */ /* template class TDictionary */ /* template class TDictionaryIterator */ /* */ /* Easy names for TDictionaryAsHashTable and */ /* TDictionaryAsHashTableIterator */ /* */ /*------------------------------------------------------------------------*/ template class TDictionary : public TDictionaryAsHashTable { public: TDictionary( unsigned size = DEFAULT_HASH_TABLE_SIZE ) : TDictionaryAsHashTable( size ) { } }; template class TDictionaryIterator : public TDictionaryAsHashTableIterator { public: TDictionaryIterator( const TDictionary& a ) : TDictionaryAsHashTableIterator(a) { } }; #if defined( BI_CLASSLIB_NO_po ) #pragma option -po. #endif #pragma option -Vo. #endif // CLASSLIB_DICT_H