00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 #ifndef SORTABLEARRAY_TEMPLATE_H
00024 #define SORTABLEARRAY_TEMPLATE_H
00025 
00026 #include <string.h>
00027 
00032 template<class T>
00033 class SortableArray {
00034 private:
00036   T *data;
00037 
00039   int sz;
00040   
00042   float resizeFactor;
00043   
00046   int currSize;
00047 
00048 
00049 public:
00050   SortableArray(int s = 10, float rsf = 2.0) {
00052     resizeFactor = rsf;
00053     
00055     currSize = 0;
00056     sz = (s > 0 ? s : 10);
00057     
00059     data = new T[sz];
00060   }
00061 
00062   ~SortableArray(void) {
00063     if(data)
00064       delete [] data; 
00065   }
00066 
00067   
00068   
00069   
00070     
00072   int num(void) { return currSize; }
00073 
00074   
00075   
00076   
00077 
00079   T& operator[](int N) { return item(N); }
00080 
00082   int append(const T& val) {
00083     item(currSize) = val;
00084     return currSize - 1;
00085   }
00086 
00088   T& item(int N) {
00089     
00090     
00091     
00092     
00093     if(N >= sz) {                       
00094       
00095       int newsize = (int)((float)N * resizeFactor + 0.5);
00096   
00097       
00098       
00099       
00100       
00101       T *newdata = new T[newsize];
00102       if(data) {
00103         memcpy((void *)newdata, (void *)data, currSize * sizeof(T));
00104         delete [] data;
00105       }
00106       
00107       
00108       data = newdata;
00109       sz = newsize;
00110     }
00111     
00112     
00113     if(N >= currSize)
00114       currSize = N + 1;
00115       
00116     
00117     return data[N];
00118   }
00119 
00124   void remove(int m = -1, int n = -1) {
00125     if(m < currSize && n < currSize) {
00126       if((m < 0 && n < 0) || (m >= 0 && n < 0) || (m > 0 && n > 0 && m <= n)) {
00127         int N = n, M = (m >= 0 ? m : 0);
00128         if(m < 0 && n < 0)
00129           N = (currSize - 1);
00130         else if(n < 0)
00131           N = M;
00132         else
00133           N = n;
00134         int removed = N - M + 1;
00135         for(int i=N+1; i < currSize; i++)
00136           data[i - removed] = data[i];
00137         currSize -= removed;
00138       }
00139     }
00140   }
00141 
00143   void swap (int i, int j) {
00144    T temp;
00145   
00146    temp = data[i];
00147    data[i]=data[j];
00148    data[j]=temp;
00149   }
00150 
00154   void qsort (int left, int right) {
00155     int i, last;
00156   
00157     if (left >= right)    
00158        return;
00159     swap (left, (left + right) /2);
00160     last = left;
00161     for (i = left+1; i <=right; i++)
00162       if (data[i] > data[left]) 
00163        swap (++last, i);
00164     swap (left, last);
00165     qsort (left, last-1);
00166     qsort (last+1, right);
00167   }
00168 
00170   void isort () {
00171      int i, j;
00172      T temp;
00173      for (i = currSize-2; i>=0; i--) {  
00174        j = i+1;
00175        temp = data[i];
00176        while ((j < currSize) && (temp < data[j])) {
00177          data[j-1] = data[j];
00178          j = j+1;
00179        }
00180        data[j-1] = temp;
00181      }
00182   }
00183 };
00184 
00185 #endif