00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef SUB_FIELD_H
00012 #define SUB_FIELD_H
00013
00014
00015 #include "SubField/SubBareField.h"
00016 #include "SubField/SubFieldTraits.h"
00017
00018
00019
00020 template <class T> class PETE_Expr;
00021 template<class T, unsigned D, class M, class C> class Field;
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 template<class T, unsigned int Dim, class M, class C, class S>
00032 class SubField : public SubBareField<T,Dim,S> {
00033
00034 friend class Field<T,Dim,M,C>;
00035
00036 public:
00037
00038
00039
00040
00041
00042 Field<T,Dim,M,C>& getField() const { return F; }
00043
00044
00045
00046
00047
00048
00049
00050
00051
00053
00054
00055
00056 template<class S2>
00057 SubField<T,Dim,M,C,typename SubFieldTraits<T,Dim,S,S2>::Return_t>
00058 operator[](const S2& s) {
00059
00060 typename SubFieldTraits<T,Dim,S,S2>::Return_t newdomain;
00061 TAU_TYPE_STRING(taustr, CT(newdomain) + " (" + CT(s) + " )" );
00062 TAU_PROFILE("SubBareField::operator[]()", taustr, TAU_SUBFIELD);
00063
00064
00065
00066 int B = SubFieldTraits<T,Dim,S,S2>::Brackets_u;
00067 if (this->checkAddBrackets(B)) {
00068 SubFieldTraits<T,Dim,S,S2>::combine(
00069 SubBareField<T,Dim,S>::MyDomain,
00070 s,
00071 newdomain,
00072 SubBareField<T,Dim,S>::Brackets,
00073 SubBareField<T,Dim,S>::A);
00074 SubBareField<T,Dim,S>::Brackets += B;
00075 }
00076
00077
00078 return SubField<T,Dim,M,C,
00079 typename SubFieldTraits<T,Dim,S,S2>::Return_t>(F, newdomain);
00080 }
00081
00082
00083
00084
00085
00086
00087
00088 void operator=(T);
00089
00090
00091 SubField<T,Dim,M,C,S>& operator=(const SubField<T,Dim,M,C,S> &);
00092
00093
00094
00095
00097
00098 template<class B>
00099 SubField<T,Dim,M,C,S>&
00100 operator=(const PETE_Expr<B> &b) {
00101 TAU_TYPE_STRING(taustr, CT(*this) + " (" + CT(b) + " )" );
00102 TAU_PROFILE("SubBareField::operator=()", taustr,
00103 TAU_SUBFIELD | TAU_ASSIGN);
00104 assign(*this, b);
00105 return *this;
00106 }
00107
00108
00109
00110 protected:
00111
00112 Field<T,Dim,M,C>& F;
00113
00114 public:
00115
00116
00117
00118
00119
00121
00122
00123 template<class S2>
00124 SubField(Field<T,Dim,M,C>& f, const S2& s)
00125 : SubBareField<T,Dim,S>(f, s), F(f) { }
00126
00127 };
00128
00129 #include "SubField/SubField.cpp"
00130
00131 #endif // SUB_FIELD_H
00132
00133
00134
00135
00136
00137