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 RESIZEARRAY_TEMPLATE_H
00026 #define RESIZEARRAY_TEMPLATE_H
00027
00028 #include <stddef.h>
00029 #include <string.h>
00030
00040 template<class T>
00041 class ResizeArray {
00042 private:
00043 T *allocate(size_t n) { return new T[n]; }
00044 void deallocate(T *p) { delete [] p; }
00045
00046 T *data;
00047 ptrdiff_t sz;
00048 ptrdiff_t currSize;
00049
00050
00051 public:
00056 ResizeArray(ptrdiff_t s = 3L) {
00057 currSize = 0;
00058 sz = (s > 0 ? s : 10L);
00059 data = allocate(sz);
00060 }
00061
00062 ~ResizeArray() {
00063 deallocate(data);
00064 }
00065
00066 ptrdiff_t num(void) const { return currSize; }
00067 T& operator[](ptrdiff_t N) { return data[N]; }
00068 T const& operator[](ptrdiff_t N) const { return data[N]; }
00069
00071 void set_size(ptrdiff_t N) {
00072
00073 if (N > sz) {
00074 extend(N - sz + 1L);
00075 }
00076 currSize = N;
00077 }
00078
00079
00081 void extend(ptrdiff_t addN) {
00082 if ((currSize+addN) >= sz) {
00083
00084
00085
00086 ptrdiff_t newsize = (ptrdiff_t(float(sz) * 1.3f)) + addN;
00087
00088
00089
00090 T *newdata = allocate(newsize);
00091 memcpy(newdata, data, currSize * sizeof(T));
00092 deallocate(data);
00093
00094
00095 data = newdata;
00096 sz = newsize;
00097 }
00098 }
00099
00100
00102 void append(const T& val) {
00103 if (currSize == sz) {
00104 #if 1
00105 ptrdiff_t newsize = ptrdiff_t(float(sz) * 1.3f);
00106
00107
00108
00109
00110 if (newsize == sz)
00111 newsize++;
00112 #else
00113 extend(1);
00114 #endif
00115
00116
00117
00118 T *newdata = allocate(newsize);
00119 #if defined(_MSC_VER)
00120 memcpy((void *)newdata, (const void *)data, currSize * sizeof(T));
00121 #else
00122 memcpy(static_cast<void *>(newdata), static_cast<const void *>(data), currSize * sizeof(T));
00123 #endif
00124 deallocate(data);
00125
00126
00127 data = newdata;
00128 sz = newsize;
00129 }
00130 data[currSize++] = val;
00131 }
00132
00133
00135 void append2(const T& vala, const T& valb) {
00136 extend(2);
00137 data[currSize++] = vala;
00138 data[currSize++] = valb;
00139 }
00140
00141
00143 void append3(const T& vala, const T& valb, const T& valc) {
00144 extend(3);
00145 data[currSize++] = vala;
00146 data[currSize++] = valb;
00147 data[currSize++] = valc;
00148 }
00149
00150
00152 void append4(const T& vala, const T& valb, const T& valc, const T& vald) {
00153 extend(4);
00154 data[currSize++] = vala;
00155 data[currSize++] = valb;
00156 data[currSize++] = valc;
00157 data[currSize++] = vald;
00158 }
00159
00160
00162 void appendN(const T& val, ptrdiff_t addN) {
00163 extend(addN);
00164 ptrdiff_t j;
00165 for (j=0; j<addN; j++)
00166 data[currSize++] = val;
00167 }
00168
00169
00171 void append3(const T *vals) {
00172 extend(3);
00173 data[currSize++] = vals[0];
00174 data[currSize++] = vals[1];
00175 data[currSize++] = vals[2];
00176 }
00177
00178
00180 void append2x3(const T *valsa, const T *valsb) {
00181 extend(6);
00182 data[currSize++] = valsa[0];
00183 data[currSize++] = valsa[1];
00184 data[currSize++] = valsa[2];
00185
00186 data[currSize++] = valsb[0];
00187 data[currSize++] = valsb[1];
00188 data[currSize++] = valsb[2];
00189 }
00190
00191
00193 void append3x3(const T *valsa, const T *valsb, const T *valsc) {
00194 extend(9);
00195 data[currSize++] = valsa[0];
00196 data[currSize++] = valsa[1];
00197 data[currSize++] = valsa[2];
00198
00199 data[currSize++] = valsb[0];
00200 data[currSize++] = valsb[1];
00201 data[currSize++] = valsb[2];
00202
00203 data[currSize++] = valsc[0];
00204 data[currSize++] = valsc[1];
00205 data[currSize++] = valsc[2];
00206 }
00207
00208
00211 void append9(const T *vals) {
00212 extend(9);
00213 data[currSize++] = vals[0];
00214 data[currSize++] = vals[1];
00215 data[currSize++] = vals[2];
00216 data[currSize++] = vals[3];
00217 data[currSize++] = vals[4];
00218 data[currSize++] = vals[5];
00219 data[currSize++] = vals[6];
00220 data[currSize++] = vals[7];
00221 data[currSize++] = vals[8];
00222 }
00223
00224
00226 void appendlist(const T *vals, ptrdiff_t addN) {
00227 extend(addN);
00228 ptrdiff_t j;
00229 for (j=0; j<addN; j++)
00230 data[currSize++] = vals[j];
00231 }
00232
00233
00235 void remove(ptrdiff_t n) {
00236 if (n < 0 || n >= currSize) return;
00237 for (ptrdiff_t i=n; i<currSize-1; i++)
00238 data[i] = data[i+1];
00239 currSize--;
00240 }
00241
00243 T& pop() {
00244 currSize--;
00245 return data[currSize];
00246 }
00247
00249 void clear() {
00250 currSize = 0;
00251 }
00252
00254 void truncatelastn(ptrdiff_t N) {
00255 currSize -= N;
00256 if (currSize < 0)
00257 currSize=0;
00258 }
00259
00262 ptrdiff_t find(const T& val) {
00263 ptrdiff_t i;
00264
00265 for (i=0; i < currSize; i++) {
00266 if (data[i] == val)
00267 return i;
00268 }
00269
00270 return -1;
00271 }
00272 };
00273
00274 #endif
00275