00001
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
00026
00027
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 }
00148
00149 #endif