Main   Namespaces   Classes   Hierarchy   Annotated   Files   Compound   Global   Pages  

vec.hpp

Go to the documentation of this file.
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


6 Jan 2011 Doxygen 1.6.3