Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __DYN_ARRAY_H__
00025 #define __DYN_ARRAY_H__
00026
00027 template<class T> class DynArray {
00028 public:
00029 DynArray(const T * val = 0, intptr_t initial_size = 0);
00030 ~DynArray();
00031
00032 #ifndef __GNUC__
00033 operator const T *() const;
00034 #endif
00035 operator T *();
00036 T & operator[](intptr_t idx);
00037 T & operator()(intptr_t idx);
00038 T *detach();
00039 T defvalue() const;
00040 intptr_t length();
00041 void clear();
00042 void set_length(intptr_t i);
00043
00044 private:
00045 void resize(intptr_t new_size);
00046
00047 private:
00048 T * data;
00049 const T *default_val;
00050 int size;
00051 int pos;
00052 };
00053
00054
00055 template<class T> inline DynArray<T>::DynArray(const T * val, intptr_t initial_size)
00056 :
00057 data(NULL),
00058 default_val(val),
00059 size(0),
00060 pos(-1)
00061 {
00062 if (initial_size > 0) {
00063 int i = 1;
00064
00065 while (i < initial_size)
00066 i <<= 1;
00067
00068 resize(i);
00069 }
00070
00071 }
00072
00073 template<class T> inline DynArray<T>::~DynArray()
00074 {
00075 if (data) {
00076 delete[]data;
00077 }
00078 }
00079
00080 #ifndef __GNUC__
00081 template<class T> inline DynArray<T>::operator const T *()
00082 const
00083 {
00084 return
00085 data;
00086 }
00087 #endif
00088
00089 template <
00090 class
00091 T >
00092 inline
00093 DynArray <
00094 T >::operator
00095 T * ()
00096 {
00097 return data;
00098 }
00099
00100 template<class T> inline T & DynArray<T>::operator [](intptr_t idx) {
00101 return data[idx];
00102 }
00103
00104 template<class T> inline T & DynArray<T>::operator ()(intptr_t idx) {
00105 if (idx >= size) {
00106 intptr_t new_size;
00107
00108 if (size == 0) {
00109 new_size = 64;
00110 } else {
00111 new_size = size * 2;
00112 }
00113
00114 if (idx >= new_size) {
00115 new_size = idx + 1;
00116 }
00117
00118 resize(new_size);
00119 }
00120
00121 if (idx > pos) {
00122 pos = idx;
00123 }
00124
00125 return data[idx];
00126 }
00127
00128 template<class T> inline T * DynArray<T>::detach()
00129 {
00130 T *d;
00131
00132 d = data;
00133 data = NULL;
00134
00135 return d;
00136 }
00137
00138 template<class T> inline T DynArray<T>::defvalue() const
00139 {
00140 return *default_val;
00141 }
00142
00143 template<class T> inline intptr_t DynArray<T>::length()
00144 {
00145 return pos + 1;
00146 }
00147
00148 template<class T> inline void DynArray<T>::clear()
00149 {
00150 if (data) {
00151 delete[]data;
00152 data = NULL;
00153 }
00154
00155 size = 0;
00156 pos = -1;
00157 }
00158
00159 template<class T> inline void DynArray<T>::set_length(intptr_t i)
00160 {
00161 pos = i - 1;
00162 }
00163
00164 template<class T> inline void DynArray<T>::resize(intptr_t new_size)
00165 {
00166 if (new_size > size) {
00167 T *new_data;
00168 intptr_t i;
00169
00170 new_data = new T[new_size];
00171
00172 for (i = 0; i < size; i++) {
00173 new_data[i] = data[i];
00174 }
00175
00176 for (; i < new_size; i++) {
00177 if (default_val)
00178 new_data[i] = (T) * default_val;
00179 }
00180
00181 if (data) {
00182 delete[]data;
00183 }
00184 data = new_data;
00185 size = new_size;
00186 }
00187 }
00188
00189
00190 #endif
00191