00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __REFARRAY_H__
00026 #define __REFARRAY_H__
00027
00029
00030
00031
00032
00033
00034
00035
00037
00038 template <class TYPE>
00039
00040
00041 class RefArray {
00042 public:
00043 TYPE** rep;
00044 int lower, upper, size;
00045
00046 RefArray () {
00047 lower = 0,
00048 upper = -1,
00049 size = 0,
00050 rep = NULL;
00051 }
00052
00053
00054 RefArray (const Array<TYPE>& orig) {
00055 lower = 0;
00056 upper = -1;
00057 size = 0;
00058 rep = NULL;
00059 operator= (orig);
00060 }
00061
00062
00063 RefArray (const RefArray<TYPE>& orig) {
00064 lower = 0;
00065 upper = -1;
00066 size = 0;
00067 rep = NULL;
00068 operator= (orig);
00069 }
00070
00071 RefArray (int low, int upp) {
00072 size = 0;
00073 make (low, upp);
00074 }
00075
00076 void make (int low, int upp) {
00077 PRE (low <= upp);
00078 lower = low,
00079 upper = upp,
00080 size = upper-lower+1;
00081
00082 delete rep;
00083 rep = new TYPE* [size];
00084
00085 for (int i=0; i<size; i++)
00086 rep [i] = NULL;
00087 }
00088
00089 void operator= (const Array<TYPE>& orig) {
00090 make (orig.lower, orig.upper);
00091 for (int i=0; i<size; i++)
00092 rep [i] = (TYPE*) orig.getp (i);
00093 }
00094
00095 void operator= (const RefArray<TYPE>& orig) {
00096 make (orig.lower, orig.upper);
00097 for (int i=0; i<size; i++)
00098 rep [i] = orig.rep[i];
00099 }
00100
00101 virtual ~RefArray () {
00102 delete rep;
00103 }
00104
00105
00106 void empty () {
00107 delete rep;
00108 rep = NULL;
00109 size = 0;
00110 upper=lower-1;
00111
00112
00113
00114 }
00115
00116 void add (TYPE* i) {
00117
00118 resize (lower, upper+1);
00119 rep[upper-lower] = i;
00120 }
00121
00122 void put (TYPE* i, int loc) {
00123
00124 PRE (i != NULL && loc>= lower && loc<=upper);
00125 delete rep [loc-lower];
00126 rep [loc-lower] = i;
00127 }
00128
00129
00130 TYPE& operator[] (int loc) {
00131 PRE (loc>= lower && loc<=upper);
00132 return *rep [loc-lower];
00133 }
00134
00135
00136 const TYPE& operator[] (int loc) const {
00137 PRE (loc>= lower && loc<=upper);
00138 return *rep [loc-lower];
00139 }
00140
00141 void resize (int low, int upp) {
00142
00143 PRE (low <= upp);
00144 int nsize = upp-low+1;
00145 if (nsize < size) {
00146 rep = (TYPE**) renew (rep, sizeof (TYPE*)*(nsize));
00147 } else {
00148 rep = (TYPE**) renew (rep, sizeof (TYPE*)*(nsize));
00149 for (int i=size; i<nsize; i++)
00150 rep [i] = NULL;
00151 }
00152 lower = low,
00153 upper = upp,
00154 size = nsize;
00155 }
00156
00157
00158
00159 void quicksort () {
00160 qsort (rep, size, sizeof (TYPE*), compareComparable);
00161 }
00162 };
00163
00164 #define CRefArray RefArray
00165
00166 #endif