vec.hpp
Go to the documentation of this file.00001
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
00014
00015
00016
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
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
00085 memcpy(_v, m._v, _size * sizeof(T));
00086
00087
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
00159 memcpy(_v, m._v, _size * sizeof(T));
00160
00161
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