⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 autolinkset.h

📁 网络游戏魔域源代码 测试可以完整变异
💻 H
字号:
// AutoLinkSet.h: interface for the CAutoLinkSet class.
// paled, 2003.8.27
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_AUTOLINKSET_H__5708545C_E8F2_4155_AC66_4191BE0F150E__INCLUDED_)
#define AFX_AUTOLINKSET_H__5708545C_E8F2_4155_AC66_4191BE0F150E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

////////////////////////////////////////////////////////////////
// 说明:“主AutoLink”必须要用父对象的指针初始化自己,不可为空。Init()
//		“从AutoLinkSet”可直接用Iterator遍历,其中的空对象会被自动清除。
////////////////////////////////////////////////////////////////
// 说明:该模板需要GetID()函数支持,同时也需要定义OBJID
//		父对象必须实现一个函数:CAutoLink<T>& QueryLink(const CAutoLink<T>&),返回“主AutoLink”的引用。(参数只有类型,无意义)

#include "AutoLink.h"
#include <vector>
using namespace std;

template<class T>
class CAutoLinkSet
{
protected:
	typedef	vector<CAutoLink<T> >	VECTOR_SET;
public:
	CAutoLinkSet() {}
	virtual ~CAutoLinkSet();
public:
	static CAutoLinkSet<T>*	CreateNew() { return new CAutoLinkSet<T>(); }
	void		Release			()				{ delete this; }

//////////////////////////////////////////////////////
public:	// new traversal
	class	Iterator{
	private: // create by parent class
		Iterator(VECTOR_SET* pSet) : m_pSet(pSet),m_idx(pSet->size()-1),m_pObj(0) {}
		friend class CAutoLinkSet<T>;
	public:
//		Iterator(const Iterator& iter);		// need not define this ^_^

	public: // application
		bool	Next()
		{
			if(m_idx<0) return m_pObj=NULL,false; 
			
			do
			{
				m_pObj=m_pSet->at(m_idx);
				if(!m_pObj)
					m_pSet->erase(m_pSet->begin() + m_idx);
				m_idx--;
			}
			while(m_idx>=0 && m_pObj==0);
			
			return m_pObj != NULL;
		}

		void	Reset()		{ m_idx=m_pSet->size()-1; m_pObj=NULL; }
		operator T*()							{ return m_pObj; }
		T * operator->()						{ return m_pObj; }

	protected:
		VECTOR_SET*	m_pSet;
		int			m_idx;
		T*			m_pObj;
	};
public: // traverse
	Iterator	NewEnum		() 						{ return Iterator(&m_setObj); }
	int			Size		() 						{ return m_setObj.size(); }
//////////////////////////////////////////////////////

public: // application
	bool		AddObj			(const CAutoLink<T>& pObj);
	bool		AddObj			(T* ptr)		{ return AddObj(ptr->QueryLink(CAutoLink<T>())); }
	bool		DelObj			(OBJID idObj);
	bool		DelObj			(const Iterator& iter);
	T*			GetObj			(OBJID idObj);

protected:
	VECTOR_SET			m_setObj;
};

//////////////////////////////////////////////////////////////////////
template<class T>
CAutoLinkSet<T>::~CAutoLinkSet()
{
}

//////////////////////////////////////////////////////////////////////
template<class T>
bool CAutoLinkSet<T>::AddObj(const CAutoLink<T>& pObj)
{
	CHECKF(pObj && pObj->GetID());
	ASSERT(!DelObj(pObj->GetID()));

	m_setObj.push_back(pObj);
	return true;
}

//////////////////////////////////////////////////////////////////////
template<class T>
bool CAutoLinkSet<T>::DelObj(const Iterator& iter)
{
	if(iter.m_pObj)
	{
		iter.m_pObj	= NULL;

		int	idx = iter.m_idx+1;
		IF_OK(idx < m_setObj.size())
			m_setObj.erase(m_setObj.begin() + idx);

		return true;
	}
	return false;
}

//////////////////////////////////////////////////////////////////////
template<class T>
bool CAutoLinkSet<T>::DelObj(OBJID idObj)
{
	CHECKF(idObj);
	for(int i=0;i<m_setObj.size();i++)
	{ 
		T* pObj=m_setObj[i];
		if(pObj && pObj->GetID()==idObj)
		{
			m_setObj.erase(m_setObj.begin()+i);
			return true; 
		}
	}
	return false;
}

//////////////////////////////////////////////////////////////////////
template<class T>
T* CAutoLinkSet<T>::GetObj(OBJID idObj)
{
	for(int i=0;i<m_setObj.size();i++)
	{
		T* pObj=m_setObj[i];
		if(pObj && pObj->GetID()==idObj)
		{
			return pObj;
		}
	}
	return NULL;
}



#endif // !defined(AFX_AUTOLINKSET_H__5708545C_E8F2_4155_AC66_4191BE0F150E__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -