00001 // Yo Emacs, this -*- C++ -*- 00002 #ifndef VEC_H 00003 #define VEC_H 00004 00005 #include <cstring> 00006 #include <iostream> 00007 #include <cassert> 00008 00009 using std::istream; 00010 using std::ostream; 00011 00012 /** 00013 * Vector of primitive numeric values. 00014 * 00015 * This implementation is built for speed. 00016 * It does not work with non-primitive types! 00017 */ 00018 template <class T> 00019 class Vec 00020 { 00021 public: 00022 explicit Vec(int size = 0); 00023 Vec(const Vec &); 00024 ~Vec(); 00025 00026 void setSize(int size); 00027 inline int size() const; 00028 inline T &operator [](int n); 00029 inline const T &operator [](int n) const; 00030 inline T &operator ()(int n); 00031 inline const T &operator ()(int n) const; 00032 00033 Vec<T> &operator =(const Vec<T> &); 00034 Vec<T> operator +(const Vec<T> &) const; 00035 Vec<T> &operator +=(const Vec<T> &); 00036 Vec<T> operator -(const Vec<T> &) const; 00037 Vec<T> &operator -=(const Vec<T> &); 00038 Vec<T> operator -() const; 00039 00040 Vec<T> &operator =(const T &); 00041 Vec<T> operator *(const T &) const; 00042 Vec<T> &operator *=(const T &); 00043 00044 bool operator ==(const Vec<T> &) const; 00045 bool operator !=(const Vec<T> &) const; 00046 bool operator <(const Vec<T> &) const; 00047 bool operator <=(const Vec<T> &) const; 00048 bool operator >(const Vec<T> &) const; 00049 bool operator >=(const Vec<T> &) const; 00050 00051 bool operator ==(const T &t) const; 00052 bool operator !=(const T &t) const; 00053 bool operator <(const T &t) const; 00054 bool operator <=(const T &t) const; 00055 bool operator >(const T &t) const; 00056 bool operator >=(const T &t) const; 00057 private: 00058 int _size; 00059 T *_v; 00060 }; 00061 00062 template<class T> 00063 Vec<T> operator *(const T &t, const Vec<T> &v); 00064 00065 template<class T> 00066 ostream &operator <<(ostream &os, const Vec<T> &v); 00067 00068 // 00069 // IMPLEMENTATION 00070 // 00071 00072 template <class T> 00073 Vec<T>::Vec(int size) : _size(size), _v(0) 00074 { 00075 if(_size > 0) 00076 _v = new T[_size]; 00077 } 00078 00079 template <class T> 00080 Vec<T>::Vec(const Vec &m) : _size(m._size), _v(0) 00081 { 00082 if(_size > 0) { 00083 _v = new T[_size]; 00084 // this shortcut may not work with non-primitive types 00085 memcpy(_v, m._v, _size * sizeof(T)); 00086 //for(int i = 0; i < _size; i++) 00087 // _v[i] = m._v[i]; 00088 } 00089 } 00090 00091 template <class T> 00092 Vec<T>::~Vec() 00093 { 00094 if(_v) 00095 delete [] _v; 00096 } 00097 00098 template <class T> 00099 inline void Vec<T>::setSize(int size) 00100 { 00101 if(_size != size) { 00102 if(_v) { 00103 delete [] _v; 00104 _v = 0; 00105 } 00106 _size = size; 00107 if(_size > 0) 00108 _v = new T[_size]; 00109 } 00110 } 00111 00112 template <class T> 00113 inline int Vec<T>::size() const 00114 { 00115 return _size; 00116 } 00117 00118 template <class T> 00119 inline T &Vec<T>::operator [](int n) 00120 { 00121 assert(n >= 0 && n < _size); 00122 return _v[n]; 00123 } 00124 00125 template <class T> 00126 inline const T &Vec<T>::operator [](int n) const 00127 { 00128 assert(n >= 0 && n < _size); 00129 return _v[n]; 00130 } 00131 00132 template <class T> 00133 inline T &Vec<T>::operator ()(int n) 00134 { 00135 assert(n >= 0 && n < _size); 00136 return _v[n]; 00137 } 00138 00139 template <class T> 00140 inline const T &Vec<T>::operator ()(int n) const 00141 { 00142 assert(n >= 0 && n < _size); 00143 return _v[n]; 00144 } 00145 00146 template <class T> 00147 Vec<T> &Vec<T>::operator =(const Vec<T> &m) 00148 { 00149 if(_size != m._size) { 00150 if(_v) { 00151 delete [] _v; 00152 _v = 0; 00153 } 00154 _size = m._size; 00155 if(_size) 00156 _v = new T[_size]; 00157 } 00158 // this shortcut may not work with non-primitive types 00159 memcpy(_v, m._v, _size * sizeof(T)); 00160 //for(int i = 0; i < _size; i++) 00161 // _v[i] = m._v[i]; 00162 return *this; 00163 } 00164 00165 template <class T> 00166 Vec<T> Vec<T>::operator +(const Vec<T> &m) const 00167 { 00168 assert(_size == m._size); 00169 Vec<T> r(_size); 00170 for(int i = 0; i < _size; i++) 00171 r[i] = _v[i] + m._v[i]; 00172 return r; 00173 } 00174 00175 template <class T> 00176 Vec<T> &Vec<T>::operator +=(const Vec<T> &m) 00177 { 00178 assert(_size == m._size); 00179 Vec<T> r(_size); 00180 for(int i = 0; i < _size; i++) 00181 _v[i] += m._v[i]; 00182 return *this; 00183 } 00184 00185 template <class T> 00186 Vec<T> Vec<T>::operator -(const Vec<T> &m) const 00187 { 00188 assert(_size == m._size); 00189 Vec<T> r(_size); 00190 for(int i = 0; i < _size; i++) 00191 r[i] = _v[i] - m._v[i]; 00192 return r; 00193 } 00194 00195 template <class T> 00196 Vec<T> &Vec<T>::operator -=(const Vec<T> &m) 00197 { 00198 assert(_size == m._size); 00199 Vec<T> r(_size); 00200 for(int i = 0; i < _size; i++) 00201 _v[i] -= m._v[i]; 00202 return *this; 00203 } 00204 00205 template <class T> 00206 Vec<T> Vec<T>::operator -() const 00207 { 00208 Vec<T> r(_size); 00209 for(int i = 0; i < _size; i++) 00210 r[i] = -_v[i]; 00211 return r; 00212 } 00213 00214 template <class T> 00215 Vec<T> &Vec<T>::operator =(const T &t) 00216 { 00217 for(int i = 0; i < _size; i++) 00218 _v[i] = t; 00219 return *this; 00220 } 00221 00222 template <class T> 00223 Vec<T> Vec<T>::operator *(const T &t) const 00224 { 00225 Vec<T> r(_size); 00226 for(int i = 0; i < _size; i++) 00227 r[i] = _v[i] * t; 00228 return r; 00229 } 00230 00231 template <class T> 00232 Vec<T> &Vec<T>::operator *=(const T &t) 00233 { 00234 for(int i = 0; i < _size; i++) 00235 _v[i] *= t; 00236 return *this; 00237 } 00238 00239 template <class T> 00240 bool Vec<T>::operator ==(const Vec<T> &m) const 00241 { 00242 assert(_size == m._size); 00243 for(int i = 0; i < _size; i++) { 00244 if(!(_v[i] == m._v[i])) 00245 return false; 00246 } 00247 return true; 00248 } 00249 00250 template <class T> 00251 bool Vec<T>::operator !=(const Vec<T> &m) const 00252 { 00253 assert(_size == m._size); 00254 for(int i = 0; i < _size; i++) { 00255 if(_v[i] != m._v[i]) 00256 return true; 00257 } 00258 return false; 00259 } 00260 00261 template <class T> 00262 bool Vec<T>::operator <(const Vec<T> &m) const 00263 { 00264 assert(_size == m._size); 00265 for(int i = 0; i < _size; i++) { 00266 if(!(_v[i] < m._v[i])) 00267 return false; 00268 } 00269 return true; 00270 } 00271 00272 template <class T> 00273 bool Vec<T>::operator <=(const Vec<T> &m) const 00274 { 00275 assert(_size == m._size); 00276 for(int i = 0; i < _size; i++) { 00277 if(!(_v[i] <= m._v[i])) 00278 return false; 00279 } 00280 return true; 00281 } 00282 00283 template <class T> 00284 bool Vec<T>::operator >(const Vec<T> &m) const 00285 { 00286 assert(_size == m._size); 00287 for(int i = 0; i < _size; i++) { 00288 if(!(_v[i] > m._v[i])) 00289 return false; 00290 } 00291 return true; 00292 } 00293 00294 template <class T> 00295 bool Vec<T>::operator >=(const Vec<T> &m) const 00296 { 00297 assert(_size == m._size); 00298 for(int i = 0; i < _size; i++) { 00299 if(!(_v[i] >= m._v[i])) 00300 return false; 00301 } 00302 return true; 00303 } 00304 00305 template <class T> 00306 bool Vec<T>::operator ==(const T &t) const 00307 { 00308 for(int i = 0; i < _size; i++) { 00309 if(!(_v[i] == t)) 00310 return false; 00311 } 00312 return true; 00313 } 00314 00315 template <class T> 00316 bool Vec<T>::operator !=(const T &t) const 00317 { 00318 for(int i = 0; i < _size; i++) { 00319 if(_v[i] != t) 00320 return true; 00321 } 00322 return false; 00323 } 00324 00325 template <class T> 00326 bool Vec<T>::operator <(const T &t) const 00327 { 00328 for(int i = 0; i < _size; i++) { 00329 if(!(_v[i] < t)) 00330 return false; 00331 } 00332 return true; 00333 } 00334 00335 template <class T> 00336 bool Vec<T>::operator <=(const T &t) const 00337 { 00338 for(int i = 0; i < _size; i++) { 00339 if(!(_v[i] <= t)) 00340 return false; 00341 } 00342 return true; 00343 } 00344 00345 template <class T> 00346 bool Vec<T>::operator >(const T &t) const 00347 { 00348 for(int i = 0; i < _size; i++) { 00349 if(!(_v[i] > t)) 00350 return false; 00351 } 00352 return true; 00353 } 00354 00355 template <class T> 00356 bool Vec<T>::operator >=(const T &t) const 00357 { 00358 for(int i = 0; i < _size; i++) { 00359 if(!(_v[i] >= t)) 00360 return false; 00361 } 00362 return true; 00363 } 00364 00365 // 00366 // 00367 // 00368 00369 template <class T> 00370 Vec<T> operator *(const T &t, const Vec<T> &v) 00371 { 00372 Vec<T> r(v.size()); 00373 for(int i = 0; i < r.size(); i++) 00374 r[i] = t * v[i]; 00375 return r; 00376 } 00377 00378 template <class T> 00379 ostream &operator <<(ostream &os, const Vec<T> &v) 00380 { 00381 os << "["; 00382 for(int i = 0; i < v.size(); i++) { 00383 if(i) os << ", "; 00384 os << v[i]; 00385 } 00386 os << "]"; 00387 return os; 00388 } 00389 00390 #endif