00001 #ifndef NMWR_GB_BOUNDARY_REG2D_H 00002 #define NMWR_GB_BOUNDARY_REG2D_H 00003 00004 // $LICENSE 00005 00006 #include "Gral/Base/boundary.h" 00007 #include "Gral/Base/grid-functors.h" 00008 00009 #include "Gral/Iterators/boundary-iterator.h" 00010 00011 #include "Gral/Grids/Cartesian2D/cartesian-grid2d.h" 00012 00016 class BoundaryRange<RegGrid2D> { 00017 public: 00018 00019 typedef RegGrid2D grid_type; 00020 typedef grid_types<grid_type> gt; 00021 typedef gt::Edge Edge; 00022 typedef gt::Vertex Vertex; 00023 00024 typedef iscellinside_pred<grid_type> inside_p; 00025 typedef BoundaryComponentVertexIterator2D<grid_type,inside_p> VertexIterator; 00026 typedef BoundaryComponentEdgeIterator2D <grid_type,inside_p> EdgeIterator; 00027 typedef BoundaryComponentEdgeIterator2D <grid_type,inside_p> FacetIterator; 00028 private: 00029 grid_type const* g; 00030 Edge seed_edge; 00031 public: 00032 BoundaryRange() : g(0) {} 00033 BoundaryRange(grid_type const& gg) : g(&gg) 00034 { 00035 // get edge on boundary (should be the first edge) 00036 gt::EdgeIterator e = TheGrid().FirstEdge(); 00037 while(! TheGrid().IsOnBoundary(*e)) 00038 ++e; 00039 seed_edge = *e; 00040 } 00041 00042 00043 // VertexIterator FirstVertex() const { return VertexIterator(seed_edge,IsEdgeOnBoundary(*g));} 00044 // EdgeIterator FirstEdge() const { return EdgeIterator (seed_edge,IsEdgeOnBoundary(*g));} 00045 // FacetIterator FirstFacet() const { return FacetIterator (seed_edge,IsEdgeOnBoundary(*g));} 00046 VertexIterator FirstVertex() const { return VertexIterator(seed_edge,IsCellInside(*g));} 00047 EdgeIterator FirstEdge() const { return EdgeIterator (seed_edge,IsCellInside(*g));} 00048 FacetIterator FirstFacet() const { return FacetIterator (seed_edge,IsCellInside(*g));} 00049 00050 // unsigned NumOfVertices() const; 00051 // unsigned NumOfEdges() const; 00052 // unsigned NumOfFacets() const; 00053 grid_type const& TheGrid() const { return *g;} 00054 00055 }; 00056 00057 struct grid_types<BoundaryRange<RegGrid2D> > 00058 { 00059 typedef grid_types<RegGrid2D> gt; 00060 typedef BoundaryRange<RegGrid2D> BrC; 00061 00062 typedef gt::Vertex Vertex; 00063 typedef gt::Edge Edge; 00064 // typedef gt::Facet Facet; 00065 // typedef gt::Cell Cell; 00066 00067 typedef BrC::VertexIterator VertexIterator; 00068 typedef BrC::EdgeIterator EdgeIterator; 00069 // typedef BrC::FacetIterator FacetIterator; 00070 // typedef BrC::CellIterator CellIterator; 00071 00072 // typedef gt::VertexOnCellIterator VertexOnCellIterator; 00073 // typedef gt::EdgeOnCellIterator EdgeOnCellIterator; 00074 // typedef gt::FacetOnCellIterator FacetOnCellIterator; 00075 // typedef gt::CellOnCellIterator CellOnCellIterator; 00076 }; 00077 00078 00079 00080 #endif 00081