Main Page   Class Hierarchy   Compound List   File List   Compound Members  

mpackarray.h

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++)  // We have to copy these explicitly
00120                     data[i] = other.data[i];
00121             }
00122         }
00123         return *this;
00124     }
00125 
00126     /*
00127     void    removeFill  (int pos) {
00128         ASSERTWITH (i>=0 && i<size,
00129                     format("Index %d out of PackArray (size %d) bounds", i, size));
00130         delete data[pos];
00131         for (int i=pos; i<size-2; i++)
00132             data[i] = data[i+1];
00133         data[size-1]=NULL;
00134         resize (size-1);
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     virtual CArchive&   operator>>  (CArchive& arc) const {
00160         arc << size;
00161         for (int i=0; i<size; i++)
00162             arc << data[i];
00163         return arc;
00164     }
00165     */
00166     
00168     /*
00169     virtual IStream&    operator<<  (IStream& arc) {
00170         int nsize;
00171         arc >> nsize;
00172         destroy ();
00173         make (nsize);
00174         for (int i=0; i<size; i++)
00175             arc >> data[i];
00176         return arc;
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

Generated at Tue Dec 4 19:53:27 2001 for MagiC++ by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001