int Position (const INDEX_2 & ind) const { int i = HashValue(ind); while (1) { if (hash.Get(i) == ind) return i; if (hash.Get(i).I1() == invalid) return 0; i++; if (i > hash.Size()) i = 1; } }
void Set (const INDEX & ahash, const T & acont) { int pos; PositionCreate (ahash, pos); hash.Elem(pos) = ahash; cont.Elem(pos) = acont; }
// returns 1, if new postion is created int PositionCreate (const INDEX_2 & ind, int & apos) { int i = HashValue (ind); if (hash.Get(i) == ind) { apos = i; return 0; } if (hash.Get(i).I1() == invalid) { hash.Elem(i) = ind; apos = i; return 1; } return PositionCreate2 (ind, apos); }
// public: //SZ BASE_INDEX_3_CLOSED_HASHTABLE (int size) : hash(size) { hash.SetName ("i3-hashtable, hash"); invalid = -1; for (int i = 0; i < size; i++) hash[i].I1() = invalid; }
int UsedElements () const { int n = hash.Size(); int cnt = 0; for (int i = 0; i < n; i++) if (hash[i].I1() != invalid) cnt++; return cnt; }
int Position (const INDEX_3 & ind) const { int i = HashValue(ind); while (1) { if (hash[i] == ind) return i; if (hash[i].I1() == invalid) return -1; i = (i+1) % hash.Size(); } }
int Costs (const INDEX_3 & ind) const { int i = HashValue(ind); int c = 1; while (1) { if (hash[i] == ind) return c; if (hash[i].I1() == invalid) return c; i = (i+1) % hash.Size(); c++; } }
INDEX_3_CLOSED_HASHTABLE (int size) : BASE_INDEX_3_CLOSED_HASHTABLE(size), cont(size) { cont.SetName ("i3-hashtable, contents"); }
int HashValue (const INDEX_3 & ind) const { return (ind.I1() + 15 * ind.I2() + 41 * ind.I3()) % hash.Size(); }
const T & Get (const INDEX & ahash) const { int pos = Position (ahash); return cont.Get(pos); }
int GetNEdges () const { return edge2vert.Size(); }
inline void SetData (int pos, const T & acont) { cont.Elem(pos) = acont; }
inline void SetData (int pos, const INDEX & ahash, const T & acont) { hash.Elem(pos) = ahash; cont.Elem(pos) = acont; }
void SetName (const char * aname) { cont.SetName(aname); hash.SetName(aname); }
int HashValue (const INDEX_2 & ind) const { return (ind.I1() + 71 * ind.I2()) % hash.Size() + 1; }
int UsedPos (int pos) const { return ! (hash.Get(pos).I1() == invalid); }
void GetData (int pos, T & acont) const { acont = cont.Get(pos); }
void SetSize (int size) { BaseSetSize(size); cont.SetSize(size); }
void GetSegmentEdge (int segnr, int & enr, int & orient) const { enr = abs(segedges.Get(segnr)); orient = segedges.Get(segnr) > 0 ? 1 : -1; }
void DeleteData () { SetSize (cont.Size()); }
void GetData (int pos, INDEX & ahash, T & acont) const { ahash = hash.Get(pos); acont = cont.Get(pos); }
int GetNSurfedges() const {return surfedges.Size();}
const T & GetData (int pos) { return cont.Get(pos); }
int GetNFaces () const { return face2vert.Size(); }
int Size() const { return hash.Size(); }
void GetSurface2VolumeElement (int selnr, int & elnr1, int & elnr2) const { elnr1 = surf2volelement.Get(selnr)[0]; elnr2 = surf2volelement.Get(selnr)[1]; }
int HashValue (const INDEX & ind) const { return ind % hash.Size() + 1; }