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