|
- /* simple hash table for kmail. inspired by TQDict */
- /* Author: Ronen Tzur <rtzur@shani.net> */
-
- #ifdef HAVE_CONFIG_H
- #include <config.h>
- #endif
-
- #include "kmdict.h"
- #include "kmglobal.h"
- #include <kdebug.h>
-
- #include <string.h>
- //-----------------------------------------------------------------------------
-
- KMDict::KMDict( int size )
- {
- init( ( int ) KMail::nextPrime( size ) );
- //kdDebug( 5006 ) << "KMMDict::KMDict Size: " << mSize << endl;
- }
-
- //-----------------------------------------------------------------------------
-
- KMDict::~KMDict()
- {
- clear();
- }
-
- //-----------------------------------------------------------------------------
-
- void KMDict::init(int size)
- {
- mSize = size;
- mVecs = new KMDictItem *[mSize];
- memset(mVecs, 0, mSize * sizeof(KMDictItem *));
- }
-
- //-----------------------------------------------------------------------------
-
- void KMDict::clear()
- {
- if (!mVecs)
- return;
- for (int i = 0; i < mSize; i++) {
- KMDictItem *item = mVecs[i];
- while (item) {
- KMDictItem *nextItem = item->next;
- delete item;
- item = nextItem;
- }
- }
- delete [] mVecs;
- mVecs = 0;
- }
-
- //-----------------------------------------------------------------------------
-
- void KMDict::replace( long key, KMDictItem *item )
- {
- insert( key, item );
- removeFollowing( item, key ); // remove other items with same key
- }
-
- //-----------------------------------------------------------------------------
-
-
- void KMDict::insert( long key, KMDictItem *item )
- {
- item->key = key;
- int idx = (unsigned long)key % mSize; // insert in
- item->next = mVecs[idx]; // appropriate
- mVecs[idx] = item; // column
- }
-
- //-----------------------------------------------------------------------------
-
- void KMDict::remove(long key)
- {
- int idx = (unsigned long)key % mSize;
- KMDictItem *item = mVecs[idx];
-
- if (item) {
- if (item->key == key) { // if first in the column
- mVecs[idx] = item->next;
- delete item;
- } else
- removeFollowing(item, key); // if deep in the column
- }
- }
-
- //-----------------------------------------------------------------------------
-
- void KMDict::removeFollowing(KMDictItem *item, long key)
- {
- while (item) {
- KMDictItem *itemNext = item->next;
- if (itemNext && itemNext->key == key) {
- KMDictItem *itemNextNext = itemNext->next;
- delete itemNext;
- item->next = itemNextNext;
- } else
- item = itemNext;
- }
- }
-
- //-----------------------------------------------------------------------------
-
- KMDictItem *KMDict::find(long key)
- {
- int idx = (unsigned long)key % mSize;
- KMDictItem *item = mVecs[idx];
- while (item) {
- if (item->key == key)
- break;
- item = item->next;
- }
- return item;
- }
|