00001 // This file is part of ff3d - http://www.freefem.org/ff3d 00002 // Copyright (C) 2001, 2002, 2003 Stéphane Del Pino 00003 00004 // This program is free software; you can redistribute it and/or modify 00005 // it under the terms of the GNU General Public License as published by 00006 // the Free Software Foundation; either version 2, or (at your option) 00007 // any later version. 00008 00009 // This program is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 // GNU General Public License for more details. 00013 00014 // You should have received a copy of the GNU General Public License 00015 // along with this program; if not, write to the Free Software Foundation, 00016 // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00017 00018 // $Id: Vector.hpp,v 1.9 2007/05/20 23:02:48 delpinux Exp $ 00019 00020 00021 #ifndef VECTOR_HPP 00022 #define VECTOR_HPP 00023 00024 // Include STD definitions to get same environment ... 00025 #include <stddef.h> 00026 #include <cstdlib> 00027 #include <Assert.hpp> 00028 00029 #include <ZoneCopy.hpp> 00030 00031 #include <iostream> 00032 00033 #include <BaseVector.hpp> 00034 #include <TermToTerm.hpp> 00035 00045 template <typename T> 00046 class Vector 00047 : public BaseVector 00048 { 00049 public: 00051 typedef T ValueType; 00052 protected: 00054 size_t __size; 00055 00057 T* __restrict __values; 00058 00059 public: 00061 inline const size_t& size() const 00062 { 00063 return __size; 00064 } 00065 00067 inline size_t number(T const& e) const 00068 { 00069 ASSERT ((&e >= __values)&&(static_cast<size_t>(&e-__values) < __size)); 00070 return (&e-__values); 00071 } 00072 00074 friend std::ostream& operator << (std::ostream& os, const Vector<T>& V) 00075 { 00076 for (size_t i=0; i<V.size(); ++i) { 00077 os << V[i] << '\n'; 00078 } 00079 return os; 00080 } 00081 00083 inline const T& operator[](const size_t& i) const 00084 { 00085 ASSERT (i<__size); 00086 return __values[i]; 00087 } 00088 00090 inline T& operator[](const size_t& i) 00091 { 00092 ASSERT (i<__size); 00093 return __values[i]; 00094 } 00095 00100 inline const T& operator()(const size_t& i) const 00101 { 00102 ASSERT (i<__size); 00103 return __values[i]; 00104 } 00105 00110 inline T& operator()(const size_t& i) 00111 { 00112 ASSERT (i<__size); 00113 return __values[i]; 00114 } 00115 00121 void resize(const size_t& newSize) 00122 { 00123 ASSERT (newSize>=0); 00124 00125 if (newSize != __size) { 00126 if (__size!=0) { // Destroy previous vector 00127 delete [] __values; 00128 } 00129 __size = newSize; 00130 __values = new ValueType[__size]; 00131 } else { 00132 ; // else do nothing 00133 } 00134 } 00135 00137 inline const Vector<T>& operator=(const T& t) 00138 { 00139 for (size_t i=0; i<__size; ++i) 00140 __values[i] = t; 00141 return (*this); 00142 } 00143 00145 inline const Vector<T>& operator=(const Vector<T>& V) 00146 { 00147 ASSERT (__size == V.__size); 00148 ZoneCopy(__values, V.__values, __size); 00149 00150 return (*this); 00151 } 00152 00153 00158 inline Vector<T> operator*(const T& t) const 00159 { 00160 Vector<T> prod(*this); 00161 TermToTermProduct<T> tttp; 00162 for (size_t i=0; i<__size; ++i) 00163 prod.__values[i] = tttp(__values[i],t); 00164 return prod; 00165 } 00166 00167 00172 friend Vector<T> operator*(const T& t, const Vector<T>& V) 00173 { 00174 Vector<T> sum(V.__size); 00175 TermToTermProduct<T> tttp; 00176 for (size_t i=0; i<V.__size; ++i) 00177 sum.__values[i] = tttp(V.__values[i],t); 00178 00179 return sum; 00180 } 00181 00182 00184 template <class T2> 00185 inline const Vector<T>& operator*=(const T2& t) 00186 { 00187 TermToTermProduct<T> tttp; 00188 for (size_t i=0; i<__size; ++i) 00189 __values[i] = tttp(__values[i],t); 00190 return *this; 00191 } 00192 00197 inline Vector<T> operator+(const Vector<T>& V) const 00198 { 00199 ASSERT(__size==V.__size); 00200 Vector<T> W(__size); 00201 for (size_t i=0; i<__size; ++i) 00202 W.__values[i] = __values[i] + V.__values[i]; 00203 return W; 00204 } 00205 00210 inline Vector<T> operator-(const Vector<T>& V) const 00211 { 00212 ASSERT(__size==V.__size); 00213 00214 Vector<T> W(__size); 00215 for (size_t i=0; i<__size; ++i) { 00216 W.__values[i] = __values[i] - V.__values[i]; 00217 } 00218 00219 return W; 00220 } 00221 00222 00224 inline const Vector<T>& operator+=(const Vector<T>& V) 00225 { 00226 ASSERT(__size==V.__size); 00227 00228 for (size_t i=0; i<__size; ++i) 00229 __values[i] += V.__values[i]; 00230 00231 return *this; 00232 } 00233 00235 inline const Vector<T>& operator+=(const T& t) 00236 { 00237 for (size_t i=0; i<__size; ++i) 00238 __values[i] += t; 00239 00240 return *this; 00241 } 00242 00244 inline const Vector<T>& operator-=(const Vector<T>& V) 00245 { 00246 ASSERT(__size==V.__size); 00247 00248 for (size_t i=0; i<__size; ++i) 00249 __values[i] -= V.__values[i]; 00250 00251 return (*this); 00252 } 00253 00255 inline real_t operator*(const Vector<T>& V) const 00256 { 00257 ASSERT(__size==V.__size); 00258 00259 real_t t = 0; 00260 for (size_t i=0; i<__size; ++i) 00261 t += __values[i] * V.__values[i]; 00262 00263 return t; 00264 } 00265 00272 inline friend real_t Norm(const Vector<T>& v) 00273 { 00274 return sqrt(v*v); 00275 } 00276 00277 00279 Vector() 00280 : __size(0) 00281 { 00282 ; 00283 } 00284 00289 Vector(size_t size) 00290 : __size(size) 00291 { 00292 if (__size>0) 00293 __values = new T[__size]; 00294 } 00295 00297 Vector(const Vector<T>& V) 00298 : __size(V.__size) 00299 { 00300 if (__size>0) 00301 __values = new T[__size]; 00302 ZoneCopy(__values,V.__values,__size); 00303 } 00304 00306 ~Vector() 00307 { 00308 if (__size > 0) 00309 delete[] __values; 00310 } 00311 }; 00312 00313 #endif // VECTOR_HPP
1.5.6