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