8 template<
typename TYPE >
16 const TYPE& operator[](
int nIndex )
const {
return GetAt( nIndex ); }
17 TYPE& operator[](
int nIndex ) {
return GetAt( nIndex ); }
19 CGrowableArray& operator=(
const CGrowableArray<TYPE>& a ) {
if(
this == &a )
return *
this; RemoveAll();
for(
int i=0; i < a.m_nSize; i++ ) Add( a.m_pData[i] );
return *
this; }
21 HRESULT SetSize(
int nNewMaxSize ){
22 int nOldSize = m_nSize;
24 if( nOldSize > nNewMaxSize )
28 for(
int i = nNewMaxSize; i < nOldSize; ++i )
34 HRESULT hr = SetSizeInternal( nNewMaxSize );
36 if( nOldSize < nNewMaxSize )
40 for(
int i = nOldSize; i < nNewMaxSize; ++i )
41 ::
new (&m_pData[i]) TYPE;
46 HRESULT Add(
const TYPE&
value ){
48 if( FAILED( hr = SetSizeInternal( m_nSize + 1 ) ) )
52 ::new (&m_pData[m_nSize]) TYPE;
55 m_pData[m_nSize] = value;
60 HRESULT Insert(
int nIndex,
const TYPE& value ){
72 if( FAILED( hr = SetSizeInternal( m_nSize + 1 ) ) )
76 MoveMemory( &m_pData[nIndex+1], &m_pData[nIndex],
sizeof(TYPE) * (m_nSize - nIndex) );
79 ::new (&m_pData[nIndex]) TYPE;
82 m_pData[nIndex] = value;
87 HRESULT SetAt(
int nIndex,
const TYPE& value ){
96 m_pData[nIndex] = value;
99 TYPE& GetAt(
int nIndex ) { PE_ASSERT( nIndex >= 0 && nIndex < m_nSize );
return m_pData[nIndex]; }
100 int GetSize()
const {
return m_nSize; }
101 TYPE* GetData() {
return m_pData; }
102 bool Contains(
const TYPE& value ){
return ( -1 != IndexOf( value ) ); }
104 int IndexOf(
const TYPE& value ) {
return ( m_nSize > 0 ) ? IndexOf( value, 0, m_nSize ) : -1; }
105 int IndexOf(
const TYPE& value,
int iStart ) {
return IndexOf( value, iStart, m_nSize - iStart ); }
106 int IndexOf(
const TYPE& value,
int nIndex,
int nNumElements );
108 int LastIndexOf(
const TYPE& value ) {
return ( m_nSize > 0 ) ? LastIndexOf( value, m_nSize-1, m_nSize ) : -1; }
109 int LastIndexOf(
const TYPE& value,
int nIndex ) {
return LastIndexOf( value, nIndex, nIndex+1 ); }
110 int LastIndexOf(
const TYPE& value,
int nIndex,
int nNumElements );
112 HRESULT Remove(
int nIndex ){
121 m_pData[nIndex].~TYPE();
124 MoveMemory( &m_pData[nIndex], &m_pData[nIndex+1],
sizeof(TYPE) * (m_nSize - (nIndex+1)) );
129 void RemoveAll() { SetSize(0); };
136 HRESULT SetSizeInternal(
int nNewMaxSize ){
137 if( nNewMaxSize < 0 )
143 if( nNewMaxSize == 0 )
155 else if( m_pData == NULL || nNewMaxSize > m_nMaxSize )
158 int nGrowBy = ( m_nMaxSize == 0 ) ? 16 : m_nMaxSize;
159 nNewMaxSize =
Math::Max( nNewMaxSize, m_nMaxSize + nGrowBy );
161 TYPE* pDataNew = (TYPE*) realloc( m_pData, nNewMaxSize *
sizeof(TYPE) );
162 if( pDataNew == NULL )
163 return E_OUTOFMEMORY;
166 m_nMaxSize = nNewMaxSize;
Definition: GrowableArray.h:9
different physics engine has different winding order.
Definition: EventBinding.h:32
Definition: enum_maker.hpp:46
static T Max(const T A, const T B)
Returns higher value in a generic way.
Definition: ParaMath.h:462