00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _INTVECTSET_H_
00029 #define _INTVECTSET_H_
00030
00031 #include "SPACE.H"
00032
00033 #ifndef WRAPPER
00034 #include <iostream>
00035 #include "Box.H"
00036 #include "IntVect.H"
00037 #include "TreeIntVectSet.H"
00038 #include "DenseIntVectSet.H"
00039 #include "parstream.H"
00040
00041 #endif
00042
00044
00059 class IntVectSet
00060 {
00061 public:
00062 friend
00063 class IVSIterator;
00065
00066 ~IntVectSet();
00068
00070 IntVectSet();
00071 void
00072 define();
00073
00075
00077 IntVectSet(const IntVectSet& ige_in);
00078 void
00079 define(const IntVectSet& ige_in);
00080
00081 IntVectSet copy() const {return *this;}
00082
00083 void define_intvectset(const IntVectSet& ige_in){ define(ige_in);}
00085
00086 explicit
00087 IntVectSet(const DenseIntVectSet& a_dense);
00088 void
00089 define (const DenseIntVectSet& a_dense);
00090
00092
00093 explicit
00094 IntVectSet(const TreeIntVectSet& a_tree);
00095 void
00096 define (const TreeIntVectSet& a_tree);
00097
00099
00101 explicit
00102 IntVectSet(const IntVect& iv_in);
00103 void define(const IntVect& iv_in);
00104 void define_intvect(const IntVect& iv_in){define(iv_in);}
00106
00108 explicit
00109 IntVectSet(const Box& b);
00110 void
00111 define(const Box& b);
00112 void define_box(const Box& b){define(b);}
00113
00114
00116
00118
00125 friend
00126 IntVectSet
00127 operator|(const IntVectSet& ivs1, const IntVectSet& ivs2);
00128
00130
00138 friend
00139 IntVectSet
00140 operator|(const IntVectSet& ivs, const IntVect& iv);
00141
00143
00151 friend
00152 IntVectSet
00153 operator|(const IntVect& iv, const IntVectSet& ivs);
00154
00156
00164 friend
00165 IntVectSet
00166 operator|(const IntVectSet& ivs, const Box& b);
00167
00169
00177 friend
00178 IntVectSet
00179 operator|(const Box& b, const IntVectSet& ivs);
00180
00181
00183
00192 IntVectSet&
00193 operator|=(const IntVectSet& ivs);
00194
00195 void or_intvectset(const IntVectSet& ivs) { *this |= ivs;}
00196
00198
00207 IntVectSet&
00208 operator|=(const IntVect& iv);
00209 void or_intvect(const IntVect& ivs) { *this |= ivs;}
00210
00211
00213
00222 IntVectSet&
00223 operator|=(const Box& b);
00224 void or_box(const Box& b) { *this |= b;}
00225
00226
00227
00229
00231
00234 IntVectSet
00235 operator-(const IntVectSet& ivs) const;
00236
00238
00241 IntVectSet
00242 operator-(const Box& b) const;
00243
00245 IntVectSet
00249 operator-(const IntVect& iv) const;
00250
00252
00258 IntVectSet&
00259 operator-=(const IntVectSet& ivs);
00260 void minus(const IntVectSet& ivs){*this -= ivs;}
00261
00263
00269 IntVectSet&
00270 operator-=(const Box& b);
00271 void minus_box(const Box& b){ *this -=b;}
00272
00273
00275
00281 IntVectSet&
00282 operator-=(const IntVect& iv);
00283 void minus_intvect(const IntVect& iv){ *this -=iv;}
00284
00286
00288
00295 friend
00296 IntVectSet
00297 operator&(const IntVectSet& ivs1, const IntVectSet& ivs2);
00298
00300
00307 friend
00308 IntVectSet
00309 operator&(const IntVectSet& ivs, const Box& b);
00310
00312
00319 friend
00320 IntVectSet
00321 operator&(const Box& b, const IntVectSet& ivs);
00322
00324
00333 IntVectSet&
00334 operator&=(const IntVectSet& ivs);
00335 void and_intvectset(const IntVectSet& ivs){*this &= ivs;}
00336
00337
00338
00340
00349 IntVectSet&
00350 operator&=(const Box& b);
00351 void and_box(const Box& b){*this &= b;}
00352
00354
00363 IntVectSet&
00364 operator&=(const ProblemDomain& domain);
00365 void and_domain(const ProblemDomain& d){*this &= d;}
00366
00367
00369
00371
00382 void
00383 grow(int igrow);
00385
00394 friend
00395 IntVectSet
00396 grow(const IntVectSet& ivs, int igrow);
00397
00398
00399
00401
00413 IntVectSet&
00414 grow(int idir, int igrow);
00415 void grow_dir(int idir, int igrow){grow(idir, igrow);}
00416
00418
00427 IntVectSet&
00428 refine(int iref = 2);
00429
00431
00439 friend
00440 IntVectSet
00441 refine(const IntVectSet& ivs, int iref = 2);
00442
00443
00445
00454 IntVectSet&
00455 coarsen(int iref = 2);
00456
00458
00466 friend
00467 IntVectSet
00468 coarsen(const IntVectSet& ivs, int iref = 2);
00469
00471
00475 void
00476 shift(const IntVect& iv);
00477
00479
00484 void
00485 nestingRegion(int radius, const Box& domain);
00486
00488
00494 void
00495 nestingRegion(int radius, const ProblemDomain& domain);
00496 void nestingRegion_prob(int radius, const ProblemDomain& domain)
00497 {nestingRegion(radius, domain);}
00498
00500
00501 void
00502 makeEmpty();
00503
00505
00510 IntVectSet
00511 chop(int dir, int chop_pnt);
00512
00513
00515
00517
00518 int
00519 numPts() const;
00520
00522
00523 const Box&
00524 minBox() const;
00525
00527
00528 void recalcMinBox() const;
00529
00531
00532 bool
00533 isEmpty() const;
00534
00536
00537 bool
00538 isDense() const;
00539
00540
00542
00543 bool
00544 contains(const IntVect& iv) const;
00545
00547
00548 bool
00549 contains(const IntVectSet& iv) const;
00550 bool contains_intvectset(const IntVectSet& iv) const {return contains(iv);}
00551
00553
00556 bool
00557 contains(const Box& box) const;
00558 bool contains_box(const Box& b) const {return contains(b);}
00559
00561
00564 Vector<Box>
00565 boxes() const;
00566
00568
00573 void compact() const;
00574
00576
00579 void
00580 printBoxes(std::ostream& a_ostrm) const;
00581
00582 void p() const { printBoxes(pout());}
00583
00584 friend
00585 std::ostream& operator<<(std::ostream& os, const IntVectSet& ivs);
00586
00587
00588 void convert() const;
00589
00590
00591
00592 static long int count;
00593 static long int peakcount;
00594 private:
00595
00596 bool m_isdense;
00597 TreeIntVectSet m_ivs;
00598 DenseIntVectSet m_dense;
00599
00600
00601
00602
00603 friend void dumpmemoryatexit();
00604 static void clearStaticMemory();
00605
00606 };
00607
00608
00609
00610
00611
00613
00629 class IVSIterator
00630 {
00631 public:
00633 IVSIterator():m_isdense(true) {;}
00634
00636 IVSIterator(const IntVectSet& ivs);
00637
00638 ~IVSIterator(){;}
00639
00641 void define(const IntVectSet& ivs);
00642
00644 const IntVect& operator()() const ;
00645
00646 const IntVect& iv() const { return this->operator()();}
00647
00649 bool ok() const;
00650
00652 void operator++();
00653
00654 void incr() { ++(*this);}
00655
00657 void begin();
00658
00660 void reset();
00661
00663 void end();
00664 private:
00665 bool m_isdense;
00666 DenseIntVectSetIterator m_dense;
00667 TreeIntVectSetIterator m_tree;
00668 };
00669
00670
00671
00672 #ifndef WRAPPER
00673
00674
00675
00676 inline const IntVect& IVSIterator::operator()() const
00677 {
00678 if(m_isdense) return m_dense();
00679 return m_tree();
00680 }
00681
00682 inline bool IVSIterator::ok() const
00683 {
00684 if(m_isdense) return m_dense.ok();
00685 return m_tree.ok();
00686 }
00687
00688 inline void IVSIterator::operator++()
00689 {
00690 if(m_isdense) ++m_dense;
00691 else ++m_tree;
00692 }
00693 inline void IVSIterator::reset()
00694 {
00695 begin();
00696 }
00697
00698 inline void IVSIterator::begin()
00699 {
00700 if(m_isdense) m_dense.begin();
00701 else m_tree.begin();
00702 }
00703
00704 inline void IVSIterator::end()
00705 {
00706 if(m_isdense) m_dense.end();
00707 else m_tree.end();
00708 }
00709
00710
00711 inline IntVectSet::IntVectSet(): m_isdense(true)
00712 {
00713 count++;
00714 if(count > peakcount) peakcount = count;
00715 }
00716
00717 inline void IntVectSet::define(const IntVectSet& ige_in)
00718 {
00719 *this = ige_in;
00720 }
00721
00722 inline IntVectSet::IntVectSet(const IntVectSet& ige_in)
00723 {
00724 count++;
00725 if(count > peakcount) peakcount = count;
00726
00727 *this = ige_in;
00728 }
00729
00730 inline bool
00731 IntVectSet::isDense() const
00732 {
00733 return m_isdense;
00734 }
00735
00736 #endif
00737
00738 #endif