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 _STDSETIVS_H_ 00012 #define _STDSETIVS_H_ 00013 00014 #include "Box.H" 00015 #include "ProblemDomain.H" 00016 #include <set> 00017 #include "NamespaceHeader.H" 00018 using namespace std; 00019 class StdSetIVSIterator; 00020 00021 struct lex_compare_iv 00022 { 00023 bool operator() (const IntVect& lhs, const IntVect& rhs) const 00024 { 00025 return lhs.lexLT(rhs); 00026 } 00027 }; 00028 /// IntVectSet implementation based std::set 00029 /** 00030 */ 00031 class StdSetIVS 00032 { 00033 public: 00034 friend class StdSetIVSIterator; 00035 00036 /// 00037 StdSetIVS(){;} 00038 00039 /// 00040 StdSetIVS(const Box& a_box); 00041 00042 /// 00043 StdSetIVS(const StdSetIVS& a_sivs); 00044 00045 /// 00046 ~StdSetIVS(){;} 00047 00048 /// 00049 void define(const Box&); 00050 00051 /// 00052 void define(const StdSetIVS& a_sivs); 00053 00054 /// 00055 StdSetIVS& operator=(const StdSetIVS& a_sivs); 00056 00057 ///or 00058 StdSetIVS& operator|=(const StdSetIVS& a_sivs); 00059 00060 /// 00061 StdSetIVS& operator|=(const IntVect& a_iv); 00062 00063 /// 00064 StdSetIVS& operator|=(const Box& a_box); 00065 00066 ///and 00067 StdSetIVS& operator&=(const StdSetIVS& s_sivs); 00068 00069 ///and 00070 StdSetIVS& operator&=(const Box& a_box); 00071 00072 ///and 00073 StdSetIVS& operator&=(const ProblemDomain& a_domain); 00074 00075 ///not 00076 StdSetIVS& operator-=(const StdSetIVS& a_sivs); 00077 00078 ///not 00079 StdSetIVS& operator-=(const IntVect& a_iv); 00080 00081 ///not 00082 StdSetIVS& operator-=(const Box& a_box); 00083 00084 ///returns true if 00085 bool operator==(const StdSetIVS& lhs) const; 00086 00087 /// 00088 bool contains(const IntVect& iv) const; 00089 00090 /// 00091 bool contains(const Box& box) const; 00092 00093 /// 00094 void grow(int igrow); 00095 00096 /// 00097 void grow(int idir, int igrow); 00098 00099 /// 00100 void growHi(); 00101 00102 /// 00103 void growHi(int a_dir); 00104 00105 /// 00106 void refine(int iref = 2); 00107 00108 /// 00109 void coarsen(int iref = 2); 00110 00111 /// 00112 void shift(const IntVect& iv); 00113 00114 /// 00115 void clear(); 00116 00117 /// 00118 Box minBox() const; 00119 00120 /// 00121 bool isEmpty() const; 00122 00123 /// 00124 void makeEmpty() ; 00125 00126 /// 00127 int numPts() const; 00128 00129 /// 00130 int linearSize() const; 00131 00132 /// 00133 void linearIn(const void* const inBuf); 00134 00135 /// 00136 void linearOut(void* const a_outBuf) const; 00137 00138 void define(const Vector<IntVect>& a_vect); 00139 private: 00140 00141 void getVectorIV(Vector<IntVect>& a_vect) const; 00142 std::set<IntVect, lex_compare_iv> m_stdSet; 00143 }; 00144 00145 /// 00146 class StdSetIVSIterator 00147 { 00148 public: 00149 /// 00150 StdSetIVSIterator(); 00151 00152 /// 00153 StdSetIVSIterator(const StdSetIVS& ivs); 00154 00155 /// 00156 void define(const StdSetIVS& ivs); 00157 00158 /// 00159 const IntVect& operator()() const ; 00160 00161 /// 00162 bool ok() const; 00163 00164 /// 00165 void operator++(); 00166 00167 /// 00168 void begin(); 00169 00170 /// 00171 void end(); 00172 00173 /// 00174 void clear(); 00175 private: 00176 const StdSetIVS* m_ivs; 00177 std::set<IntVect, lex_compare_iv>::iterator m_iter; 00178 }; 00179 00180 #include "NamespaceFooter.H" 00181 #endif // STDSETIVS_H