00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _DATAITERATOR_H_
00012 #define _DATAITERATOR_H_
00013
00014 #include "Vector.H"
00015 #include "DataIndex.H"
00016 #include "BoxLayout.H"
00017 #include "SPMD.H"
00018 #include "LayoutIterator.H"
00019 #include "NamespaceHeader.H"
00020
00021
00022 #ifdef CH_MPI
00023
00025
00040 class DataIterator
00041 {
00042
00043 public:
00044
00046 DataIterator();
00047
00048 DataIterator(const BoxLayout& a_layout){*this = a_layout.dataIterator();}
00049
00050 virtual ~DataIterator()
00051 {}
00052
00054
00055 inline const DataIndex& operator()() const ;
00057
00058 DataIndex i() const { return this->operator()();}
00059
00061 inline virtual void operator++();
00063 void incr() { ++(*this);}
00064
00066 virtual bool ok() const;
00067
00069 void begin();
00070
00072 void reset();
00073
00075
00076 void end();
00077
00078 int size() const { return m_indices->size();}
00079
00080 private:
00081
00082 friend class BoxLayout;
00083 friend class DisjointBoxLayout;
00084 friend class TimedDataIterator;
00085
00086 DataIterator(const BoxLayout& boxlayout, const int* layoutID);
00087
00088 BoxLayout m_layout;
00089 RefCountedPtr<Vector<DataIndex> > m_indices;
00090 int m_current;
00091 };
00092
00093 inline DataIterator::DataIterator()
00094 : m_current(-1)
00095 {}
00096
00097 inline const DataIndex& DataIterator::operator()() const
00098 {
00099 CH_assert(ok());
00100 return m_indices->operator[](m_current);
00101 }
00102
00103 inline void DataIterator::operator++()
00104 {
00105 ++m_current;
00106 }
00107
00108 inline bool DataIterator::ok() const
00109 {
00110 return m_current < m_indices->size();
00111 }
00112
00113 inline void DataIterator::reset()
00114 {
00115 begin();
00116 }
00117
00118 inline void DataIterator::begin()
00119 {
00120 m_current=0;
00121 }
00122
00123 #else
00124
00125
00126
00127 class DataIterator : public LayoutIterator
00128 {
00129 public:
00130 virtual ~DataIterator()
00131 {}
00132
00133 DataIterator()
00134 {}
00135
00136 DataIterator(const BoxLayout& a_layout){*this = a_layout.dataIterator();}
00137
00139
00140 const DataIndex& operator()() const
00141 {
00142 return (const DataIndex&)(LayoutIterator::operator()());
00143 };
00144
00146
00147 DataIndex i() const {return this->operator()();}
00148
00149 int size() const { return this->m_layout.size();}
00150
00151 private:
00152 friend class BoxLayout;
00153 friend class DisjointBoxLayout;
00154 friend class TimedDataIterator;
00155
00156 protected:
00157 DataIterator(const BoxLayout& boxlayout, const int* layoutID)
00158 :LayoutIterator(boxlayout, layoutID)
00159 {}
00160 };
00161
00162 #endif
00163
00164 #define DATAITERATOR(CLASS, BOXLAYOUT) \
00165 DataIterator dit = BOXLAYOUT .dataIterator(); \
00166 for(dit.begin(); dit.ok(); ++dit) { \
00167 DataIndex di = dit(); \
00168 MT_BEGIN1(CLASS, DataIndex, di)
00169
00170 #define ENDITERATOR(CLASS) \
00171 MT_END1(CLASS, DataIndex, di) \
00172 }
00173
00174 #define DATAITERATOR1(CLASS, BOXLAYOUT, TYPE1, VAL1) \
00175 DataIterator dit = BOXLAYOUT .dataIterator(); \
00176 for(dit.begin(); dit.ok(); ++dit) { \
00177 DataIndex di = dit(); \
00178 MT_BEGIN2(CLASS, TYPE1, VAL1, DataIndex, di)
00179
00180 #define ENDITERATOR1(CLASS, TYPE1, VAL1) \
00181 MT_END2(CLASS, TYPE1, VAL1, DataIndex, di) \
00182 }
00183
00184 #define DATAITERATOR2(CLASS, BOXLAYOUT, TYPE1, VAL1, TYPE2, VAL2) \
00185 DataIterator dit = BOXLAYOUT .dataIterator(); \
00186 for(dit.begin(); dit.ok(); ++dit) { \
00187 DataIndex di = dit(); \
00188 MT_BEGIN3(CLASS, TYPE1, VAL1, TYPE2, VAL2, DataIndex, di)
00189
00190 #define ENDITERATOR2(CLASS, TYPE1, VAL1, TYPE2, VAL2) \
00191 MT_END3(CLASS, TYPE1, VAL1, TYPE2, VAL2, DataIndex, di) \
00192 }
00193
00194 #include "NamespaceFooter.H"
00195 #endif