00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef SUB_PARTICLE_ATTRIB_H
00012 #define SUB_PARTICLE_ATTRIB_H
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #include "SubField/SubFieldIter.h"
00053 #include "PETE/IpplExpressions.h"
00054
00055 #ifdef IPPL_USE_STANDARD_HEADERS
00056 #include <iostream>
00057 using namespace std;
00058 #else
00059 #include <iostream.h>
00060 #endif
00061
00062
00063 template <class PA, class T, unsigned Dim> class SubParticleAttrib;
00064 template <class PA, class T, unsigned Dim>
00065 ostream& operator<<(ostream &, const SubParticleAttrib<PA,T,Dim> &);
00066
00067
00068
00069
00070 template <class PA, class T, unsigned Dim>
00071 class SubParticleAttribIter
00072 : public PETE_Expr< SubParticleAttribIter<PA,T,Dim> >
00073 {
00074 public:
00075
00076 typedef SIndex<Dim> Index_t;
00077 typedef SubFieldIter<T, Dim, Index_t> SFI;
00078 typedef typename Index_t::const_iterator_iv const_iterator_iv;
00079
00080
00081 SubParticleAttribIter(PA &a, const_iterator_iv lf, int o, const Index_t &s)
00082 : dom(&s), attrib(&a), lfield(lf), attribOffset(o) { }
00083
00084
00085 SubParticleAttribIter(const SubParticleAttribIter<PA,T,Dim> &i)
00086 : attrib(const_cast<PA *>(i.attrib)),
00087 dom(i.dom), lfield(i.lfield), attribOffset(i.attribOffset) { }
00088
00089
00090 SubParticleAttribIter() : dom(0), attrib(0), attribOffset(0) { }
00091
00092
00093 ~SubParticleAttribIter() { }
00094
00095 bool operator!=(const SubParticleAttribIter<PA,T,Dim> &i) {
00096 return (attribOffset != i.attribOffset);
00097 }
00098
00099 PA &getAttrib() { return *attrib; }
00100 const Index_t &getDomain() const { return *dom; }
00101
00102 static int getSubsetType() { return SFI::getSubsetType(); }
00103 static bool matchType(int t) { return SFI::matchType(t); }
00104
00105 void initialize() { }
00106
00107 int size() const { return attrib->size(); }
00108 int size(int) const { return (*lfield)->size(); }
00109 T& offset(int i) { return (*attrib)[attribOffset + i]; }
00110 T& unit_offset(int i) { return (*attrib)[attribOffset + i]; }
00111
00112 static void makeNDIndex(const Index_t &s, NDIndex<Dim>& i) {
00113 i = s.getDomain();
00114 }
00115
00116 const_iterator_iv nextLField() {
00117 attribOffset += size(0);
00118 ++lfield;
00119 return lfield;
00120 }
00121
00122 const_iterator_iv getLFieldIter() const {
00123 return lfield;
00124 }
00125
00126 bool plugBase(const NDIndex<Dim>&) {
00127 return true;
00128 }
00129
00130
00131
00132
00133
00134 enum { IsExpr = 1 };
00135 typedef SubParticleAttribIter<PA,T,Dim> PETE_Expr_t;
00136 typedef T PETE_Return_t;
00137 PETE_Expr_t MakeExpression() const { return *this; }
00138
00139 private:
00140
00141 const Index_t *dom;
00142 PA *attrib;
00143 const_iterator_iv lfield;
00144
00145
00146
00147 int attribOffset;
00148 };
00149
00150
00151
00152 template <class PA, class T, unsigned Dim>
00153 class SubParticleAttrib : public PETE_Expr< SubParticleAttrib<PA,T,Dim> > {
00154
00155 public:
00156
00157 typedef PA Attrib_t;
00158 typedef T T_t;
00159 typedef SubParticleAttribIter<PA,T,Dim> iterator;
00160 typedef typename iterator::Index_t Index_t;
00161
00162
00163 enum { Dim_u = Dim };
00164
00165
00166 SubParticleAttrib(PA &a, const Index_t &dom)
00167 : A(a), MyDomain(dom) { }
00168
00169
00170 SubParticleAttrib(const SubParticleAttrib<PA,T,Dim> &spa)
00171 : A(const_cast<PA &>(spa.A)), MyDomain(spa.MyDomain) { }
00172
00173
00174 ~SubParticleAttrib() { }
00175
00176
00177
00178
00179
00180
00181 const Index_t &getDomain() const { return MyDomain; }
00182
00183
00184 PA &getAttrib() const { return A; }
00185
00186
00187 static int getSubsetType() { return iterator::getSubsetType(); }
00188
00189
00190 void makeNDIndex(NDIndex<Dim>& i) { iterator::makeNDIndex(MyDomain, i); }
00191
00192
00193 iterator begin() const;
00194 iterator end() const;
00195
00196
00197
00198
00199 int adjustSize();
00200
00201
00202
00203
00204
00205
00206 SubParticleAttrib<PA,T,Dim>& operator=(const SubParticleAttrib<PA,T,Dim> &);
00207
00208
00209 SubParticleAttrib<PA,T,Dim>& operator=(T);
00210
00211
00212
00213
00215
00216 template<class B>
00217 SubParticleAttrib<PA,T,Dim>&
00218 operator=(const PETE_Expr<B> &b) {
00219 TAU_TYPE_STRING(taustr, CT(*this) + " (" + CT(b) + " )" );
00220 TAU_PROFILE("SubParticleAttrib::operator=()", taustr,
00221 TAU_SUBFIELD | TAU_ASSIGN);
00222
00223
00224
00225 assign(*this, b);
00226 return *this;
00227 }
00228
00229
00230
00231
00232
00233 void write(ostream &) const;
00234
00235
00236
00237
00238
00239 enum { IsExpr = 1 };
00240 typedef iterator PETE_Expr_t;
00241 PETE_Expr_t MakeExpression() const { return begin(); }
00242
00243 private:
00244
00245 PA &A;
00246
00247
00248 const Index_t &MyDomain;
00249 };
00250
00251
00252
00253
00254 template<class PA, class T, unsigned Dim>
00255 inline
00256 ostream& operator<<(ostream &o, const SubParticleAttrib<PA,T,Dim> &n) {
00257 TAU_TYPE_STRING(taustr, "ostream (ostream, " + CT(s) + " )" );
00258 TAU_PROFILE("SubParticleAttrib::operator<<()", taustr,
00259 TAU_SUBFIELD | TAU_IO );
00260 n.write(o);
00261 return o;
00262 }
00263
00264
00265 #include "SubParticle/SubParticleAttrib.cpp"
00266
00267 #endif
00268
00269
00270
00271
00272
00273