Files
wnmj-normal/Classes/Global/Array.h

737 lines
15 KiB
C
Raw Normal View History

2026-03-03 13:56:44 +08:00
#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