00001 #ifdef CH_LANG_CC 00002 /* 00003 * _______ __ 00004 * / ___/ / ___ __ _ / / ___ 00005 * / /__/ _ \/ _ \/ V \/ _ \/ _ \ 00006 * \___/_//_/\___/_/_/_/_.__/\___/ 00007 * Please refer to Copyright.txt, in Chombo's root directory. 00008 */ 00009 #endif 00010 00011 #ifndef _DENSEINTVECTSET_H_ 00012 #define _DENSEINTVECTSET_H_ 00013 00014 #include "BitSet.H" 00015 #include "IntVect.H" 00016 #include "Box.H" 00017 #include "Vector.H" 00018 #include "ProblemDomain.H" 00019 #include "NamespaceHeader.H" 00020 00021 class ProblemDomain; 00022 class DenseIntVectSetIterator; 00024 00038 class DenseIntVectSet 00039 { 00040 public: 00042 DenseIntVectSet() 00043 {} 00044 00046 00047 DenseIntVectSet(const Box& a_domain, bool init = true); 00048 // copy, and operator= should be fine 00049 00051 00054 DenseIntVectSet& operator-=(const Box& box); 00055 00057 00060 DenseIntVectSet& operator-=(const IntVect& intvect); 00061 00063 00066 DenseIntVectSet& operator-=(const DenseIntVectSet& ivs); 00067 00069 00072 DenseIntVectSet& operator&=(const Box& box); 00073 00075 00078 DenseIntVectSet& operator&=(const ProblemDomain& domain); 00079 00081 00086 DenseIntVectSet& operator|=(const IntVect& intvect); 00087 00089 00094 DenseIntVectSet& operator|=(const Box& b); 00095 00097 00102 DenseIntVectSet& operator|=(const DenseIntVectSet& b); 00103 00105 00108 DenseIntVectSet& operator&=(const DenseIntVectSet& ivs); 00109 00111 00114 void shift(const IntVect& iv); 00115 00117 /* slower, constant time pointwise access. 00118 You should not build a BoxIterator, then access this 00119 method if you intend to iterate over the objects true 00120 or false terms. you should build a DenseIntVectSetIterator */ 00121 bool operator[](const IntVect& index) const; 00122 00124 00126 bool contains(const Box& box) const; 00127 00129 00132 void coarsen(int iref); 00133 00135 00138 void refine(int iref); 00139 00141 00144 void grow(int igrow); 00145 00147 00150 void grow(int idir, int igrow); 00151 00153 00158 DenseIntVectSet chop(int dir, int chop_pnt); 00159 00160 inline const Box& box() const; 00161 00163 00165 void nestingRegion(int a_radius, const Box& a_domain); 00166 00168 00169 void nestingRegion(int a_radius, const ProblemDomain& a_domain); 00170 00172 00175 bool isEmpty() const; //cheaper than numPts by wide margin 00176 00178 00181 bool isFull() const; // cheaper than numPts, bu significant margin 00182 00184 00187 int numPts() const; 00188 00190 bool operator==(const DenseIntVectSet& a_lhs) const; 00191 00192 00197 bool operator<(const DenseIntVectSet& a_ivs) const; 00198 00200 00203 Vector<Box> createBoxes() const; 00205 00209 void compact() const ; 00210 00211 void recalcMinBox() const; 00212 00213 const Box& mBox() const {return m_minBox;} 00214 00217 int linearSize() const; 00218 00219 void linearIn(const void* const inBuf); 00220 00221 void linearOut(void* const a_outBuf) const; 00222 00224 private: 00225 00226 void grow(const IntVect& iv); 00227 // version without checking intersect or empty 00228 DenseIntVectSet& intersect(const DenseIntVectSet& rhs); 00229 Box m_domain; 00230 BitSet m_bits; 00231 friend class DenseIntVectSetIterator; 00232 Box m_minBox; 00233 }; 00234 00236 00238 class DenseIntVectSetIterator 00239 { 00240 public: 00241 00243 DenseIntVectSetIterator(); 00244 00246 DenseIntVectSetIterator(const DenseIntVectSet& ivs); 00247 00249 void define(const DenseIntVectSet& ivs); 00250 //default null, assignment, copy and destructor should work fine. 00251 00253 const IntVect& operator()() const ; 00254 00256 bool ok() const; 00257 00259 void operator++(); 00260 00262 void begin(); 00263 00265 void end(); 00266 00267 static DenseIntVectSet emptyDenseIntVectSet; 00268 00269 private: 00270 BitSetIterator m_iterator; 00271 IntVect m_current; 00272 const DenseIntVectSet* m_ivsPtr; 00273 int isize, ijsize, bigi, bigj; 00274 00275 void nextIntVect(); 00276 void nextIntVect(int skip); 00277 00278 }; 00279 00280 //=================================================================== 00281 00282 // inline functions 00283 00284 inline 00285 const Box& DenseIntVectSet::box() const { return m_domain;} 00286 00287 inline 00288 DenseIntVectSet& DenseIntVectSet::operator-=(const IntVect& intvect) 00289 { 00290 if(m_domain.contains(intvect)) 00291 m_bits.setFalse(m_domain.index(intvect)); 00292 return *this; 00293 } 00294 00295 inline void DenseIntVectSet::shift(const IntVect& iv) 00296 { 00297 m_domain.shift(iv); 00298 m_minBox.shift(iv); 00299 } 00300 00301 inline 00302 DenseIntVectSetIterator::DenseIntVectSetIterator() 00303 : m_ivsPtr(&emptyDenseIntVectSet) 00304 { 00305 ; 00306 } 00307 00308 inline 00309 void DenseIntVectSetIterator::define(const DenseIntVectSet& ivs) 00310 { 00311 m_ivsPtr = &ivs; 00312 begin(); 00313 } 00314 00315 inline 00316 DenseIntVectSetIterator::DenseIntVectSetIterator(const DenseIntVectSet& ivs) 00317 : m_ivsPtr(&ivs) 00318 { 00319 begin(); 00320 } 00321 00322 inline 00323 const IntVect& DenseIntVectSetIterator::operator()() const 00324 { 00325 return m_current; 00326 } 00327 00328 inline 00329 bool DenseIntVectSetIterator::ok() const 00330 { 00331 return m_iterator.ok(); 00332 } 00333 00334 inline 00335 void DenseIntVectSetIterator::end() 00336 { 00337 m_iterator.end(); 00338 } 00339 00340 // inline 00341 // void DenseIntVectSetIterator::operator++() 00342 // { 00343 // ++m_iterator; 00344 // nextIntVect(); 00345 // while(!m_iterator() && m_iterator.ok()) 00346 // { 00347 // ++m_iterator; // next bit please 00348 // nextIntVect(); 00349 // } 00350 // } 00351 inline 00352 void DenseIntVectSetIterator::operator++() 00353 { 00354 ++m_iterator; 00355 int i=1; 00356 while(m_iterator.ok() && !m_iterator()) 00357 { 00358 ++m_iterator; // next bit please 00359 ++i; 00360 } 00361 nextIntVect(i); 00362 } 00363 00364 #include "NamespaceFooter.H" 00365 #endif