You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.0 KiB
82 lines
2.0 KiB
/* simple hash table for kmail. inspired by QDict |
|
*/ |
|
|
|
#ifndef __KMDICT |
|
#define __KMDICT |
|
|
|
#include <algorithm> |
|
|
|
namespace KMail { |
|
// List of prime numbers shamelessly stolen from GCC STL |
|
enum { num_primes = 29 }; |
|
|
|
static const unsigned long prime_list[ num_primes ] = |
|
{ |
|
31ul, 53ul, 97ul, 193ul, 389ul, |
|
769ul, 1543ul, 3079ul, 6151ul, 12289ul, |
|
24593ul, 49157ul, 98317ul, 196613ul, 393241ul, |
|
786433ul, 1572869ul, 3145739ul, 6291469ul, 12582917ul, |
|
25165843ul, 50331653ul, 100663319ul, 201326611ul, 402653189ul, |
|
805306457ul, 1610612741ul, 3221225473ul, 4294967291ul |
|
}; |
|
|
|
inline unsigned long nextPrime( unsigned long n ) |
|
{ |
|
const unsigned long *first = prime_list; |
|
const unsigned long *last = prime_list + num_primes; |
|
const unsigned long *pos = std::lower_bound( first, last, n ); |
|
return pos == last ? *( last - 1 ) : *pos; |
|
} |
|
|
|
} |
|
|
|
class KMDictItem |
|
{ |
|
public: |
|
long key; |
|
KMDictItem *next; |
|
}; |
|
|
|
|
|
class KMDict |
|
{ |
|
public: |
|
/** Creates a hash table with @p size columns. */ |
|
KMDict(int size = 17); |
|
|
|
/** Destroys the hash table object. */ |
|
~KMDict(); |
|
|
|
/** Initializes the hash table to @p size colums. */ |
|
void init(int size); |
|
|
|
/** Clears the hash table, removing all items. */ |
|
void clear(); |
|
|
|
/** Returns the size of the hash table. */ |
|
int size() { return mSize; } |
|
|
|
/** Inserts an item, replacing old ones with the same key. */ |
|
void replace(long key, KMDictItem *item); |
|
|
|
/** Inserts an item without replacing ones with the same key. */ |
|
void insert(long key, KMDictItem *item); |
|
|
|
/** Removes an item. */ |
|
void remove(long key); |
|
|
|
/** Find an item by key. Returns pointer to it, or 0 if not found. */ |
|
KMDictItem *find(long key); |
|
|
|
protected: |
|
/** Removes all items _following_ @p item with key @p key. */ |
|
void removeFollowing(KMDictItem *item, long key); |
|
|
|
/** The size of the hash. */ |
|
int mSize; |
|
|
|
/** The buckets. */ |
|
KMDictItem **mVecs; |
|
}; |
|
|
|
#endif /* __KMDICT */
|
|
|