00001
00025 #ifndef __REFARRAY_H__
00026 #define __REFARRAY_H__
00027
00028 BEGIN_NAMESPACE (MagiC);
00029
00030
00032
00033
00034
00035
00036
00037
00038
00040
00041 template <class TYPE>
00042
00043
00044 class RefArray {
00045 TYPE** mpRep;
00046 int mSize;
00047 public:
00048
00049 RefArray () {
00050 mSize = 0,
00051 mpRep = NULL;
00052 }
00053
00054
00055 RefArray (const Array<TYPE>& orig) {
00056 mSize = 0;
00057 mpRep = NULL;
00058 *this = orig;
00059 }
00060
00061
00062 RefArray (const RefArray<TYPE>& orig) {
00063 mSize = 0;
00064 mpRep = NULL;
00065 *this = orig;
00066 }
00067
00068 RefArray (int size) {
00069 mSize = 0;
00070 mpRep = NULL;
00071 make (size);
00072 }
00073
00074 void make (int size) {
00075 delete mpRep;
00076 mpRep = new TYPE* [size];
00077 mSize = size;
00078
00079 for (int i=0; i<size; i++)
00080 mpRep [i] = NULL;
00081 }
00082
00083 int size () const {return mSize;}
00084
00085 void operator= (const Array<TYPE>& orig) {
00086 make (orig.size());
00087 for (int i=0; i<mSize; i++)
00088 mpRep[i] = (TYPE*) orig.getp (i);
00089 }
00090
00091 void operator= (const RefArray<TYPE>& orig) {
00092 make (orig.size());
00093 for (int i=0; i<mSize; i++)
00094 mpRep [i] = orig.mpRep[i];
00095 }
00096
00097 virtual ~RefArray () {
00098 delete mpRep;
00099 }
00100
00102 void empty () {
00103 delete mpRep;
00104 mpRep = NULL;
00105 mSize = 0;
00106 }
00107
00109 void add (TYPE* pItem) {
00110 resize (mSize + 1);
00111 mpRep[mSize-1] = pItem;
00112 }
00113
00115 void put (TYPE* pItem, int loc) {
00116 PRE (pItem != NULL && loc >= 0 && loc < mSize);
00117 delete mpRep [loc];
00118 mpRep [loc] = pItem;
00119 }
00120
00121
00122 TYPE& operator[] (int loc) {
00123 PRE (loc >= 0 && loc < mSize);
00124 return *mpRep [loc];
00125 }
00126
00127
00128 const TYPE& operator[] (int loc) const {
00129 PRE (loc >= 0 && loc < mSize);
00130 return *mpRep [loc];
00131 }
00132
00133 void resize (int newsize) {
00134
00135 PRE (newsize > 0);
00136 if (newsize < mSize) {
00137 mpRep = (TYPE**) renew (mpRep, sizeof (TYPE*)*(newsize));
00138 } else {
00139 mpRep = (TYPE**) renew (mpRep, sizeof (TYPE*)*(newsize));
00140 for (int i=mSize; i < newsize; i++)
00141 mpRep[i] = NULL;
00142 }
00143 mSize = newsize;
00144 }
00145
00150 void quicksort () {
00151 qsort (mpRep, mSize, sizeof (TYPE*), compareComparable);
00152 }
00153 };
00154
00155 #define CRefArray RefArray
00156
00157 END_NAMESPACE;
00158
00159 #endif
00160