737 lines
15 KiB
C
737 lines
15 KiB
C
|
|
#ifndef _ARRAY_TEMPLATE_HEAD_FILE
|
|||
|
|
#define _ARRAY_TEMPLATE_HEAD_FILE
|
|||
|
|
|
|||
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include "cocos2d.h"
|
|||
|
|
#include "PlatformHeader.h"
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>
|
|||
|
|
template <class TYPE, class ARG_TYPE=const TYPE &>
|
|||
|
|
class CArrayTemplate
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
protected:
|
|||
|
|
TYPE *m_pData; //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
int m_nMaxCount; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
|
int m_nGrowCount; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
|
int m_nElementCount; //Ԫ<><D4AA><EFBFBD><EFBFBD>Ŀ
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
public:
|
|||
|
|
//<2F><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
CArrayTemplate(void);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
virtual ~CArrayTemplate(void);
|
|||
|
|
|
|||
|
|
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|||
|
|
public:
|
|||
|
|
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool IsEmpty() const;
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1>Ŀ
|
|||
|
|
int GetCount() const;
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
int GetUpperBound() const;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD>
|
|||
|
|
public:
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
TYPE * GetData();
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
const TYPE * GetData() const;
|
|||
|
|
//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
|||
|
|
void FreeExtra();
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
|||
|
|
int Add(ARG_TYPE newElement);
|
|||
|
|
//<2F><><EFBFBD>Ӳ<EFBFBD>ͬ<EFBFBD><CDAC>ֵ
|
|||
|
|
int AddDistinct( ARG_TYPE newElement );
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int Copy(const CArrayTemplate & Src);
|
|||
|
|
//<><D7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int Append(const CArrayTemplate & Src);
|
|||
|
|
//<2F><>ȡԪ<C8A1><D4AA>
|
|||
|
|
TYPE & GetAt(int nIndex);
|
|||
|
|
//<2F><>ȡԪ<C8A1><D4AA>
|
|||
|
|
const TYPE & GetAt(int nIndex) const;
|
|||
|
|
//<2F><>ȡԪ<C8A1><D4AA>
|
|||
|
|
TYPE & ElementAt(int nIndex);
|
|||
|
|
//<2F><>ȡԪ<C8A1><D4AA>
|
|||
|
|
const TYPE & ElementAt(int nIndex) const;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
public:
|
|||
|
|
//<2F><><EFBFBD>ô<EFBFBD>С
|
|||
|
|
void SetSize(int nNewSize);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
|||
|
|
void SetAt(int nIndex, ARG_TYPE newElement);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
|||
|
|
void SetAtGrow(int nIndex, ARG_TYPE newElement);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void InsertAt(int nIndex, const CArrayTemplate & Src);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void InsertAt(int nIndex, ARG_TYPE newElement, int nCount=1);
|
|||
|
|
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void RemoveAt(int nIndex, int nCount=1);
|
|||
|
|
//ɾ<><C9BE>ָ<EFBFBD><D6B8>Ԫ<EFBFBD><D4AA>
|
|||
|
|
int RemoveItem( ARG_TYPE newElement );
|
|||
|
|
//ɾ<><C9BE>Ԫ<EFBFBD><D4AA>
|
|||
|
|
void RemoveAll();
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> >
|
|||
|
|
void Sort(int nLower, int nUpper);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F2B7A8B5><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> >
|
|||
|
|
int Partition(int nLower, int nUpper);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void SwitchValue( int a, int b );
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>
|
|||
|
|
template<typename FUNC_SHARRAY_COMPARE>
|
|||
|
|
void SortEx(int nLower, int nUpper,FUNC_SHARRAY_COMPARE fp)
|
|||
|
|
{
|
|||
|
|
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (nLower < nUpper)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int nSplit = PartitionEx(nLower, nUpper,fp);
|
|||
|
|
SortEx(nLower, nSplit-1,fp);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
SortEx(nSplit+1, nUpper,fp);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F2B7A8B5><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>
|
|||
|
|
template<typename FUNC_SHARRAY_COMPARE>
|
|||
|
|
int PartitionEx(int nLower, int nUpper,FUNC_SHARRAY_COMPARE fp)
|
|||
|
|
{
|
|||
|
|
int nLeft = nLower + 1;
|
|||
|
|
TYPE &RefObj = m_pData[nLower];
|
|||
|
|
|
|||
|
|
int nRight = nUpper;
|
|||
|
|
|
|||
|
|
TYPE Swap;
|
|||
|
|
while (nLeft <= nRight)
|
|||
|
|
{
|
|||
|
|
while (nLeft <= nRight && fp(m_pData[nLeft],RefObj))
|
|||
|
|
{
|
|||
|
|
nLeft++;
|
|||
|
|
}
|
|||
|
|
while (nLeft <= nRight && !fp(m_pData[nRight],RefObj))
|
|||
|
|
{
|
|||
|
|
nRight--;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (nLeft < nRight)
|
|||
|
|
{
|
|||
|
|
Swap = m_pData[nLeft];
|
|||
|
|
m_pData[nLeft] = m_pData[nRight];
|
|||
|
|
m_pData[nRight] = Swap;
|
|||
|
|
nLeft++;
|
|||
|
|
nRight--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Swap = m_pData[nLower];
|
|||
|
|
m_pData[nLower] = m_pData[nRight];
|
|||
|
|
m_pData[nRight] = Swap;
|
|||
|
|
return nRight;
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
public:
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
TYPE & operator[](int nIndex);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
const TYPE & operator[](int nIndex) const;
|
|||
|
|
|
|||
|
|
//<2F>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
private:
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|||
|
|
void AllocMemory(int nNewCount);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
// CArrayTemplate<TYPE, ARG_TYPE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
inline bool CArrayTemplate<TYPE, ARG_TYPE>::IsEmpty() const
|
|||
|
|
{
|
|||
|
|
//ASSERT_VALID(this);
|
|||
|
|
return (m_nElementCount==0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1>Ŀ
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
inline int CArrayTemplate<TYPE, ARG_TYPE>::GetCount() const
|
|||
|
|
{
|
|||
|
|
//ASSERT_VALID(this);
|
|||
|
|
return m_nElementCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
inline int CArrayTemplate<TYPE, ARG_TYPE>::GetUpperBound() const
|
|||
|
|
{
|
|||
|
|
//ASSERT_VALID(this);
|
|||
|
|
return m_nElementCount-1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
inline int CArrayTemplate<TYPE,ARG_TYPE>::Add(ARG_TYPE newElement)
|
|||
|
|
{
|
|||
|
|
int nIndex=m_nElementCount;
|
|||
|
|
SetAtGrow(nIndex,newElement);
|
|||
|
|
return nIndex;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
inline TYPE & CArrayTemplate<TYPE, ARG_TYPE>::operator[](int nIndex)
|
|||
|
|
{
|
|||
|
|
return ElementAt(nIndex);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
inline const TYPE & CArrayTemplate<TYPE, ARG_TYPE>::operator[](int nIndex) const
|
|||
|
|
{
|
|||
|
|
return GetAt(nIndex);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
// CArrayTemplate<TYPE, ARG_TYPE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
CArrayTemplate<TYPE, ARG_TYPE>::CArrayTemplate()
|
|||
|
|
{
|
|||
|
|
m_pData=NULL;
|
|||
|
|
m_nMaxCount=0;
|
|||
|
|
m_nGrowCount=0;
|
|||
|
|
m_nElementCount=0;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
CArrayTemplate<TYPE,ARG_TYPE>::~CArrayTemplate()
|
|||
|
|
{
|
|||
|
|
if (m_pData!=NULL)
|
|||
|
|
{
|
|||
|
|
for (int i=0;i<m_nElementCount;i++)
|
|||
|
|
{
|
|||
|
|
(m_pData+i)->~TYPE();
|
|||
|
|
}
|
|||
|
|
delete [] (BYTE *)m_pData;
|
|||
|
|
m_pData=NULL;
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
TYPE * CArrayTemplate<TYPE,ARG_TYPE>::GetData()
|
|||
|
|
{
|
|||
|
|
ASSERT_VALID(this);
|
|||
|
|
return m_pData;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
const TYPE * CArrayTemplate<TYPE,ARG_TYPE>::GetData() const
|
|||
|
|
{
|
|||
|
|
ASSERT_VALID(this);
|
|||
|
|
return m_pData;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
void CArrayTemplate<TYPE,ARG_TYPE>::FreeExtra()
|
|||
|
|
{
|
|||
|
|
ASSERT_VALID(this);
|
|||
|
|
if (m_nElementCount!=m_nMaxCount)
|
|||
|
|
{
|
|||
|
|
TYPE * pNewData=NULL;
|
|||
|
|
if (m_nElementCount!=0)
|
|||
|
|
{
|
|||
|
|
pNewData=(TYPE *) new BYTE[m_nElementCount*sizeof(TYPE)];
|
|||
|
|
//memcpy(pNewData,m_pData,m_nElementCount*sizeof(TYPE)); //old,flowing is modify by myz
|
|||
|
|
memmove(pNewData,m_pData,m_nElementCount*sizeof(TYPE));
|
|||
|
|
}
|
|||
|
|
delete [] (BYTE *)m_pData;
|
|||
|
|
m_pData=pNewData;
|
|||
|
|
m_nMaxCount=m_nElementCount;
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
int CArrayTemplate<TYPE,ARG_TYPE>::Copy(const CArrayTemplate & Src)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ASSERT_VALID(this);
|
|||
|
|
ASSERT(this!=&Src);
|
|||
|
|
if (this==&Src)
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
AllocMemory(Src.m_nElementCount);
|
|||
|
|
if (m_nElementCount>0)
|
|||
|
|
{
|
|||
|
|
for (int i=0;i<m_nElementCount;i++)
|
|||
|
|
{
|
|||
|
|
(m_pData+i)->~TYPE();
|
|||
|
|
}
|
|||
|
|
memset(m_pData,0,m_nElementCount*sizeof(TYPE));
|
|||
|
|
}
|
|||
|
|
for (int i=0;i<Src.m_nElementCount;i++)
|
|||
|
|
{
|
|||
|
|
m_pData[i]=Src.m_pData[i];
|
|||
|
|
}
|
|||
|
|
m_nElementCount=Src.m_nElementCount;
|
|||
|
|
|
|||
|
|
return m_nElementCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<><D7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
int CArrayTemplate<TYPE,ARG_TYPE>::Append(const CArrayTemplate & Src)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ASSERT_VALID(this);
|
|||
|
|
ASSERT(this!=&Src);
|
|||
|
|
//if (this==&Src) AfxThrowInvalidArgException();
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (Src.m_nElementCount>0)
|
|||
|
|
{
|
|||
|
|
AllocMemory(m_nElementCount+Src.m_nElementCount);
|
|||
|
|
for (int i=0;i<Src.m_nElementCount;i++)
|
|||
|
|
{
|
|||
|
|
m_pData[m_nElementCount+i]=Src.m_pData[i];
|
|||
|
|
}
|
|||
|
|
m_nElementCount+=Src.m_nElementCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return m_nElementCount;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡԪ<C8A1><D4AA>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
TYPE & CArrayTemplate<TYPE,ARG_TYPE>::GetAt(int nIndex)
|
|||
|
|
{
|
|||
|
|
ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
|
|||
|
|
if ((nIndex>=0)&&(nIndex<m_nElementCount))
|
|||
|
|
{
|
|||
|
|
return m_pData[nIndex];
|
|||
|
|
}
|
|||
|
|
//AfxThrowInvalidArgException();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡԪ<C8A1><D4AA>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
const TYPE & CArrayTemplate<TYPE,ARG_TYPE>::GetAt(int nIndex) const
|
|||
|
|
{
|
|||
|
|
ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
|
|||
|
|
if ((nIndex>=0)&&(nIndex<m_nElementCount))
|
|||
|
|
{
|
|||
|
|
return m_pData[nIndex];
|
|||
|
|
}
|
|||
|
|
//AfxThrowInvalidArgException();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡԪ<C8A1><D4AA>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
TYPE & CArrayTemplate<TYPE,ARG_TYPE>::ElementAt(int nIndex)
|
|||
|
|
{
|
|||
|
|
ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
|
|||
|
|
if ((nIndex>=0)&&(nIndex<m_nElementCount))
|
|||
|
|
{
|
|||
|
|
return m_pData[nIndex];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡԪ<C8A1><D4AA>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
const TYPE & CArrayTemplate<TYPE,ARG_TYPE>::ElementAt(int nIndex) const
|
|||
|
|
{
|
|||
|
|
ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
|
|||
|
|
if ((nIndex>=0)&&(nIndex<m_nElementCount))
|
|||
|
|
{
|
|||
|
|
return m_pData[nIndex];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ô<EFBFBD>С
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
void CArrayTemplate<TYPE,ARG_TYPE>::SetSize(int nNewSize)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//ASSERT_VALID(this);
|
|||
|
|
ASSERT(nNewSize>=0);
|
|||
|
|
//if (nNewSize<0) AfxThrowInvalidArgException();
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ô<EFBFBD>С
|
|||
|
|
AllocMemory(nNewSize);
|
|||
|
|
if (nNewSize>m_nElementCount)
|
|||
|
|
{
|
|||
|
|
#pragma push_macro("new")
|
|||
|
|
#undef new
|
|||
|
|
for (int i=m_nElementCount;i<nNewSize;i++)
|
|||
|
|
{
|
|||
|
|
::new ((void *)(m_pData+i)) TYPE;
|
|||
|
|
}
|
|||
|
|
#pragma pop_macro("new")
|
|||
|
|
}
|
|||
|
|
else if (nNewSize<m_nElementCount)
|
|||
|
|
{
|
|||
|
|
for (int i=nNewSize;i<m_nElementCount;i++)
|
|||
|
|
{
|
|||
|
|
(m_pData+i)->~TYPE();
|
|||
|
|
}
|
|||
|
|
memset(m_pData+nNewSize,0,(m_nElementCount-nNewSize)*sizeof(TYPE));
|
|||
|
|
}
|
|||
|
|
m_nElementCount=nNewSize;
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
void CArrayTemplate<TYPE,ARG_TYPE>::SetAt(int nIndex, ARG_TYPE newElement)
|
|||
|
|
{
|
|||
|
|
ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
|
|||
|
|
if ((nIndex>=0)&&(nIndex<m_nElementCount))
|
|||
|
|
{
|
|||
|
|
m_pData[nIndex]=newElement;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
void CArrayTemplate<TYPE,ARG_TYPE>::SetAtGrow(int nIndex, ARG_TYPE newElement)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//ASSERT_VALID(this);
|
|||
|
|
ASSERT(nIndex>=0);
|
|||
|
|
//if (nIndex<0) AfxThrowInvalidArgException();
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
|||
|
|
if (nIndex>=m_nElementCount)
|
|||
|
|
{
|
|||
|
|
SetSize(m_nElementCount+1);
|
|||
|
|
}
|
|||
|
|
m_pData[nIndex]=newElement;
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
void CArrayTemplate<TYPE,ARG_TYPE>::InsertAt(int nIndex, const CArrayTemplate & Src)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//ASSERT_VALID(this);
|
|||
|
|
ASSERT(nIndex>=0);
|
|||
|
|
//if (nIndex<0) AfxThrowInvalidArgException();
|
|||
|
|
|
|||
|
|
int nCount = Src.m_nElementCount;
|
|||
|
|
if (nCount>0)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (nIndex<m_nElementCount)
|
|||
|
|
{
|
|||
|
|
int nOldCount=m_nElementCount;
|
|||
|
|
SetSize(m_nElementCount+nCount);
|
|||
|
|
for (int i=0;i<nCount;i++)
|
|||
|
|
{
|
|||
|
|
(m_pData+nOldCount+i)->~TYPE();
|
|||
|
|
}
|
|||
|
|
memmove(m_pData+nIndex+nCount,m_pData+nIndex,(nOldCount-nIndex)*sizeof(TYPE));
|
|||
|
|
memset(m_pData+nIndex,0,nCount*sizeof(TYPE));
|
|||
|
|
#pragma push_macro("new")
|
|||
|
|
#undef new
|
|||
|
|
for (int i=0;i<nCount;i++)
|
|||
|
|
{
|
|||
|
|
#pragma warning(disable:4345)
|
|||
|
|
::new (m_pData+nIndex+i) TYPE();
|
|||
|
|
#pragma warning(default:4345)
|
|||
|
|
}
|
|||
|
|
#pragma pop_macro("new")
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
SetSize(nIndex+nCount);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ASSERT((nIndex+nCount)<=m_nElementCount);
|
|||
|
|
for (int i=0;i<nCount;i++)
|
|||
|
|
{
|
|||
|
|
m_pData[nIndex+i]=Src.m_pData[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
void CArrayTemplate<TYPE,ARG_TYPE>::InsertAt(int nIndex, ARG_TYPE newElement, int nCount)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//ASSERT_VALID(this);
|
|||
|
|
ASSERT(nIndex>=0);
|
|||
|
|
ASSERT(nCount>0);
|
|||
|
|
//if ((nIndex<0)||(nCount<=0)) AfxThrowInvalidArgException();
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (nIndex<m_nElementCount)
|
|||
|
|
{
|
|||
|
|
int nOldCount=m_nElementCount;
|
|||
|
|
SetSize(m_nElementCount+nCount);
|
|||
|
|
for (int i=0;i<nCount;i++)
|
|||
|
|
{
|
|||
|
|
(m_pData+nOldCount+i)->~TYPE();
|
|||
|
|
}
|
|||
|
|
memmove(m_pData+nIndex+nCount,m_pData+nIndex,(nOldCount-nIndex)*sizeof(TYPE));
|
|||
|
|
memset(m_pData+nIndex,0,nCount*sizeof(TYPE));
|
|||
|
|
#pragma push_macro("new")
|
|||
|
|
#undef new
|
|||
|
|
for (int i=0;i<nCount;i++)
|
|||
|
|
{
|
|||
|
|
#pragma warning(disable:4345)
|
|||
|
|
::new (m_pData+nIndex+i) TYPE();
|
|||
|
|
#pragma warning(default:4345)
|
|||
|
|
}
|
|||
|
|
#pragma pop_macro("new")
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
SetSize(nIndex+nCount);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ASSERT((nIndex+nCount)<=m_nElementCount);
|
|||
|
|
while (nCount--)
|
|||
|
|
{
|
|||
|
|
m_pData[nIndex++]=newElement;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
void CArrayTemplate<TYPE,ARG_TYPE>::RemoveAt(int nIndex, int nCount)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//ASSERT_VALID(this);
|
|||
|
|
ASSERT(nIndex>=0);
|
|||
|
|
ASSERT(nCount>=0);
|
|||
|
|
ASSERT(nIndex+nCount<=m_nElementCount);
|
|||
|
|
//if ((nIndex<0)||(nCount<0)||((nIndex+nCount>m_nElementCount))) AfxThrowInvalidArgException();
|
|||
|
|
|
|||
|
|
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int nMoveCount=m_nElementCount-(nIndex+nCount);
|
|||
|
|
for (int i=0;i<nCount;i++)
|
|||
|
|
{
|
|||
|
|
(m_pData+nIndex+i)->~TYPE();
|
|||
|
|
}
|
|||
|
|
if (nMoveCount>0)
|
|||
|
|
{
|
|||
|
|
memmove(m_pData+nIndex,m_pData+nIndex+nCount,nMoveCount*sizeof(TYPE));
|
|||
|
|
}
|
|||
|
|
m_nElementCount-=nCount;
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ɾ<><C9BE>Ԫ<EFBFBD><D4AA>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
void CArrayTemplate<TYPE,ARG_TYPE>::RemoveAll()
|
|||
|
|
{
|
|||
|
|
//ASSERT_VALID(this);
|
|||
|
|
if (m_nElementCount>0)
|
|||
|
|
{
|
|||
|
|
for (int i=0;i<m_nElementCount;i++)
|
|||
|
|
{
|
|||
|
|
(m_pData+i)->~TYPE();
|
|||
|
|
}
|
|||
|
|
memset(m_pData,0,m_nElementCount*sizeof(TYPE));
|
|||
|
|
m_nElementCount=0;
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> >
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
void CArrayTemplate<TYPE,ARG_TYPE>::Sort(int nLower, int nUpper)
|
|||
|
|
{
|
|||
|
|
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (nLower < nUpper)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int nSplit = Partition(nLower, nUpper);
|
|||
|
|
Sort(nLower, nSplit-1);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
Sort(nSplit+1, nUpper);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F2B7A8B5><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
int CArrayTemplate<TYPE,ARG_TYPE>::Partition(int nLower, int nUpper)
|
|||
|
|
{
|
|||
|
|
int nLeft = nLower + 1;
|
|||
|
|
TYPE &RefObj = m_pData[nLower];
|
|||
|
|
|
|||
|
|
int nRight = nUpper;
|
|||
|
|
|
|||
|
|
TYPE Swap;
|
|||
|
|
while (nLeft <= nRight)
|
|||
|
|
{
|
|||
|
|
while (nLeft <= nRight && (*m_pData[nLeft]) > (*RefObj))
|
|||
|
|
{
|
|||
|
|
nLeft++;
|
|||
|
|
}
|
|||
|
|
while (nLeft <= nRight && !((*m_pData[nRight]) > (*RefObj)))
|
|||
|
|
{
|
|||
|
|
nRight--;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (nLeft < nRight)
|
|||
|
|
{
|
|||
|
|
Swap = m_pData[nLeft];
|
|||
|
|
m_pData[nLeft] = m_pData[nRight];
|
|||
|
|
m_pData[nRight] = Swap;
|
|||
|
|
nLeft++;
|
|||
|
|
nRight--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Swap = m_pData[nLower];
|
|||
|
|
m_pData[nLower] = m_pData[nRight];
|
|||
|
|
m_pData[nRight] = Swap;
|
|||
|
|
return nRight;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|||
|
|
template<class TYPE, class ARG_TYPE>
|
|||
|
|
void CArrayTemplate<TYPE,ARG_TYPE>::AllocMemory(int nNewCount)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//ASSERT_VALID(this);
|
|||
|
|
ASSERT(nNewCount>=0);
|
|||
|
|
|
|||
|
|
if (nNewCount>m_nMaxCount)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
|
int nGrowCount=m_nGrowCount;
|
|||
|
|
if (nGrowCount==0)
|
|||
|
|
{
|
|||
|
|
nGrowCount=(m_nElementCount>>3);
|
|||
|
|
nGrowCount=(nGrowCount<4)?4:((nGrowCount>1024)?1024:nGrowCount);
|
|||
|
|
}
|
|||
|
|
nNewCount+=nGrowCount;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|||
|
|
TYPE * pNewData=(TYPE *) new BYTE[nNewCount*sizeof(TYPE)];
|
|||
|
|
//memcpy(pNewData,m_pData,m_nElementCount*sizeof(TYPE)); //old modify by myz
|
|||
|
|
memmove(pNewData,m_pData,m_nElementCount*sizeof(TYPE));
|
|||
|
|
|
|||
|
|
memset(pNewData+m_nElementCount,0,(nNewCount-m_nElementCount)*sizeof(TYPE));
|
|||
|
|
delete [] (BYTE *)m_pData;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
m_pData=pNewData;
|
|||
|
|
m_nMaxCount=nNewCount;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
template <class TYPE, class ARG_TYPE>
|
|||
|
|
void CArrayTemplate<TYPE, ARG_TYPE>::SwitchValue( int a, int b )
|
|||
|
|
{
|
|||
|
|
//ASSERT_VALID(this);
|
|||
|
|
ASSERT(a<m_nElementCount && b<m_nElementCount);
|
|||
|
|
if (a<m_nElementCount && b<m_nElementCount)
|
|||
|
|
{
|
|||
|
|
TYPE temp=m_pData[a];
|
|||
|
|
m_pData[a]=m_pData[b];
|
|||
|
|
m_pData[b]=temp;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>Ӳ<EFBFBD>ͬ<EFBFBD><CDAC>ֵ
|
|||
|
|
template <class TYPE, class ARG_TYPE>
|
|||
|
|
int CArrayTemplate<TYPE, ARG_TYPE>::AddDistinct( ARG_TYPE newElement )
|
|||
|
|
{
|
|||
|
|
for ( int i=0; i<m_nElementCount; i++ )
|
|||
|
|
{
|
|||
|
|
if (m_pData[i]==newElement)
|
|||
|
|
{
|
|||
|
|
return i;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return Add(newElement);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ɾ<><C9BE>ָ<EFBFBD><D6B8>Ԫ<EFBFBD><D4AA>
|
|||
|
|
template <class TYPE, class ARG_TYPE>
|
|||
|
|
int CArrayTemplate<TYPE, ARG_TYPE>::RemoveItem( ARG_TYPE newElement )
|
|||
|
|
{
|
|||
|
|
for ( int i=0; i<m_nElementCount; i++ )
|
|||
|
|
{
|
|||
|
|
if (m_pData[i]==newElement)
|
|||
|
|
{
|
|||
|
|
RemoveAt(i);
|
|||
|
|
return i;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
typedef CArrayTemplate<void *> CSHPtrArray;
|
|||
|
|
typedef CArrayTemplate<void *> CSHCPtrArray;
|
|||
|
|
|
|||
|
|
//ɾ<><C9BE>CArrayTemplateָ<65><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
template<typename T>
|
|||
|
|
void GGDeletePtrArray( CArrayTemplate<T*> &ary )
|
|||
|
|
{
|
|||
|
|
if (!ary.IsEmpty())
|
|||
|
|
{
|
|||
|
|
for ( int i=ary.GetCount()-1; i>=0; i-- )
|
|||
|
|
{
|
|||
|
|
T *&pObj=ary[i];
|
|||
|
|
if (pObj!=NULL)
|
|||
|
|
{
|
|||
|
|
delete pObj;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
ary.RemoveAll();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//<2F>ͷ<EFBFBD>CArrayTemplateָ<65><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
template<typename T>
|
|||
|
|
void GGReleasePtrArray( CArrayTemplate<T*> &ary )
|
|||
|
|
{
|
|||
|
|
if (!ary.IsEmpty())
|
|||
|
|
{
|
|||
|
|
for ( int i=ary.GetCount()-1; i>=0; i-- )
|
|||
|
|
{
|
|||
|
|
T *&pObj=ary[i];
|
|||
|
|
if (pObj!=NULL)
|
|||
|
|
{
|
|||
|
|
pObj->Release();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
ary.RemoveAll();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
#endif
|