kmail Library API Documentation

kmdict.cpp

00001 /* simple hash table for kmail. inspired by QDict */ 00002 /* Author: Ronen Tzur <rtzur@shani.net> */ 00003 00004 #ifdef HAVE_CONFIG_H 00005 #include <config.h> 00006 #endif 00007 00008 #include "kmdict.h" 00009 00010 #include <string.h> 00011 00012 //----------------------------------------------------------------------------- 00013 00014 KMDict::KMDict(int size) 00015 { 00016 init(size); 00017 } 00018 00019 //----------------------------------------------------------------------------- 00020 00021 KMDict::~KMDict() 00022 { 00023 clear(); 00024 } 00025 00026 //----------------------------------------------------------------------------- 00027 00028 void KMDict::init(int size) 00029 { 00030 mSize = size; 00031 mVecs = new KMDictItem *[mSize]; 00032 memset(mVecs, 0, mSize * sizeof(KMDictItem *)); 00033 } 00034 00035 //----------------------------------------------------------------------------- 00036 00037 void KMDict::clear() 00038 { 00039 if (!mVecs) 00040 return; 00041 for (int i = 0; i < mSize; i++) { 00042 KMDictItem *item = mVecs[i]; 00043 while (item) { 00044 KMDictItem *nextItem = item->next; 00045 delete item; 00046 item = nextItem; 00047 } 00048 } 00049 delete [] mVecs; 00050 mVecs = 0; 00051 } 00052 00053 //----------------------------------------------------------------------------- 00054 00055 void KMDict::replace(long key, KMDictItem *item) 00056 { 00057 item->key = key; 00058 int idx = (unsigned long)key % mSize; // insert in 00059 item->next = mVecs[idx]; // appropriate 00060 mVecs[idx] = item; // column 00061 removeFollowing(item, key); // remove other items with same key 00062 } 00063 00064 //----------------------------------------------------------------------------- 00065 00066 void KMDict::remove(long key) 00067 { 00068 int idx = (unsigned long)key % mSize; 00069 KMDictItem *item = mVecs[idx]; 00070 00071 if (item) { 00072 if (item->key == key) { // if first in the column 00073 mVecs[idx] = item->next; 00074 delete item; 00075 } else 00076 removeFollowing(item, key); // if deep in the column 00077 } 00078 } 00079 00080 //----------------------------------------------------------------------------- 00081 00082 void KMDict::removeFollowing(KMDictItem *item, long key) 00083 { 00084 while (item) { 00085 KMDictItem *itemNext = item->next; 00086 if (itemNext && itemNext->key == key) { 00087 KMDictItem *itemNextNext = itemNext->next; 00088 delete itemNext; 00089 item->next = itemNextNext; 00090 } else 00091 item = itemNext; 00092 } 00093 } 00094 00095 //----------------------------------------------------------------------------- 00096 00097 KMDictItem *KMDict::find(long key) 00098 { 00099 int idx = (unsigned long)key % mSize; 00100 KMDictItem *item = mVecs[idx]; 00101 while (item) { 00102 if (item->key == key) 00103 break; 00104 item = item->next; 00105 } 00106 return item; 00107 }
KDE Logo
This file is part of the documentation for kmail Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Jul 28 23:58:00 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003