peiyongz 2003/11/03 14:00:31 Modified: c/src/xercesc/util RefHash3KeysIdPool.c RefHash3KeysIdPool.hpp Log: RefHashTable-like enumeration accessing added Revision Changes Path 1.8 +78 -0 xml-xerces/c/src/xercesc/util/RefHash3KeysIdPool.c Index: RefHash3KeysIdPool.c =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/RefHash3KeysIdPool.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- RefHash3KeysIdPool.c 29 Oct 2003 16:18:05 -0000 1.7 +++ RefHash3KeysIdPool.c 3 Nov 2003 22:00:31 -0000 1.8 @@ -56,6 +56,9 @@ /** * $Log$ + * Revision 1.8 2003/11/03 22:00:31 peiyongz + * RefHashTable-like enumeration accessing added + * * Revision 1.7 2003/10/29 16:18:05 peiyongz * size() added and Reset() bug fixed * @@ -447,6 +450,7 @@ ThrowXML(NullPointerException, XMLExcepts::CPtr_PointerIsZero); Reset(); + resetKey(); } template <class TVal> RefHash3KeysIdPoolEnumerator<TVal>::~RefHash3KeysIdPoolEnumerator() @@ -492,6 +496,80 @@ template <class TVal> int RefHash3KeysIdPoolEnumerator<TVal>::size() const { return fToEnum->fIdCounter; +} + +template <class TVal> void RefHash3KeysIdPoolEnumerator<TVal>::resetKey() +{ + fCurHash = (unsigned int)-1; + fCurElem = 0; + findNext(); +} + +template <class TVal> bool RefHash3KeysIdPoolEnumerator<TVal>::hasMoreKeys() const +{ + // + // If our current has is at the max and there are no more elements + // in the current bucket, then no more elements. + // + if (!fCurElem && (fCurHash == fToEnum->fHashModulus)) + return false; + + return true; +} + +template <class TVal> void RefHash3KeysIdPoolEnumerator<TVal>::nextElementKey(void*& retKey1, int& retKey2, int& retKey3) +{ + // Make sure we have an element to return + if (!hasMoreKeys()) + ThrowXML(NoSuchElementException, XMLExcepts::Enum_NoMoreElements); + + // + // Save the current element, then move up to the next one for the + // next time around. + // + RefHash3KeysTableBucketElem<TVal>* saveElem = fCurElem; + findNext(); + + retKey1 = saveElem->fKey1; + retKey2 = saveElem->fKey2; + retKey3 = saveElem->fKey3; + + return; +} + +template <class TVal> void RefHash3KeysIdPoolEnumerator<TVal>::findNext() +{ + // + // If there is a current element, move to its next element. If this + // hits the end of the bucket, the next block will handle the rest. + // + if (fCurElem) + fCurElem = fCurElem->fNext; + + // + // If the current element is null, then we have to move up to the + // next hash value. If that is the hash modulus, then we cannot + // go further. + // + if (!fCurElem) + { + fCurHash++; + if (fCurHash == fToEnum->fHashModulus) + return; + + // Else find the next non-empty bucket + while (true) + { + if (fToEnum->fBucketList[fCurHash]) + break; + + // Bump to the next hash value. If we max out return + fCurHash++; + if (fCurHash == fToEnum->fHashModulus) + return; + } + fCurElem = fToEnum->fBucketList[fCurHash]; + } } XERCES_CPP_NAMESPACE_END 1.7 +19 -0 xml-xerces/c/src/xercesc/util/RefHash3KeysIdPool.hpp Index: RefHash3KeysIdPool.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/RefHash3KeysIdPool.hpp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- RefHash3KeysIdPool.hpp 29 Oct 2003 16:17:48 -0000 1.6 +++ RefHash3KeysIdPool.hpp 3 Nov 2003 22:00:31 -0000 1.7 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.7 2003/11/03 22:00:31 peiyongz + * RefHashTable-like enumeration accessing added + * * Revision 1.6 2003/10/29 16:17:48 peiyongz * size() added * @@ -290,7 +293,20 @@ void Reset(); int size() const; + // ----------------------------------------------------------------------- + // New interface + // ----------------------------------------------------------------------- + void resetKey(); + void nextElementKey(void*&, int&, int&); + bool hasMoreKeys() const; + private : + + // ----------------------------------------------------------------------- + // Private methods + // ----------------------------------------------------------------------- + void findNext(); + // ----------------------------------------------------------------------- // Data Members // fAdoptedElems @@ -308,6 +324,9 @@ bool fAdoptedElems; unsigned int fCurIndex; RefHash3KeysIdPool<TVal>* fToEnum; + + RefHash3KeysTableBucketElem<TVal>* fCurElem; + unsigned int fCurHash; }; XERCES_CPP_NAMESPACE_END
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]