Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

mpackarray.h

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

Generated on Thu Feb 10 20:06:42 2005 for LibMagiC by doxygen1.2.18