00001 #pragma ident "$Id: Vector.hpp 1461 2008-11-18 19:46:55Z ocibu $"
00002
00003
00004
00010 #ifndef GPSTK_VECTOR_HPP
00011 #define GPSTK_VECTOR_HPP
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <limits>
00036 #include "VectorBase.hpp"
00037
00038 namespace gpstk
00039 {
00042
00043
00044 template <class T> class VectorSlice;
00045
00053 template <class T>
00054 class Vector : public RefVectorBase<T, Vector<T> >
00055 {
00056 public:
00058 typedef T value_type;
00060 typedef T& reference;
00062 typedef const T& const_reference;
00064 typedef T* iterator;
00066 typedef const T* const_iterator;
00067
00069 Vector() : v(NULL), s(0) {}
00071 Vector(size_t siz) : s(siz)
00072
00073 {
00074 v = new T[siz];
00075 if(!v) {
00076 VectorException e("Vector(size_t) failed to allocate");
00077 GPSTK_THROW(e);
00078 }
00079 }
00083 Vector(size_t siz, const T defaultValue) : s(siz)
00084
00085 {
00086 v = new T[siz];
00087 if(!v) {
00088 VectorException e("Vector<T>(size_t, const T) failed to allocate");
00089 GPSTK_THROW(e);
00090 }
00091 assignFrom(defaultValue);
00092 }
00096 template <class E>
00097 Vector(const ConstVectorBase<T, E>& r) : s(r.size())
00098
00099 {
00100 v = new T[r.size()];
00101 if(!v) {
00102 VectorException e("Vector<T>(ConstVectorBase) failed to allocate");
00103 GPSTK_THROW(e);
00104 }
00105 assignFrom(r);
00106 }
00110 Vector(const Vector& r) : s(r.s)
00111
00112 {
00113 v = new T[r.s];
00114 if(!v) {
00115 VectorException e("Vector(Vector) failed to allocate");
00116 GPSTK_THROW(e);
00117 }
00118 assignFrom(r);
00119 }
00123 Vector(const std::valarray<T>& r) : s(r.size())
00124
00125 {
00126 v = new T[r.size()];
00127 if(!v) {
00128 VectorException e("Vector(valarray) failed to allocate");
00129 GPSTK_THROW(e);
00130 }
00131 assignFrom(r);
00132 }
00133
00135 template <class E>
00136 Vector(const ConstVectorBase<T, E>& vec,
00137 size_t top,
00138 size_t num) : v(size_t(0)),s(0)
00139 {
00140
00141 if ( top >= vec.size() ||
00142 top + num > vec.size())
00143 {
00144 VectorException e("Invalid dimensions or size for Vector(VectorBase)");
00145 GPSTK_THROW(e);
00146 }
00147
00148 v = new T[num];
00149 if(!v) {
00150 VectorException e("Vector(subvector) failed to allocate");
00151 GPSTK_THROW(e);
00152 }
00153 size_t i;
00154 for(i = 0; i < num; i++)
00155 v[i] = vec(top+i);
00156 s = num;
00157 }
00158
00160 ~Vector()
00161 { if (v) delete [] v; }
00162
00164 iterator begin() { return v; }
00166 const_iterator begin() const { return v; }
00168 iterator end() { return v + s; }
00170 const_iterator end() const { return v + s; }
00172 value_type front() { return v[s-1]; }
00174 const_reference front() const { return v[s-1];}
00176 bool empty() const { return size() == 0; }
00178 size_t size() const {return s; }
00180 size_t max_size() const { return std::numeric_limits<size_t>().max(); }
00181
00183 T& operator[] (size_t i)
00184 { return v[i]; }
00186 T operator[] (size_t i) const
00187 { return v[i]; }
00189 T& operator() (size_t i)
00190 { return v[i]; }
00192 T operator() (size_t i) const
00193 { return v[i]; }
00194
00196 VectorSlice<T> operator[] (const std::slice& sli)
00197 { return VectorSlice<T>(*this, sli); }
00198
00200 Vector& operator=(const Vector& x)
00201 { resize(x.s); return assignFrom(x); }
00202
00204 template <class E>
00205 Vector& operator=(const ConstVectorBase<T, E>& x)
00206 { resize(x.size()); return assignFrom(x); }
00207
00209 Vector& operator=(const std::valarray<T>& x)
00210 { resize(x.size()); return assignFrom(x); }
00212 Vector& operator=(const T x)
00213 { return assignFrom(x); }
00215 Vector& operator=(const T* x)
00216 { return assignFrom(x); }
00217
00219 inline Vector& operator=(const std::vector<T>& x)
00220 {
00221 size_t i;
00222 size_t vs = x.size();
00223 (*this).resize(vs);
00224
00225 for (i = 0; i < vs; i++)
00226 (*this)[i] = x[i];
00227
00228 return (*this);
00229 }
00230
00233 Vector& resize(const size_t index)
00234 {
00235 if (index > s)
00236 {
00237 if (v)
00238 delete [] v;
00239 v = new T[index];
00240 if(!v) {
00241 VectorException e("Vector.resize(size_t) failed to allocate");
00242 GPSTK_THROW(e);
00243 }
00244 }
00245 s = index;
00246 return *this;
00247 }
00248
00250 Vector& resize(const size_t index, const T defaultValue)
00251 {
00252 resize(index);
00253 size_t i;
00254 for(i = 0; i < s; i++)
00255 v[i] = defaultValue;
00256 return *this;
00257 }
00258
00260 inline Vector operator&&(const Vector &b)
00261 {
00262 size_t i;
00263 size_t vs = this->size();
00264 size_t bs = b.size();
00265 size_t rows = vs + bs;
00266 Vector<T> toReturn(rows);
00267
00268 for (i = 0; i < vs; i++)
00269 toReturn[i] = (*this)[i];
00270
00271 for (i = 0; i < bs; i++)
00272 toReturn[i+vs] = b[i];
00273
00274 return toReturn;
00275 }
00276
00278 inline Vector operator&&(const T &b)
00279 {
00280 size_t i;
00281 size_t vs = this->size();
00282 size_t rows = vs + 1;
00283 Vector<T> toReturn(rows);
00284
00285 for (i = 0; i < vs; i++)
00286 toReturn[i] = (*this)[i];
00287
00288 toReturn[rows - 1] = b;
00289
00290 return toReturn;
00291 }
00292
00293 private:
00294
00295
00296
00297
00298 inline bool rangeCheck(const size_t index) const
00299 {
00300 #ifdef RANGECHECK
00301 return (index < s);
00302 #else
00303 return true;
00304 #endif
00305 }
00306
00308 T* v;
00310 size_t s;
00311 };
00312
00313
00319 template <class T>
00320 class VectorSlice : public RefVectorSliceBase<T, VectorSlice<T> >
00321 {
00322 public:
00324 VectorSlice()
00325 : v(NULL), s(std::slice(0,0,0))
00326 { }
00327
00329 VectorSlice(Vector<T>& vv)
00330 : v(&vv), s(std::slice(0,vv.size(),1))
00331 { }
00332
00334 VectorSlice(Vector<T>& vv, const std::slice& ss)
00335 : v(&vv), s(ss)
00336 { vecSliceCheck(vv.size()); }
00337
00339 template <class V>
00340 VectorSlice& operator=(const ConstVectorBase<T, V>& x)
00341 { return assignFrom(x); }
00342
00344 VectorSlice& operator=(const std::valarray<T>& x)
00345 { return assignFrom(x); }
00346
00348 VectorSlice& operator=(const T x)
00349 { return assignFrom(x); }
00350
00352 VectorSlice& operator=(const T* x)
00353 { return assignFrom(x); }
00354
00356 T& operator[] (size_t i)
00357 { return (*v)[start() + i * stride()]; }
00359 T operator[] (size_t i) const
00360 { return (*v)[start() + i * stride()]; }
00362 T& operator() (size_t i)
00363 { return (*v)[start() + i * stride()]; }
00365 T operator() (size_t i) const
00366 { return (*v)[start() + i * stride()]; }
00367
00369 inline size_t size() const { return s.size(); }
00371 inline size_t start() const { return s.start(); }
00374 inline size_t stride() const { return s.stride(); }
00375 private:
00377 Vector<T>* v;
00379 std::slice s;
00380 };
00381
00385 template <class T>
00386 class ConstVectorSlice : public ConstVectorSliceBase<T, ConstVectorSlice<T> >
00387 {
00388 public:
00390 ConstVectorSlice()
00391 : v(NULL), s(std::slice(0,0,0))
00392 { }
00393
00395 ConstVectorSlice(const Vector<T>& vv)
00396 : v(&vv), s(std::slice(0,vv.size(),1))
00397 { }
00398
00400 ConstVectorSlice(const Vector<T>& vv, const std::slice& ss)
00401 : v(&vv), s(ss)
00402 { vecSliceCheck(vv.size()); }
00403
00405 T operator[] (size_t i) const
00406 { return (*v)[start() + i * stride()]; }
00408 T operator() (size_t i) const
00409 { return (*v)[start() + i * stride()]; }
00410
00412 inline size_t size() const { return s.size(); }
00414 inline size_t start() const { return s.start(); }
00417 inline size_t stride() const { return s.stride(); }
00418
00419 private:
00421 const Vector<T>* v;
00423 std::slice s;
00424 };
00425
00427
00428 }
00429
00430 #include "VectorOperators.hpp"
00431
00432 #endif