00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _DYNARRAY_H_
00026 #define _DYNARRAY_H_
00027
00028 #include <assert.h>
00029 #include <cstdlib>
00030
00040 namespace HL {
00041
00042 template <class ObjType>
00043 class DynamicArray {
00044 public:
00045 DynamicArray (void)
00046 : internalArray (NULL),
00047 internalArrayLength (0)
00048 {}
00049
00050 ~DynamicArray (void)
00051 {
00052 clear();
00053 }
00054
00056 inline void clear (void) {
00057 if (internalArray != NULL) {
00058 delete internalArray;
00059 internalArray = NULL;
00060 internalArrayLength = 0;
00061
00062 }
00063 }
00064
00066 inline const ObjType& operator[] (int index) const {
00067 assert (index < internalArrayLength);
00068 assert (index >= 0);
00069 return internalArray[index];
00070 }
00071
00073 inline ObjType& operator[] (int index) {
00074 assert (index >= 0);
00075 if (index >= internalArrayLength) {
00076
00077
00078
00079
00080 const int newSize = index * 2 + 1;
00081 ObjType * arr = new ObjType[newSize];
00082 #if MALLOC_TRACE
00083 printf ("m %x %d\n", arr, newSize * sizeof(ObjType));
00084 #endif
00085 if (internalArray != NULL) {
00086 memcpy (arr, internalArray, internalArrayLength * sizeof(ObjType));
00087 delete internalArray;
00088 #if MALLOC_TRACE
00089 printf ("f %x\n", internalArray);
00090 #endif
00091 }
00092 internalArray = arr;
00093 internalArrayLength = newSize;
00094
00095 }
00096 return internalArray[index];
00097 }
00098
00104 inline void trim (int nelts) {
00105
00106
00107
00108
00109 if (internalArray != NULL) {
00110 if (nelts * 4 < internalArrayLength) {
00111 const int newSize = nelts * 2;
00112 ObjType * arr = new ObjType[newSize];
00113 #if MALLOC_TRACE
00114 printf ("m %x %d\n", arr, newSize * sizeof(ObjType));
00115 #endif
00116 memcpy (arr, internalArray, sizeof(ObjType) * nelts);
00117 delete internalArray;
00118 #if MALLOC_TRACE
00119 printf ("f %x\n", internalArray);
00120 #endif
00121 internalArray = arr;
00122 internalArrayLength = newSize;
00123 }
00124 assert (nelts <= internalArrayLength);
00125 }
00126 }
00127
00128
00129 private:
00130
00132 ObjType * internalArray;
00133
00135 int internalArrayLength;
00136 };
00137
00138 };
00139
00140 #endif