00001 #ifndef _ARRAY_H_
00002 #define _ARRAY_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef _WIN32
00023 #pragma once
00024 #endif
00025
00026 #include <Common/ArrayHelper.h>
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 template <typename T> class FdoArray
00069 {
00070 public:
00071
00072
00073
00074
00075
00076
00077
00078 static FdoArray<T> * Create();
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 static FdoArray<T> * Create(FdoInt32 initialAlloc);
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 static FdoArray<T> * Create(const T* elements, FdoInt32 initialNumElements);
00101
00102
00103
00104
00105
00106
00107
00108 inline FdoInt32 AddRef() { return ++((FdoArrayHelper::GenericArray*)this)->m_metadata.refCount; }
00109
00110
00111
00112
00113
00114
00115 inline FdoInt32 Release()
00116 {
00117 #ifdef _DEBUG
00118 if (((FdoArrayHelper::GenericArray*)this)->m_metadata.refCount <= 0)
00119 throw FdoException::Create(FdoException::NLSGetMessage(FDO_NLSID(FDO_1_MEMORY_DEALLOCATION_ERROR),
00120 L"FdoArray::Release",
00121 L"FDO Array"));
00122 #endif
00123 if (0 != --((FdoArrayHelper::GenericArray*)this)->m_metadata.refCount )
00124 return ((FdoArrayHelper::GenericArray*)this)->m_metadata.refCount;
00125 Dispose();
00126 return 0;
00127 }
00128
00129
00130
00131
00132
00133
00134
00135 inline FdoInt32 GetRefCount() { return ((FdoArrayHelper::GenericArray*)this)->m_metadata.refCount; }
00136
00137
00138
00139
00140
00141
00142
00143 FdoInt32 GetCount() const { return ((FdoArrayHelper::GenericArray*)this)->m_metadata.size; }
00144
00145
00146
00147
00148
00149
00150 T* GetData() { return (T*)(((FdoArrayHelper::GenericArray*)this)->GetData()); }
00151
00152
00153
00154
00155
00156
00157 const T* GetData() const {return (const T*)(((FdoArrayHelper::GenericArray*)this)->GetData()); }
00158
00159
00160
00161
00162
00163
00164
00165 static FdoArray<T> * SetSize(FdoArray<T> * array, FdoInt32 numElements);
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180 static FdoArray<T> * Append(FdoArray<T> * array, FdoInt32 numElements, T * elements);
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192 static FdoArray<T> * Append(FdoArray<T> * array, T element);
00193
00194
00195
00196
00197
00198
00199 void Clear();
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 const T& operator[](int i) const { return GetValue(i); }
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220 T& operator[](int i) { return GetValue(i); }
00221
00222 protected:
00223
00224 FdoArray() {}
00225
00226 static FdoArray<T> * AllocMore(FdoArray<T> * array, FdoInt32 atLeastThisMuch, bool exactly);
00227 static FdoArray<T> * SetAlloc(FdoArray<T> * array, FdoInt32 numElements);
00228
00229
00230 const T& GetValue(FdoInt32 i) const;
00231 T& GetValue(FdoInt32 i);
00232 void SetValue(FdoInt32 i, T newElement);
00233
00234
00235 void Dispose();
00236 };
00237
00238 template <class T>
00239 inline
00240 FdoArray<T> * FdoArray<T>::Create()
00241 {
00242 return AllocMore(0, 0, true);
00243 }
00244
00245 template <class T>
00246 inline
00247 FdoArray<T> * FdoArray<T>::Create(FdoInt32 initialAlloc)
00248 {
00249 return AllocMore(0, initialAlloc, true);
00250 }
00251
00252 template <class T>
00253 inline
00254 FdoArray<T> * FdoArray<T>::Create(const T* elements, FdoInt32 initialNumElements)
00255 {
00256 FdoArray<T> * array = AllocMore(0, initialNumElements, true);
00257 if (array != NULL)
00258 array = (FdoArray<T> *)FdoArrayHelper::Append((FdoArrayHelper::GenericArray*) array, initialNumElements, (FdoByte*) elements, sizeof(T));
00259 return array;
00260 }
00261
00262 template <class T>
00263 inline
00264 FdoArray<T> * FdoArray<T>::Append(FdoArray<T> * array, FdoInt32 numElements, T * elements)
00265 {
00266 array = (FdoArray<T> *)FdoArrayHelper::Append((FdoArrayHelper::GenericArray*) array, numElements, (FdoByte*) elements, sizeof(T));
00267 return array;
00268 }
00269
00270 template <class T>
00271 inline
00272 FdoArray<T> * FdoArray<T>::Append(FdoArray<T> * array, T element)
00273 {
00274 if ( ((FdoArrayHelper::GenericArray*)array)->m_metadata.size == ((FdoArrayHelper::GenericArray*)array)->m_metadata.alloc )
00275 {
00276 array = (FdoArray<T> *)FdoArrayHelper::AllocMore((FdoArrayHelper::GenericArray*) array, 1, false , sizeof(T));
00277 }
00278 array->GetValue((((FdoArrayHelper::GenericArray*)array)->m_metadata.size)++) = element;
00279 return array;
00280 }
00281
00282 template <class T>
00283 inline
00284 void FdoArray<T>::Clear()
00285 {
00286
00287 SetSize(this, 0);
00288 }
00289
00290 template <class T>
00291 inline
00292 FdoArray<T> * FdoArray<T>::SetSize(FdoArray<T> * array, FdoInt32 numElements)
00293 {
00294 array = (FdoArray<T> *)FdoArrayHelper::SetSize((FdoArrayHelper::GenericArray*) array, numElements, sizeof(T));
00295 return array;
00296 }
00297
00298 template <class T>
00299 inline
00300 FdoArray<T> * FdoArray<T>::SetAlloc(FdoArray<T> * array, FdoInt32 numElements)
00301 {
00302 array = (FdoArray<T> *)FdoArrayHelper::SetAlloc((FdoArrayHelper::GenericArray*) array, numElements, sizeof(T));
00303 return array;
00304 }
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314 template <class T>
00315 inline
00316 FdoArray<T> * FdoArray<T>::AllocMore(FdoArray<T> * array, FdoInt32 atLeastThisMuch, bool exactly)
00317 {
00318 array = (FdoArray<T> *)FdoArrayHelper::AllocMore((FdoArrayHelper::GenericArray*) array, atLeastThisMuch, exactly, sizeof(T));
00319 return array;
00320 }
00321
00322 template <class T>
00323 inline
00324 void FdoArray<T>::Dispose()
00325 {
00326 FdoArrayHelper::DisposeOfArray((FdoArrayHelper::GenericArray*) this, sizeof(T));
00327 }
00328
00329 template <class T>
00330 inline
00331 const T& FdoArray<T>::GetValue(FdoInt32 i) const
00332 {
00333 if (i >= GetCount() || i < 0)
00334 throw FdoException::Create(FdoException::NLSGetMessage(FDO_NLSID(FDO_5_INDEXOUTOFBOUNDS)));
00335
00336 return *(this->GetData()+i);
00337 }
00338
00339 template <class T>
00340 inline
00341 T& FdoArray<T>::GetValue(FdoInt32 i)
00342 {
00343 if (i >= GetCount() || i < 0)
00344 throw FdoException::Create(FdoException::NLSGetMessage(FDO_NLSID(FDO_5_INDEXOUTOFBOUNDS)));
00345
00346 return *(this->GetData()+i);
00347 }
00348
00349 template <class T>
00350 inline
00351 void FdoArray<T>::SetValue(FdoInt32 i, T newElement)
00352 {
00353 if (i >= GetCount() || i < 0)
00354 throw FdoException::Create(FdoException::NLSGetMessage(FDO_NLSID(FDO_5_INDEXOUTOFBOUNDS)));
00355
00356 *(this->GetData()+i) = newElement;
00357 }
00358
00359
00360
00361
00362 typedef FdoArray<FdoByte> FdoByteArray;
00363
00364
00365
00366
00367 typedef FdoArray<FdoDouble> FdoDoubleArray;
00368
00369
00370
00371
00372 typedef FdoArray<FdoInt32> FdoIntArray;
00373
00374 #endif
00375
00376