view LightClone/Source/HashMapIterator.h @ 39:d0ce73ced12e

Added base GuiDialog for event handling; Hookup level complete dialog
author koryspansel <koryspansel@bendbroadband.com>
date Thu, 22 Sep 2011 09:01:42 -0700
parents 5656c8e382fc
children efd2b1ca5b77
line wrap: on
line source

/*
 * HashMapIterator
 */

#ifndef __HASHMAPITERATOR_H__
#define __HASHMAPITERATOR_H__

#include "Types.h"

/*
 * HashMapIterator
 */
template<typename Map, typename Value>
class HashMapIterator
{
	/*
	 * pMap
	 */
	Map* pMap;

	/*
	 * nSize
	 */
	uint32 nSize;

	/*
	 * pNode
	 */
	typename Map::Node* pNode;

	/*
	 * nSlot
	 */
	uint32 nSlot;

public:

	/*
	 * HashMapIterator
	 */
	HashMapIterator(Map* pInstance, uint32 nInstanceSize) : pMap(pInstance), nSize(nInstanceSize), pNode(NULL), nSlot(0)
	{
		while(!pNode && nSlot < nSize)
		{
			pNode = pInstance->pTable[nSlot++];
		}
	}

	/*
	 * HashMapIterator
	 */
	HashMapIterator(Map* pInstance, uint32 nInstanceSize, uint32 nStart) : pMap(pInstance), nSize(nInstanceSize), pNode(NULL), nSlot(nStart)
	{
		while(!pNode && nSlot < nSize)
		{
			pNode = pInstance->pTable[nSlot++];
		}
	}

	/*
	 * operator ++
	 */
	HashMapIterator& operator ++()
	{
		if(pNode)
		{
			pNode = pNode->pNext;
			if(!pNode)
			{
				while(!pNode && nSlot < nSize)
				{
					pNode = pMap->pTable[nSlot++];
				}
			}
		}

		return *this;
	}

	/*
	 * operator ++
	 */
	HashMapIterator& operator ++(int)
	{
		if(pNode)
		{
			pNode = pNode->pNext;
			if(!pNode)
			{
				while(!pNode && nSlot < nSize)
				{
					pNode = pMap->pTable[nSlot++];
				}
			}
		}

		return *this;
	}

	/*
	 * operator *
	 */
	Value operator *()
	{
		return pNode ? pNode->kValue : Value();
	}

	/*
	 * operator ==
	 */
	bool operator ==(HashMapIterator& kOther)
	{
		return nSlot == kOther.nSlot && pNode == kOther.pNode;
	}

	/*
	 * operator !=
	 */
	bool operator !=(HashMapIterator& kOther)
	{
		return nSlot != kOther.nSlot || pNode != kOther.pNode;
	}
};

#endif //__HASHMAPITERATOR_H__