00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _STLUTIL_H_
00012 #define _STLUTIL_H_
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef STL_UNORDERED_MAP
00022 #include <map>
00023 #else
00024 #include <unordered_map>
00025 #endif
00026
00027 #include "RealVect.H"
00028 #include "IntVect.H"
00029 #include "MayDay.H"
00030 #include "CellEdge.H"
00031
00032 using namespace std;
00033
00034 #include "NamespaceHeader.H"
00035
00036 namespace STLUtil
00037 {
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 struct IVCompareSWO
00049 {
00050 IVCompareSWO(int a_dir) {
00051 m_dir = a_dir;
00052 if (m_dir<0 || m_dir>(SpaceDim-1))
00053 MayDay::Abort("IVCompareSWO: cannot compare IntVects along a direction that doesn't exist");
00054 }
00055
00056 IVCompareSWO() {
00057 m_dir = 0;
00058 }
00059
00060 inline bool operator()(const IntVect& a, const IntVect& b) const
00061 {
00062 if (a[m_dir%SpaceDim] < b[m_dir%SpaceDim])
00063 return true;
00064 else if (SpaceDim>1 && \
00065 a[ m_dir %SpaceDim] == b[ m_dir %SpaceDim] && \
00066 a[(m_dir+1)%SpaceDim] < b[(m_dir+1)%SpaceDim])
00067 return true;
00068 else if (SpaceDim>2 && \
00069 a[ m_dir %SpaceDim] == b[ m_dir %SpaceDim] && \
00070 a[(m_dir+1)%SpaceDim] == b[(m_dir+1)%SpaceDim] && \
00071 a[(m_dir+2)%SpaceDim] < b[(m_dir+2)%SpaceDim])
00072 return true;
00073 else
00074 return false;
00075 }
00076
00077 private:
00078 int m_dir;
00079 };
00080
00081
00082
00083 struct EdgeCompareSWO
00084 {
00085 inline bool operator()(const CellEdge& a,const CellEdge& b) const
00086 {
00087 if (a.m_node0==b.m_node0)
00088 return (a.m_dir<b.m_dir);
00089
00090 IVCompareSWO comparator;
00091 return comparator(a.m_node0,b.m_node0);
00092 }
00093 };
00094
00095
00096 struct RealIntCompare
00097 {
00098 inline bool operator()(const pair<Real,int>& a,const pair<Real,int>& b)
00099 {
00100 return a.first<b.first;
00101 }
00102 };
00103
00104 #ifdef STL_UNORDERED_MAP
00105
00106 template <class T>
00107 inline void hash_combine(std::size_t& seed, const T& v)
00108 {
00109 std::hash<T> hasher;
00110 seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
00111 }
00112
00113
00114 struct IVHash
00115 : std::unary_function<IntVect, std::size_t>
00116 {
00117 inline std::size_t operator()(const IntVect& a) const
00118 {
00119 std::size_t seed = 0;
00120 for (int i=0; i<SpaceDim; i++)
00121 hash_combine(seed,a[i]);
00122 return seed;
00123 }
00124 };
00125
00126
00127
00128 struct CellEdgeHash
00129 : std::unary_function<CellEdge, std::size_t>
00130 {
00131 inline std::size_t operator()(const CellEdge& a) const
00132 {
00133 IVHash node0hasher;
00134 std::size_t seed = node0hasher(a.m_node0);
00135 hash_combine(seed,a.m_dir);
00136 return seed;
00137 }
00138 };
00139 #endif
00140
00141 typedef struct {
00142
00143 Vector<int> vertices;
00144 Vector<int> triangles;
00145 } TriInCell;
00146
00147
00148 #ifndef STL_UNORDERED_MAP
00149 typedef map<IntVect, TriInCell, IVCompareSWO> CellMap;
00150 typedef map<IntVect, bool, IVCompareSWO> NodeMap;
00151 typedef map<CellEdge, RealVect, EdgeCompareSWO> EdgeMap;
00152 #else
00153 typedef unordered_map<IntVect, TriInCell, IVHash> CellMap;
00154 typedef unordered_map<IntVect, bool, IVHash> NodeMap;
00155 typedef unordered_map<CellEdge, RealVect, CellEdgeHash> EdgeMap;
00156 #endif
00157
00158
00159 void PMap(const CellMap& m);
00160 void PMap(const NodeMap& m);
00161 void PMap(const pair<IntVect, TriInCell>& p);
00162 void PIV(const IntVect& iv);
00163 void PRV(const RealVect& iv);
00164 void PVec(const Vector<int>& v);
00165 void PVec(const Vector<IntVect>& v);
00166 void PVec(const Vector<RealVect>& v);
00167 void PVec(const Vector< Vector<IntVect> >& v);
00168 void PVec(const Vector< Vector<int> >& v);
00169
00170
00171 RealVect IVToRV(const IntVect& iv,
00172 const RealVect& a_origin,
00173 const RealVect& a_dx);
00174
00175
00176 IntVect RVSign(const RealVect& rv);
00177
00178 typedef CellMap::iterator CellMapIt;
00179 typedef NodeMap::iterator NodeMapIt;
00180 typedef EdgeMap::iterator EdgeMapIt;
00181
00182 }
00183
00184 #include "NamespaceFooter.H"
00185 #endif
00186