dune-common 2.1.1
fassign.hh
Go to the documentation of this file.
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