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 }
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 }
00280
00281 #endif // DUNE_ASSIGN_HH