00001
00002
00003
00004
00005
00006
00007
00008
00053 #ifdef _MSC_VER
00054 #pragma once
00055 #endif
00056
00057 #ifndef OGDF_HASH_ARRAY_H
00058 #define OGDF_HASH_ARRAY_H
00059
00060
00061 #include <ogdf/basic/Hashing.h>
00062
00063
00064 namespace ogdf {
00065
00066
00120 template<class I, class E, class H = DefHashFunc<I> >
00121 class HashArray : private Hashing<I,E,H>
00122 {
00123 E m_defaultValue;
00124
00125 public:
00127 typedef HashConstIterator<I,E,H> const_iterator;
00128
00130 HashArray() : Hashing<I,E,H>() { }
00131
00133 HashArray(const E &defaultValue, const H &hashFunc = H())
00134 : Hashing<I,E,H>(256, hashFunc), m_defaultValue(defaultValue) { }
00135
00137 HashArray(const HashArray<I,E,H> &A) : Hashing<I,E,H>(A), m_defaultValue(A.m_defaultValue) { }
00138
00140 HashConstIterator<I,E,H> begin() const { return Hashing<I,E,H>::begin(); }
00141
00143 int size() const { return Hashing<I,E,H>::size(); }
00144
00146 int empty() const { return Hashing<I,E,H>::empty(); }
00147
00148
00150 const E &operator[](const I &i) const {
00151 HashElement<I,E> *pElement = Hashing<I,E,H>::lookup(i);
00152 if (pElement) return pElement->info();
00153 else return m_defaultValue;
00154 }
00155
00157 E &operator[](const I &i) {
00158 HashElement<I,E> *pElement = Hashing<I,E,H>::lookup(i);
00159 if (!pElement) pElement = Hashing<I,E,H>::fastInsert(i,m_defaultValue);
00160 return pElement->info();
00161 }
00162
00164 bool isDefined(const I &i) const {
00165 return Hashing<I,E,H>::member(i);
00166 }
00167
00169 void undefine(const I &i) {
00170 Hashing<I,E,H>::del(i);
00171 }
00172
00174 HashArray<I,E,H> &operator=(const HashArray<I,E,H> &A) {
00175 m_defaultValue = A.m_defaultValue;
00176 Hashing<I,E,H>::operator =(A);
00177 return *this;
00178 }
00179
00181 void clear() { Hashing<I,E,H>::clear(); }
00182 };
00183
00184
00185 }
00186
00187 #endif