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 Zero (int) {};
00031 operator double () { return 0.0; }
00033 operator int () { return 0; }
00034 } zero = 0;
00035
00041 struct NextRow {
00042 NextRow (int) {};
00043 } nextRow = 0;
00044
00045 }
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 public:
00076 fvector_assigner(fvector_assigner & a) : v(a.v), c(a.c), temporary(false)
00077 {
00078 }
00083 fvector_assigner(FieldVector<T,s> & _v, bool t) : v(_v), c(0), temporary(t)
00084 {
00085 };
00090 ~fvector_assigner()
00091 {
00092 if (!temporary && c!=s)
00093 DUNE_THROW(MathError, "Trying to assign " << c <<
00094 " entries to a FieldVector of size " << s);
00095 }
00097 fvector_assigner & append (const T & t)
00098 {
00099 v[c++] = t;
00100 return *this;
00101 }
00104 fvector_assigner & append (Zero z)
00105 {
00106 while (c!=s) v[c++] = 0;
00107 return *this;
00108 }
00113 fvector_assigner & operator , (const T & t)
00114 {
00115 return append(t);
00116 }
00121 fvector_assigner & operator , (Zero z)
00122 {
00123 return append(z);
00124 }
00125 };
00126
00133 template <class T, int s>
00134 fvector_assigner<T,s> operator <<= (FieldVector<T,s> & v, const T & t)
00135 {
00136 return fvector_assigner<T,s>(v,true).append(t);
00137 }
00138
00144 template <class T, int s>
00145 fvector_assigner<T,s> operator <<= (FieldVector<T,s> & v, Zero z)
00146 {
00147 return fvector_assigner<T,s>(v,true).append(z);
00148 }
00149
00170 template <class T, int n, int m>
00171 class fmatrix_assigner
00172 {
00173 private:
00174 FieldMatrix<T,n,m> & A;
00175 int c;
00176 int r;
00177 bool temporary;
00178 void end_row()
00179 {
00180 if (!temporary && c!=m)
00181 DUNE_THROW(MathError, "Trying to assign " << c <<
00182 " entries to a FieldMatrix row of size " << m);
00183 c=0;
00184 }
00185 public:
00187 fmatrix_assigner(fmatrix_assigner & a) : A(a.A), c(a.c), r(a.r), temporary(false)
00188 {
00189 }
00194 fmatrix_assigner(FieldMatrix<T,n,m> & _A, bool t) : A(_A), c(0), r(0), temporary(t)
00195 {
00196 };
00201 ~fmatrix_assigner()
00202 {
00203 end_row();
00204 if (!temporary && r!=n-1)
00205 DUNE_THROW(MathError, "Trying to assign " << r <<
00206 " rows to a FieldMatrix of size " << n << " x " << m);
00207 }
00209 fmatrix_assigner & append (const T & t)
00210 {
00211 A[r][c++] = t;
00212 return *this;
00213 }
00216 fmatrix_assigner & append (Zero z)
00217 {
00218 while (c!=m) A[r][c++] = 0;
00219 return *this;
00220 }
00223 fmatrix_assigner & append (NextRow nr)
00224 {
00225 end_row();
00226 r++;
00227 return *this;
00228 }
00233 fmatrix_assigner & operator , (const T & t)
00234 {
00235 return append(t);
00236 }
00241 fmatrix_assigner & operator , (Zero z)
00242 {
00243 return append(z);
00244 }
00249 fmatrix_assigner & operator , (NextRow nr)
00250 {
00251 return append(nr);
00252 }
00253 };
00254
00261 template <class T, int n, int m>
00262 fmatrix_assigner<T,n,m> operator <<= (FieldMatrix<T,n,m> & v, const T & t)
00263 {
00264 return fmatrix_assigner<T,n,m>(v,true).append(t);
00265 }
00266
00272 template <class T, int n, int m>
00273 fmatrix_assigner<T,n,m> operator <<= (FieldMatrix<T,n,m> & v, Zero z)
00274 {
00275 return fmatrix_assigner<T,n,m>(v,true).append(z);
00276 }
00277
00278 }
00279
00280 #endif // DUNE_ASSIGN_HH