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 }
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 }
00270
00271 #endif // DUNE_ASSIGN_HH