Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members

Array.h

00001 // Copyright (C) 1999 Jean-Marc Valin
00002 
00003 #ifndef GEN_TYPE_ARRAY_H
00004 #define GEN_TYPE_ARRAY_H
00005 
00006 #include "Object.h"
00007 #include "Vector.h"
00008 #include "ObjectParser.h"
00009 #include "misc.h"
00010 #include "vec.h"
00011 
00012 namespace FD {
00013 
00014 template<class T>
00015 class Array : public Vector<T>
00016 {
00017 public:
00018    Array() : Vector<T>() {}
00019    explicit Array(int n, const T &x = T()) : Vector<T>(n, x) {}
00020    void printOn(std::ostream &out) const
00021    {
00022       out << *static_cast<const Vector<T> *> (this);
00023    }
00024 
00025    /*virtual void rawWrite(std::ostream &out) const
00026    {
00027       out.write ((const char*) &operator[](0), size()*sizeof(T));
00028       }*/
00029    
00030    void readFrom(std::istream &in=std::cin);
00031    
00032    virtual void destroy() {delete this;}
00033 
00034    Array<T> &operator+= (const Array<T> &v2) 
00035    {
00036       if (this->size() != v2.size())
00037          std::cerr << "Array size mismatch\n";
00038       for (int i=0;i<this->size();i++)
00039          this->operator[](i) += v2[i];
00040       return *this;
00041    }
00042 
00043    Array<T> &operator-= (const Array<T> &v2) 
00044    {
00045       if (this->size() != v2.size())
00046          std::cerr << "Array size mismatch\n";
00047       for (int i=0;i<this->size();i++)
00048          this->operator[](i) -= v2[i];
00049       return *this;
00050    }
00051 
00052    Array<T> operator+ (const Array<T> &v2) 
00053    {
00054       Array<T> v(*this);
00055       v += v2;
00056       return v;
00057    }
00058 
00059    Array<T> operator- (const Array<T> &v2) 
00060    {
00061       Array<T> v(*this);
00062       v -= v2;
00063       return v;
00064    }
00065 
00066    Array<T> operator- () 
00067    {
00068       Array<T> v(this->size());
00069       for (int i=0;i<this->size();i++)
00070          v[i] = -this->operator[](i);
00071       return v;
00072    }
00073    
00074    T operator* (const Array<T> &v2) 
00075    {
00076       if (this->size() != v2.size())
00077          std::cerr << "Array size mismatch\n";
00078       T sum=0;
00079       for (int i=0;i<this->size();i++)
00080          sum += this->operator[](i)*v2[i];
00081       return sum;
00082    }
00083 
00084    Array<T> &operator*= (T scal) 
00085    {
00086       for (int i=0;i<this->size();i++)
00087          this->operator[](i) *= scal;
00088       return *this;
00089    }
00090 
00091    Array<T> &operator/= (T scal) 
00092    {
00093       for (int i=0;i<this->size();i++)
00094          this->operator[](i) /= scal;
00095       return *this;
00096    }
00097 
00098    Array<T> operator* (T scal) 
00099    {
00100       Array<T> v(*this);
00101       v *= scal;
00102       return v;
00103    }
00104 
00105 
00106    Array<T> operator/ (T scal) 
00107    {
00108       Array<T> v(*this);
00109       v /= scal;
00110       return v;
00111    }
00112 
00113    T norm() 
00114    {
00115       return sqrt(vec_norm2(&this->operator[](0), this->size()));
00116    }
00117 
00118    T norm2() 
00119    {
00120       return vec_norm2(&this->operator[](0), this->size());
00121    }
00122 
00123 };
00124 
00125 
00126 
00127 template <class T>
00128 inline void Array<T>::readFrom(std::istream &in)
00129 {
00130    int items_found=0;
00131    
00132    while (!in.eof())
00133    {
00134       T tmp;
00135       in >> tmp;
00136          if (in.fail()) break;
00137          items_found++;
00138          this->resize(items_found);
00139          this->operator[] (items_found-1)=tmp;
00140    }
00141    in.clear();
00142    char ch;
00143    in >> ch;       
00144 }
00145 
00146 
00147 }//namespace FD
00148 
00149 #endif

Generated on Wed Oct 5 14:28:55 2005 for FlowDesigner by  doxygen 1.4.4