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         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 } // 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 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 } // end namespace Dune
00279 
00280 #endif // DUNE_ASSIGN_HH

Generated on Tue Jul 28 22:27:49 2009 for dune-common by  doxygen 1.5.6