00001
00063 #ifndef ABA_HASH_H
00064 #define ABA_HASH_H
00065
00066 #include <iostream>
00067 using namespace std;
00068
00069 class ABA_GLOBAL;
00070 class ABA_STRING;
00071
00072 #include "abacus/abacusroot.h"
00073
00074 template<class KeyType,class ItemType> class ABA_HASH;
00075
00076 #ifdef ABACUS_PARALLEL
00077 class ABA_ID;
00078 #endif
00079
00080 #ifdef ABACUS_NEW_TEMPLATE_SYNTAX
00081 template <class KeyType, class ItemType>
00082 class ABA_HASHITEM;
00083
00084 template <class KeyType, class ItemType>
00085 class ABA_HASH;
00086
00087 template <class KeyType, class ItemType>
00088 ostream &operator<< (ostream &out, const ABA_HASHITEM<KeyType, ItemType> &rhs);
00089
00090 template <class KeyType, class ItemType>
00091 ostream &operator<< (ostream &out, const ABA_HASH<KeyType, ItemType> &hash);
00092 #endif
00093
00094 template <class KeyType, class ItemType>
00095 class ABA_HASHITEM : public ABA_ABACUSROOT {
00096 friend class ABA_HASH<KeyType, ItemType>;
00097
00098 public:
00099
00105 ABA_HASHITEM(const KeyType &key, const ItemType &item);
00106
00107 #ifdef ABACUS_NEW_TEMPLATE_SYNTAX
00108
00113 friend ostream &operator<< <> (ostream &,
00114 const ABA_HASHITEM<KeyType, ItemType> &);
00115 #else
00116
00121 friend ostream &operator<< (ostream &out,
00122 const ABA_HASHITEM<KeyType, ItemType> &rhs);
00123 #endif
00124
00128 ABA_HASHITEM<KeyType, ItemType> *next();
00129 private:
00130 KeyType key_;
00131 ItemType item_;
00132 ABA_HASHITEM<KeyType, ItemType> *next_;
00133 };
00134
00135
00136 template <class KeyType, class ItemType>
00137 class ABA_HASH : public ABA_ABACUSROOT {
00138 public:
00139
00146 ABA_HASH(ABA_GLOBAL *glob, int size);
00147
00151 ~ABA_HASH();
00152 #ifdef ABACUS_NEW_TEMPLATE_SYNTAX
00153
00165 friend ostream &operator<< <> (ostream &out,
00166 const ABA_HASH<KeyType, ItemType> &hash);
00167 #else
00168
00180 friend ostream &operator<< (ostream &out,
00181 const ABA_HASH<KeyType, ItemType> &hash);
00182 #endif
00183
00193 void insert(const KeyType &newKey, const ItemType &newItem);
00194
00202 void overWrite(const KeyType &newKey, const ItemType &newItem);
00203
00213 ItemType *find(const KeyType &key);
00214
00225 bool find(const KeyType &key, const ItemType &item);
00226
00239 ItemType *initializeIteration(const KeyType &key);
00240
00255 ItemType *next(const KeyType &key);
00257
00265 int remove(const KeyType &key);
00266
00277 int remove(const KeyType &key, const ItemType &item);
00278
00281 int size() const;
00282
00287 int nCollisions() const;
00288
00293 void resize(int newSize);
00294
00295 private:
00296
00305 int hf(int key);
00306
00311 int hf(unsigned key);
00312
00317 int hf(const ABA_STRING &string);
00318 #ifdef ABACUS_PARALLEL
00319
00326 int hf(const ABA_ID &id);
00327 #endif
00328
00331 ABA_GLOBAL *glob_;
00332
00339 ABA_HASHITEM<KeyType, ItemType> **table_;
00340
00343 int size_;
00344
00347 int nCollisions_;
00348
00355 ABA_HASHITEM<KeyType, ItemType> *iter_;
00356 ABA_HASH(const ABA_HASH &rhs);
00357 ABA_HASH &operator=(const ABA_HASH &rhs);
00358 };
00359
00360
00361
00362
00363 #include "abacus/hash.inc"
00364
00365 #endif // ABA_HASH_H
00366
00367