raSystem  1.0 bata
raArray.h
Go to the documentation of this file.
1 // DXUT CGrowableArray ist das hier, naja meine version war sehr verbugt.
2 
3  template<typename TYPE> class raArray
4  {
5  public:
6  raArray() { m_pData = NULL; m_nSize = 0; m_nMaxSize = 0; }
7  //raArray( const raArray<TYPE>& a ) : raClass("raArray") { for( int i=0; i < int(a.m_nSize); i++ ) Add( a.m_pData[i] ); }
8  ~raArray() { RemoveAll(); }
9 
10  const TYPE& operator[]( raInt nIndex ) const { return GetAt( (int)nIndex ); }
11  TYPE& operator[]( raInt nIndex ) { return GetAt( (int)nIndex ); }
12 
13  raArray& operator=( const raArray<TYPE>& a ) { if( this == &a ) return *this; RemoveAll(); for( int i=0; i < a.m_nSize; i++ ) Add( a.m_pData[i] ); return *this; }
14 
15  HRESULT SetSize( raInt nNewMaxSize );
16  HRESULT Add( const TYPE& value );
17  HRESULT Insert( raInt nIndex, const TYPE& value );
18  HRESULT SetAt( raInt nIndex, const TYPE& value );
19  TYPE& GetAt( raInt nIndex ) const { assert( (int)nIndex >= 0 && (int)nIndex < (int)m_nSize ); return m_pData[(int)nIndex]; }
20  raInt GetSize() const { return m_nSize; }
21  TYPE* GetData() { return m_pData; }
22  bool Contains( const TYPE& value ){ return ( -1 != IndexOf( value ) ); }
23 
24  raInt IndexOf( const TYPE& value ) { return ( m_nSize > 0 ) ? IndexOf( value, 0, m_nSize ) : -1; }
25  raInt IndexOf( const TYPE& value, raInt iStart ) { return IndexOf( value, iStart, m_nSize - iStart ); }
26  raInt IndexOf( const TYPE& value, raInt nIndex, raInt nNumElements );
27 
28  raInt LastIndexOf( const TYPE& value ) { return ( m_nSize > 0 ) ? LastIndexOf( value, m_nSize-1, m_nSize ) : -1; }
29  raInt LastIndexOf( const TYPE& value, raInt nIndex ) { return LastIndexOf( value, nIndex, nIndex+1 ); }
30  raInt LastIndexOf( const TYPE& value, raInt nIndex, raInt nNumElements );
31 
32  HRESULT Remove( raInt nIndex );
33  void RemoveAll() { SetSize(0); }
34  void Reset() { m_nSize = 0; }
35 
36  protected:
37  virtual void __vsforeach( void (* func)(TYPE))
38  {
39  for(int i= 0; i < (int)GetSize(); i++)
40  {
41  if(func) func (GetAt(i));
42  }
43  }
44 
45  HRESULT SetSizeInternal( int nNewMaxSize );
46  protected:
47  TYPE* m_pData;
50  };
51  template<typename TYPE> HRESULT raArray <TYPE>::SetSizeInternal( int nNewMaxSize )
52  {
53  if( nNewMaxSize < 0 || ( nNewMaxSize > INT_MAX / sizeof( TYPE ) ) )
54  {
55  assert( false );
56  return E_INVALIDARG;
57  }
58 
59  if( nNewMaxSize == 0 )
60  {
61  if( m_pData )
62  {
63  free( m_pData );
64  m_pData = NULL;
65  }
66 
67  m_nMaxSize = 0;
68  m_nSize = 0;
69  }
70  else if( m_pData == NULL || nNewMaxSize > m_nMaxSize )
71  {
72  raInt nGrowBy = ( m_nMaxSize == 0 ) ? 16 : m_nMaxSize;
73 
74  if( ( UINT )m_nMaxSize + ( UINT )nGrowBy > ( UINT )INT_MAX )
75  nGrowBy = INT_MAX - m_nMaxSize;
76 
77  nNewMaxSize = __max( nNewMaxSize, m_nMaxSize + nGrowBy );
78 
79  if( sizeof( TYPE ) > UINT_MAX / ( UINT )nNewMaxSize )
80  return E_INVALIDARG;
81 
82  TYPE* pDataNew = ( TYPE* )std::realloc( m_pData, nNewMaxSize * sizeof( TYPE ) );
83  if( pDataNew == NULL )
84  return E_OUTOFMEMORY;
85 
86  m_pData = pDataNew;
87  m_nMaxSize = nNewMaxSize;
88  }
89 
90  return S_OK;
91  }
92  template<typename TYPE> HRESULT raArray <TYPE>::SetSize( raInt nNewMaxSize )
93  {
94  raInt nOldSize = m_nSize;
95 
96  if( (int)nOldSize > (int)nNewMaxSize )
97  {
98  assert( m_pData );
99  if( m_pData )
100  {
101  for( int i = (int)nNewMaxSize; i < (int)nOldSize; ++i )
102  m_pData[i].~TYPE();
103  }
104  }
105  HRESULT hr = SetSizeInternal( nNewMaxSize );
106 
107  if( nOldSize < nNewMaxSize )
108  {
109  assert( m_pData );
110  if( m_pData )
111  {
112  for( int i = nOldSize; i < nNewMaxSize; ++i )
113  ::new ( &m_pData[i] ) TYPE;
114  }
115  }
116 
117  return hr;
118  }
119  template<typename TYPE> HRESULT raArray <TYPE>::Add( const TYPE& value )
120  {
121  HRESULT hr;
122  if( FAILED( hr = SetSizeInternal( m_nSize + 1 ) ) )
123  return hr;
124 
125  ::new ( &m_pData[m_nSize] ) TYPE;
126 
127  m_pData[m_nSize] = value;
128  ++m_nSize;
129 
130  return S_OK;
131  }
132  template<typename TYPE> HRESULT raArray <TYPE>::Insert( raInt nIndex, const TYPE& value )
133  {
134  HRESULT hr;
135 
136  if( nIndex < 0 ||
137  nIndex > m_nSize )
138  {
139  assert( false );
140  return E_INVALIDARG;
141  }
142 
143  if( FAILED( hr = SetSizeInternal( m_nSize + 1 ) ) )
144  return hr;
145 
146  MoveMemory( &m_pData[nIndex + 1], &m_pData[nIndex], sizeof( TYPE ) * ( (int)m_nSize - (int)nIndex ) );
147 
148  ::new ( &m_pData[nIndex] ) TYPE;
149 
150  m_pData[nIndex] = value;
151  ++m_nSize;
152 
153  return S_OK;
154  }
155 
156  template<typename TYPE> HRESULT raArray <TYPE>::SetAt( raInt nIndex, const TYPE& value )
157  {
158  // Validate arguments
159  if( nIndex < 0 ||
160  nIndex >= m_nSize )
161  {
162  assert( false );
163  return E_INVALIDARG;
164  }
165 
166  m_pData[(int)nIndex] = value;
167  return S_OK;
168  }
169 
170  template<typename TYPE> raInt raArray <TYPE>::IndexOf( const TYPE& value, raInt iStart, raInt nNumElements )
171  {
172  // Validate arguments
173  if( iStart < 0 ||
174  iStart >= m_nSize ||
175  nNumElements < 0 ||
176  iStart + nNumElements > m_nSize )
177  {
178  assert( false );
179  return -1;
180  }
181 
182  // Search
183  for( int i = iStart; i < ( iStart + nNumElements ); i++ )
184  {
185  if( value == m_pData[i] )
186  return i;
187  }
188 
189  // Not found
190  return -1;
191  }
192  template<typename TYPE> raInt raArray <TYPE>::LastIndexOf( const TYPE& value, raInt iEnd, raInt nNumElements )
193  {
194  // Validate arguments
195  if( iEnd < 0 ||
196  iEnd >= m_nSize ||
197  nNumElements < 0 ||
198  iEnd - nNumElements < 0 )
199  {
200  assert( false );
201  return -1;
202  }
203 
204  // Search
205  for( int i = iEnd; i > ( iEnd - nNumElements ); i-- )
206  {
207  if( value == m_pData[i] )
208  return i;
209  }
210 
211  // Not found
212  return -1;
213  }
214 
215  //--------------------------------------------------------------------------------------
216  template<typename TYPE> HRESULT raArray <TYPE>::Remove( raInt nIndex )
217  {
218  if( nIndex < 0 ||
219  nIndex >= m_nSize )
220  {
221  assert( false );
222  return E_INVALIDARG;
223  }
224 
225  // Destruct the element to be removed
226  m_pData[(int)nIndex].~TYPE();
227 
228  // Compact the array and decrease the size
229  MoveMemory( &m_pData[nIndex], &m_pData[(int)nIndex + 1], sizeof( TYPE ) * ( m_nSize - ( (int)(nIndex) + 1 ) ) );
230  --m_nSize;
231 
232  return S_OK;
233  }
bool Contains(const TYPE &value)
Definition: raArray.h:22
TYPE * m_pData
Definition: raArray.h:47
HRESULT Remove(raInt nIndex)
Definition: raArray.h:216
HRESULT SetSizeInternal(int nNewMaxSize)
Definition: raArray.h:51
TYPE * GetData()
Definition: raArray.h:21
raInt LastIndexOf(const TYPE &value, raInt nIndex)
Definition: raArray.h:29
raInt LastIndexOf(const TYPE &value)
Definition: raArray.h:28
void Reset()
Definition: raArray.h:34
TYPE & GetAt(raInt nIndex) const
Definition: raArray.h:19
~raArray()
Definition: raArray.h:8
raInt m_nMaxSize
Definition: raArray.h:49
const TYPE & operator[](raInt nIndex) const
Definition: raArray.h:10
void RemoveAll()
Definition: raArray.h:33
raInt IndexOf(const TYPE &value, raInt iStart)
Definition: raArray.h:25
HRESULT SetAt(raInt nIndex, const TYPE &value)
Definition: raArray.h:156
HRESULT SetSize(raInt nNewMaxSize)
Definition: raArray.h:92
raInt IndexOf(const TYPE &value)
Definition: raArray.h:24
virtual void __vsforeach(void(*func)(TYPE))
Definition: raArray.h:37
raInt m_nSize
Definition: raArray.h:48
HRESULT Add(const TYPE &value)
Definition: raArray.h:119
raArray()
Definition: raArray.h:6
int raInt
Definition: raMain.h:108
raInt GetSize() const
Definition: raArray.h:20
TYPE & operator[](raInt nIndex)
Definition: raArray.h:11
raArray & operator=(const raArray< TYPE > &a)
Definition: raArray.h:13
HRESULT Insert(raInt nIndex, const TYPE &value)
Definition: raArray.h:132
Definition: raArray.h:3