fassign.hh

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 
00012 namespace {
00013 
00019     struct Zero {
00020         Zero (int) {};
00022         operator double () { return 0.0; }
00024         operator int () { return 0; }
00025     } zero = 0;
00026 
00032     struct NextRow {
00033         NextRow (int) {};
00034     } nextRow = 0;
00035     
00036 } // end empty namespace
00037 
00058 template <class T, int s>
00059 class fvector_assigner
00060 {
00061 private:
00062     FieldVector<T,s> & v;
00063     int c;
00064     bool temporary;
00065 public:
00067     fvector_assigner(fvector_assigner & a) : v(a.v), c(a.c), temporary(false)
00068     {
00069     }
00074     fvector_assigner(FieldVector<T,s> & _v, bool t) : v(_v), c(0), temporary(t)
00075     {
00076     };
00081     ~fvector_assigner()
00082     {
00083         if (!temporary && c!=s)
00084             DUNE_THROW(MathError, "Trying to assign " << c <<
00085                 " entries to a FieldVector of size " << s);
00086     }
00088     fvector_assigner & append (const T & t)
00089     {
00090         v[c++] = t;
00091         return *this;
00092     }
00095     fvector_assigner & append (Zero z)
00096     {
00097         while (c!=s) v[c++] = 0;
00098         return *this;
00099     }
00104     fvector_assigner & operator , (const T & t)
00105     {
00106         return append(t);
00107     }
00112     fvector_assigner & operator , (Zero z)
00113     {
00114             return append(z);
00115     }
00116 };
00117     
00124 template <class T, int s>
00125 fvector_assigner<T,s> operator <<= (FieldVector<T,s> & v, const T & t)
00126 {
00127     return fvector_assigner<T,s>(v,true).append(t);
00128 }
00129 
00135 template <class T, int s>
00136 fvector_assigner<T,s> operator <<= (FieldVector<T,s> & v, Zero z)
00137 {
00138     return fvector_assigner<T,s>(v,true).append(z);
00139 }
00140 
00161 template <class T, int n, int m>
00162 class fmatrix_assigner
00163 {
00164 private:
00165     FieldMatrix<T,n,m> & A;
00166     int c;
00167     int r;
00168     bool temporary;
00169     void end_row()
00170     {
00171         if (!temporary && c!=m)
00172             DUNE_THROW(MathError, "Trying to assign " << c <<
00173                 " entries to a FieldMatrix row of size " << m);
00174         c=0;
00175     }
00176 public:
00178     fmatrix_assigner(fmatrix_assigner & a) : A(a.A), c(a.c), r(a.r), temporary(false)
00179     {
00180     }
00185     fmatrix_assigner(FieldMatrix<T,n,m> & _A, bool t) : A(_A), c(0), r(0), temporary(t)
00186     {
00187     };
00192     ~fmatrix_assigner()
00193     {
00194         end_row();
00195         if (!temporary && r!=n-1)
00196             DUNE_THROW(MathError, "Trying to assign " << r <<
00197                 " rows to a FieldMatrix of size " << n << " x " << m);
00198     }
00200     fmatrix_assigner & append (const T & t)
00201     {
00202         A[r][c++] = t;
00203         return *this;
00204     }
00207     fmatrix_assigner & append (Zero z)
00208     {
00209         while (c!=m) A[r][c++] = 0;
00210         return *this;
00211     }
00214     fmatrix_assigner & append (NextRow nr)
00215     {
00216         end_row();
00217         r++;
00218         return *this;
00219     }
00224     fmatrix_assigner & operator , (const T & t)
00225     {
00226         return append(t);
00227     }
00232     fmatrix_assigner & operator , (Zero z)
00233     {
00234         return append(z);
00235     }
00240     fmatrix_assigner & operator , (NextRow nr)
00241     {
00242         return append(nr);
00243     }
00244 };
00245 
00252 template <class T, int n, int m>
00253 fmatrix_assigner<T,n,m> operator <<= (FieldMatrix<T,n,m> & v, const T & t)
00254 {
00255     return fmatrix_assigner<T,n,m>(v,true).append(t);
00256 }
00257 
00263 template <class T, int n, int m>
00264 fmatrix_assigner<T,n,m> operator <<= (FieldMatrix<T,n,m> & v, Zero z)
00265 {
00266     return fmatrix_assigner<T,n,m>(v,true).append(z);
00267 }
00268 
00269 } // end namespace Dune
00270 
00271 #endif // DUNE_ASSIGN_HH

Generated on 6 Nov 2008 with Doxygen (ver 1.5.6) [logfile].