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

sxy_vector.h

Go to the documentation of this file.
00001 #ifndef vetor_h
00002 #define vetor_h
00003 
00004 #include <assert.h>
00005 #include <stdio.h>
00006 
00009 template <class T> class SXYVector {
00010 
00012    T nil;
00013 
00015         T* ptr;
00016 
00018         unsigned int alloc_size;
00019 
00021    unsigned int free_index;
00022 
00027    void growStorage(unsigned int new_size) {
00028       assert(new_size >= 0);
00029       if (new_size <= alloc_size) return;
00030 
00031       T *n = new T[new_size];
00032       assert(n);
00033 
00034       alloc_size = new_size;
00035       for (unsigned int i = 0; i < free_index; i++) n[i] = ptr[i];
00036 
00037       delete [] ptr;
00038       ptr = n;
00039       setNull();
00040    }
00041 
00047    void setNull(void) {
00048       for (unsigned int i = free_index; i < alloc_size; i++) 
00049           ptr[i] = nil;
00050    }
00051 
00052   public:
00053 
00059         SXYVector(unsigned int size, const T nil) {
00060       this->nil = nil;
00061 
00062       this->free_index = 0;
00063       this->alloc_size = size;
00064                 assert(alloc_size >= 0);
00065 
00066                 this->ptr = new T[alloc_size]; 
00067       assert(this->ptr);
00068       setNull();
00069         }
00070 
00075         virtual ~SXYVector () { 
00076       free_index = 0;
00077       setNull();
00078 
00079       delete []ptr; 
00080       ptr = (T*)NULL;
00081       alloc_size = 0;
00082    }
00083 
00090         T* getElementReference(unsigned int idx) const {
00091                 assert(idx >= 0);    
00092                 assert(idx < free_index);  
00093                 assert(idx < alloc_size);  
00094                 return &(ptr[idx]);
00095         }
00096 
00103         T getElement(unsigned int idx) const {
00104                 return *(getElementReference(idx));
00105         }
00106 
00113         void setElement(int idx, T elem) {
00114                 assert(idx >= 0);    
00115                 assert(idx < free_index);  
00116                 assert(idx < alloc_size);  
00117                 ptr[idx] = elem;
00118         }
00119 
00127    unsigned int insertElement(T elem) {
00128       if (free_index == alloc_size) growStorage(alloc_size*2);
00129       ptr[free_index] = elem;
00130       free_index++;
00131       setNull();
00132       return free_index-1;
00133    }
00134 
00141    void insertElementAt(unsigned int idx, T elem) {
00142       insertElement(elem);
00143       for (unsigned int i = alloc_size-1; i > idx; i--) ptr[i] = ptr[i-1];
00144       ptr[idx] = elem;
00145    }
00146 
00152    int findElement(T elem) {
00153       for (unsigned int i = 0; i < free_index; i++ ) {
00154          if (getElement(i) == elem) return i;
00155       }
00156       return -9;
00157    }
00158 
00164    T removeElementAt(unsigned int idx) {
00165       assert(idx >= 0);
00166                 assert(idx < free_index);  
00167                 assert(idx < alloc_size);  
00168       T removed_elem = ptr[idx];
00169       for (unsigned int i = idx; i < alloc_size-1; i++)  ptr[i] = ptr[i+1];
00170       free_index--;
00171       if (free_index < 0) free_index = 0;
00172       setNull();
00173       return removed_elem;
00174    }
00175 
00180    void removeElement(T elem) {
00181       int idx = findElement(elem);
00182       if (idx < 0) return;
00183       T removed = removeElementAt(idx);
00184       assert(removed == elem);
00185    }
00186 
00191         unsigned int getLength() const { 
00192        return free_index; 
00193    }
00194 
00199         unsigned int getAllocSize() const { 
00200        return alloc_size; 
00201    }
00202 };
00203 
00204 #endif
00205 

SXY
Tecgraf / PUC-Rio - Computer Graphics Technology Group