Vector.hpp

Go to the documentation of this file.
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 //  This file is part of GPSTk, the GPS Toolkit.
00016 //
00017 //  The GPSTk is free software; you can redistribute it and/or modify
00018 //  it under the terms of the GNU Lesser General Public License as published
00019 //  by the Free Software Foundation; either version 2.1 of the License, or
00020 //  any later version.
00021 //
00022 //  The GPSTk is distributed in the hope that it will be useful,
00023 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
00024 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00025 //  GNU Lesser General Public License for more details.
00026 //
00027 //  You should have received a copy of the GNU Lesser General Public
00028 //  License along with GPSTk; if not, write to the Free Software Foundation,
00029 //  Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00030 //  
00031 //  Copyright 2004, The University of Texas at Austin
00032 //
00033 //============================================================================
00034 
00035 #include <limits>
00036 #include "VectorBase.hpp"
00037 
00038 namespace gpstk
00039 {
00042 
00043 // forward declaration
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             //: v(new T[siz]), s(siz)
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             //: v(new T[siz]), s(siz)
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             //: v(new T[r.size()]), s(r.size())
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             //: v(new T[r.s]), s(r.s)
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             //: v(new T[r.size()]), s(r.size())
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                // sanity checks...
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          // a good optimizer will remove this function call
00296          // if RANGECHECK isn't defined.  remember that
00297          // range checking affects EVERY operation
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    // end class Vector<T>
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 }  // namespace
00429 
00430 #include "VectorOperators.hpp"
00431 
00432 #endif

Generated on Wed Sep 8 03:30:57 2010 for GPS ToolKit Software Library by  doxygen 1.3.9.1