00001 #ifndef __PACKARRAY_H__
00002 #define __PACKARRAY_H__
00003
00004 #include "magic/mobject.h"
00005 #include "magic/mmagisupp.h"
00006
00007
00009
00010
00011
00012
00013
00014
00015
00017
00024 template <class TYPE>
00025 class PackArray : public Object {
00026 public:
00028 TYPE* data;
00029
00031 int size;
00032
00033 PackArray () {
00034 data = NULL;
00035 size = 0;
00036 }
00037
00039 PackArray (int siz) {
00040 data = NULL;
00041 size = siz;
00042 make (size);
00043 }
00044
00049 PackArray (const PackArray& orig) {
00050 data = NULL;
00051 make (orig.size);
00052 for (int i=0; i<size; i++)
00053 data[i] = orig.data[i];
00054 }
00055
00057 void make (int siz) {
00058 if (data)
00059 destroy ();
00060 size = siz;
00061 if (size>0)
00062 data = new TYPE [size];
00063 else
00064 data = NULL;
00065 }
00066
00067 ~PackArray () {
00068 destroy ();
00069 }
00070
00072 void shallowCopy (const PackArray& orig) {
00073 if (size != orig.size)
00074 make (orig.size);
00075 memcpy (data, orig.data, size*sizeof(TYPE));
00076 }
00077
00079 void destroy () {
00080 delete data;
00081 data = NULL;
00082 size = 0;
00083 }
00084
00086 void empty () {
00087 destroy ();
00088 }
00089
00093 const TYPE& operator[] (int i) const {
00094 ASSERTWITH (i>=0 && i<size,
00095 format("Index %d out of PackArray (size %d) bounds", i, size));
00096 return data [i];
00097 }
00098
00102 TYPE& operator[] (int i) {
00103 ASSERTWITH (i>=0 && i<size,
00104 format("Index %d out of PackArray (size %d) bounds", i, size));
00105 return data [i];
00106 }
00107
00113 TYPE& operator= (const PackArray& other) {
00114 if (this != &other) {
00115 destroy ();
00116 if (other.size) {
00117 data = new TYPE [other.size];
00118 size = other.size;
00119 for (int i=0; i<size; i++)
00120 data[i] = other.data[i];
00121 }
00122 }
00123 return *this;
00124 }
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00140 void resize (int newsize) {
00141 ASSERT (newsize>=0);
00142
00143 if (newsize == size)
00144 return;
00145
00146 if (newsize>0)
00147 if (data)
00148 data = (TYPE*) renew (data, sizeof (TYPE)*newsize);
00149 else
00150 data = new TYPE [newsize];
00151 else
00152 destroy ();
00153
00154 size = newsize;
00155 }
00156
00158
00159
00160
00161
00162
00163
00164
00165
00166
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00181 virtual void check () const {
00182 ASSERT ((data?1:0) == (size?1:0));
00183 ASSERT (((unsigned int&)*this) != 0xdddddddd);
00184 if (data)
00185 ASSERT (((unsigned int&)*data) != 0xdddddddd);
00186 ASSERT (size>=0);
00187 ASSERTWITH (size<10000000, "Reasonable array size maximum. Grow if necessary");
00188 }
00189
00190 private:
00191 };
00192
00193 #endif