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

📄 namedarray.h

📁 游戏框架
💻 H
字号:
#ifndef NAMED_ARRAY_HEAD_FILE
#define NAMED_ARRAY_HEAD_FILE

#pragma once

#include "Array.h"

//////////////////////////////////////////////////////////////////////////

//宏定义
#define INFINITY_COUNT				-1									//无限数目


//数组模板类
template <class TYPE> 
class CNamedArrayTemplate
{
	//变量定义
protected:
	CArrayTemplate<LPCTSTR>			m_IndexItem;					//索引对象
	CArrayTemplate<TYPE *>			m_StorageItem;						//存储对象

	//函数定义
public:
	//构造函数
	CNamedArrayTemplate(void);
	//析构函数
	virtual ~CNamedArrayTemplate(void);

	//信息函数
public:
	//是否空组
	bool IsEmpty() const;
	//获取数目
	INT_PTR GetCount() const;
	//获取上限
	INT_PTR GetUpperBound() const;

	//功能函数
public:
	//获取缓冲
	TYPE * GetData();
	//获取缓冲
	const TYPE * GetData() const;
	//释放内存
	void FreeExtra();
	//增加元素
	INT_PTR Add(LPCTSTR Named, TYPE newElement);
	////拷贝数组
	//void Copy(const CArrayTemplate & Src);
	////追加数组
	//INT_PTR Append(const CArrayTemplate & Src);
	//获取元素
	TYPE & GetAt(INT_PTR nIndex);
	//获取元素
	const TYPE & GetAt(INT_PTR nIndex) const;
	//获取元素
	TYPE & ElementAt(INT_PTR nIndex);
	//获取元素
	const TYPE & ElementAt(INT_PTR nIndex) const;

	//操作函数
public:
	//设置大小
	void SetSize(INT_PTR nNewSize);
	//设置元素
	void SetAt(INT_PTR nIndex, TYPE newElement);
	//设置元素
	void SetAtGrow(INT_PTR nIndex, TYPE newElement);
	////插入数据
	//void InsertAt(INT_PTR nIndex, const CArrayTemplate & Src);
	//插入数据
	void InsertAt(INT_PTR nIndex, TYPE newElement, INT_PTR nCount=1);
	//删除数据
	void RemoveAt(INT_PTR nIndex, INT_PTR nCount=1);
	//删除元素
	void RemoveAll();

	//操作重载
public:
	//操作重载
	TYPE & operator[](INT_PTR nIndex);
	//操作重载
	const TYPE & operator[](INT_PTR nIndex) const;

	//内部函数
private:
	//申请内存
	void AllocMemory(INT_PTR nNewCount);
};

//////////////////////////////////////////////////////////////////////////
// CNamedArrayTemplate<TYPE> 内联函数

//是否空组
template <class TYPE>
_inline bool CNamedArrayTemplate<TYPE>::IsEmpty() const
{
	_ASSERT(this);
	return m_IndexItem.IsEmpty();
}

//获取数目
template <class TYPE> 
_inline INT_PTR CNamedArrayTemplate<TYPE>::GetCount() const
{
	_ASSERT(this);
	return m_IndexItem.GetCount();
}

//获取上限
template <class TYPE>
_inline INT_PTR CNamedArrayTemplate<TYPE>::GetUpperBound() const
{
	_ASSERT(this);
	return m_IndexItem.GetUpperBound();
}

//增加元素
template <class TYPE> 
_inline INT_PTR CNamedArrayTemplate<TYPE>::Add(LPCTSTR Named, TYPE newElement)
{
	INT_PTR		nIndex;

	TCHAR*	lpNamed = new TCHAR[64];

	strcpy(lpNamed, Named);
	nIndex = m_IndexItem.Add(lpNamed);
	m_StorageItem.Add(&newElement);
	return nIndex;
}

//操作重载
template <class TYPE>
_inline TYPE & CNamedArrayTemplate<TYPE>::operator[](INT_PTR nIndex)
{ 
	return m_StorageItem[nIndex]; 
}

//操作重载
template <class TYPE>
_inline const TYPE & CNamedArrayTemplate<TYPE>::operator[](INT_PTR nIndex) const
{ 
	return m_StorageItem.GetAt(nIndex); 
}

//////////////////////////////////////////////////////////////////////////
// CNamedArrayTemplate<TYPE> 外联函数

//构造函数
template <class TYPE>
CNamedArrayTemplate<TYPE>::CNamedArrayTemplate()
{
	return;
}

//析构函数
template <class TYPE>
CNamedArrayTemplate<TYPE>::~CNamedArrayTemplate()
{
	//清理对象
	TYPE * pObject=NULL;
	for (INT_PTR i=0;i<m_StorageItem.GetCount();i++)
	{
		pObject=m_StorageItem[i];
		_ASSERT(pObject!=NULL);
		SafeDelete(pObject);
	}
	m_IndexItem.RemoveAll();
	m_StorageItem.RemoveAll();

	return;
}

//获取缓冲
template <class TYPE>
TYPE * CNamedArrayTemplate<TYPE>::GetData()
{
	_ASSERT(this);
	return m_StorageItem.GetData();
}

//获取缓冲
template <class TYPE>
const TYPE * CNamedArrayTemplate<TYPE>::GetData() const
{
	_ASSERT(this);
	return m_StorageItem.GetData;
}

//释放内存(生成连续的内存块,并释放现有的内存块)
template <class TYPE>
void CNamedArrayTemplate<TYPE>::FreeExtra()
{
	m_IndexItem.FreeExtra();
	m_StorageItem.FreeExtra();
	return;
}
//
////拷贝数组
//template <class TYPE>
//void CNamedArrayTemplate<TYPE>::Copy(const CArrayTemplate & Src)
//{
//
//	return;
//}
//
////追加数组
//template <class TYPE> 
//INT_PTR CNamedArrayTemplate<TYPE>::Append(const CArrayTemplate & Src)
//{
//
//	return m_StorageItem.GetData();
//}

//获取元素
template <class TYPE>
TYPE & CNamedArrayTemplate<TYPE>::GetAt(INT_PTR nIndex)
{
	_ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
	if ((nIndex>=0)&&(nIndex<m_nElementCount)) return m_StorageItem[nIndex];
	AfxThrowInvalidArgException();		
}

//获取元素
template <class TYPE>
const TYPE & CNamedArrayTemplate<TYPE>::GetAt(INT_PTR nIndex) const
{
	_ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
	if ((nIndex>=0)&&(nIndex<m_nElementCount)) return m_StorageItem[nIndex];
	AfxThrowInvalidArgException();		
}

//获取元素
template <class TYPE>
TYPE & CNamedArrayTemplate<TYPE>::ElementAt(INT_PTR nIndex)
{
	_ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
	if ((nIndex>=0)&&(nIndex<m_nElementCount)) return m_StorageItem[nIndex];
	AfxThrowInvalidArgException();		
}

//获取元素
template <class TYPE>
const TYPE & CNamedArrayTemplate<TYPE>::ElementAt(INT_PTR nIndex) const
{
	_ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
	if ((nIndex>=0)&&(nIndex<m_nElementCount)) return m_StorageItem[nIndex];
	AfxThrowInvalidArgException();		
}

//设置大小
template <class TYPE>
void CNamedArrayTemplate<TYPE>::SetSize(INT_PTR nNewSize)
{
	//效验参数
	_ASSERT(this);
	_ASSERT(nNewSize>=0);
	
	m_IndexItem.SetSize(nNewSize);
	m_StorageItem.SetSize(nNewSize);

	return;
}

//设置元素
template <class TYPE>
void CNamedArrayTemplate<TYPE>::SetAt(INT_PTR nIndex, TYPE newElement)
{
	_ASSERT((nIndex>=0)&&(nIndex<m_nSize));
	if ((nIndex>=0)&&(nIndex<m_nElementCount)) m_StorageItem[nIndex]=newElement;
}

//设置元素并设置增长上限
template <class TYPE>
void CNamedArrayTemplate<TYPE>::SetAtGrow(INT_PTR nIndex, TYPE newElement)
{
	//效验参数
	_ASSERT(this);
	_ASSERT(nIndex>=0);

	//设置元素
	if (nIndex>=m_nElementCount) m_StorageItem.SetSize(m_StorageItem.GetCount()+1);
	m_StorageItem[nIndex]=newElement;

	return;
}

//删除数据
template <class TYPE>
void CNamedArrayTemplate<TYPE>::RemoveAt(INT_PTR nIndex, INT_PTR nCount)
{
	//效验参数
	_ASSERT(this);
	_ASSERT(nIndex>=0);
	_ASSERT(nCount>=0);
	_ASSERT(nIndex+nCount<=m_nElementCount);

	m_IndexItem.RemoveAt(nIndex, nCount);
	m_StorageItem.RemoveAt(nIndex, nCount);
	return;
}

//删除所有元素
template <class TYPE>
void CNamedArrayTemplate<TYPE>::RemoveAll()
{
	_ASSERT(this);
	m_IndexItem.RemoveAll();
	m_StorageItem.RemoveAll();

	return;
}

//////////////////////////////////////////////////////////////////////////

typedef CNamedArrayTemplate<char*>		CStringArray;
typedef CStringArray*					LPStringArray;

#endif

⌨️ 快捷键说明

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