dune-common 2.1.1
|
00001 #ifndef DUNE_ASSIGN_HH 00002 #define DUNE_ASSIGN_HH 00003 00004 #include <dune/common/fvector.hh> 00005 #include <dune/common/fmatrix.hh> 00006 00007 namespace Dune { 00008 00021 namespace { 00022 00028 struct Zero { 00029 explicit Zero (int) {}; 00031 operator double () { return 0.0; } 00033 operator int () { return 0; } 00034 } zero(0); 00035 00041 struct NextRow { 00042 explicit NextRow (int) {}; 00043 } nextRow(0); 00044 00045 } // end empty namespace 00046 00067 template <class T, int s> 00068 class fvector_assigner 00069 { 00070 private: 00071 FieldVector<T,s> & v; 00072 int c; 00073 bool temporary; 00074 fvector_assigner(); 00075 public: 00077 fvector_assigner(fvector_assigner & a) : v(a.v), c(a.c), temporary(false) 00078 { 00079 } 00084 fvector_assigner(FieldVector<T,s> & _v, bool t) : v(_v), c(0), temporary(t) 00085 { 00086 }; 00091 ~fvector_assigner() 00092 { 00093 if (!temporary && c!=s) 00094 DUNE_THROW(MathError, "Trying to assign " << c << 00095 " entries to a FieldVector of size " << s); 00096 } 00098 fvector_assigner & append (const T & t) 00099 { 00100 v[c++] = t; 00101 return *this; 00102 } 00105 fvector_assigner & append (Zero z) 00106 { 00107 while (c!=s) v[c++] = 0; 00108 return *this; 00109 } 00114 fvector_assigner & operator , (const T & t) 00115 { 00116 return append(t); 00117 } 00122 fvector_assigner & operator , (Zero z) 00123 { 00124 return append(z); 00125 } 00126 }; 00127 00134 template <class T, class K, int s> 00135 fvector_assigner<T,s> operator <<= (FieldVector<T,s> & v, const K & t) 00136 { 00137 return fvector_assigner<T,s>(v,true).append(t); 00138 } 00139 00145 template <class T, int s> 00146 fvector_assigner<T,s> operator <<= (FieldVector<T,s> & v, Zero z) 00147 { 00148 return fvector_assigner<T,s>(v,true).append(z); 00149 } 00150 00171 template <class T, int n, int m> 00172 class fmatrix_assigner 00173 { 00174 private: 00175 FieldMatrix<T,n,m> & A; 00176 int c; 00177 int r; 00178 bool temporary; 00179 void end_row() 00180 { 00181 if (!temporary && c!=m) 00182 DUNE_THROW(MathError, "Trying to assign " << c << 00183 " entries to a FieldMatrix row of size " << m); 00184 c=0; 00185 } 00186 public: 00188 fmatrix_assigner(fmatrix_assigner & a) : A(a.A), c(a.c), r(a.r), temporary(false) 00189 { 00190 } 00195 fmatrix_assigner(FieldMatrix<T,n,m> & _A, bool t) : A(_A), c(0), r(0), temporary(t) 00196 { 00197 }; 00202 ~fmatrix_assigner() 00203 { 00204 end_row(); 00205 if (!temporary && r!=n-1) 00206 DUNE_THROW(MathError, "Trying to assign " << r << 00207 " rows to a FieldMatrix of size " << n << " x " << m); 00208 } 00210 fmatrix_assigner & append (const T & t) 00211 { 00212 A[r][c++] = t; 00213 return *this; 00214 } 00217 fmatrix_assigner & append (Zero z) 00218 { 00219 while (c!=m) A[r][c++] = 0; 00220 return *this; 00221 } 00224 fmatrix_assigner & append (NextRow nr) 00225 { 00226 end_row(); 00227 r++; 00228 return *this; 00229 } 00234 fmatrix_assigner & operator , (const T & t) 00235 { 00236 return append(t); 00237 } 00242 fmatrix_assigner & operator , (Zero z) 00243 { 00244 return append(z); 00245 } 00250 fmatrix_assigner & operator , (NextRow nr) 00251 { 00252 return append(nr); 00253 } 00254 }; 00255 00262 template <class T, class K, int n, int m> 00263 fmatrix_assigner<T,n,m> operator <<= (FieldMatrix<T,n,m> & v, const K & t) 00264 { 00265 return fmatrix_assigner<T,n,m>(v,true).append(t); 00266 } 00267 00273 template <class T, int n, int m> 00274 fmatrix_assigner<T,n,m> operator <<= (FieldMatrix<T,n,m> & v, Zero z) 00275 { 00276 return fmatrix_assigner<T,n,m>(v,true).append(z); 00277 } 00278 00279 } // end namespace Dune 00280 00281 #endif // DUNE_ASSIGN_HH