#ifndef ROOT_TExMap
#define ROOT_TExMap
#ifndef ROOT_TObject
#include "TObject.h"
#endif
class TExMapIter;
class TExMap : public TObject {
friend class TExMapIter;
private:
struct Assoc_t {
private:
ULong64_t fHash;
public:
Long64_t fKey;
Long64_t fValue;
void SetHash(ULong64_t h) { fHash = (h | 1); }
ULong64_t GetHash() const { return fHash; }
Bool_t InUse() const { return fHash & 1; }
void Clear() { fHash = 0x0; }
};
Assoc_t *fTable;
Int_t fSize;
Int_t fTally;
Bool_t HighWaterMark() { return (Bool_t) (fTally >= ((3*fSize)/4)); }
Int_t FindElement(ULong64_t hash, Long64_t key);
void FixCollisions(Int_t index);
public:
TExMap(Int_t mapSize = 100);
TExMap(const TExMap &map);
TExMap& operator=(const TExMap&);
~TExMap();
void Add(ULong64_t hash, Long64_t key, Long64_t value);
void Add(Long64_t key, Long64_t value) { Add(key, key, value); }
void AddAt(UInt_t slot, ULong64_t hash, Long64_t key, Long64_t value);
void Delete(Option_t *opt = "");
Int_t Capacity() const { return fSize; }
void Expand(Int_t newsize);
Int_t GetSize() const { return fTally; }
Long64_t GetValue(ULong64_t hash, Long64_t key);
Long64_t GetValue(Long64_t key) { return GetValue(key, key); }
Long64_t GetValue(ULong64_t hash, Long64_t key, UInt_t &slot);
void Remove(ULong64_t hash, Long64_t key);
void Remove(Long64_t key) { Remove(key, key); }
Long64_t &operator()(ULong64_t hash, Long64_t key);
Long64_t &operator()(Long64_t key) { return operator()(key, key); }
ClassDef(TExMap,3)
};
class TExMapIter {
private:
const TExMap *fMap;
Int_t fCursor;
public:
TExMapIter(const TExMap *map);
TExMapIter(const TExMapIter& tei) : fMap(tei.fMap), fCursor(tei.fCursor) { }
TExMapIter& operator=(const TExMapIter&);
virtual ~TExMapIter() { }
const TExMap *GetCollection() const { return fMap; }
Bool_t Next(ULong64_t &hash, Long64_t &key, Long64_t &value);
Bool_t Next(Long64_t &key, Long64_t &value);
void Reset() { fCursor = 0; }
ClassDef(TExMapIter,0)
};
#endif