00001 #ifndef GRAL_BASE_GB_GRID_BOUNDARY_GENERIC_H
00002 #define GRAL_BASE_GB_GRID_BOUNDARY_GENERIC_H
00003
00004
00005
00006
00007
00008
00009 #include "Gral/Iterators/boundary-iterator.h"
00010 #include "Gral/Base/grid-functors.h"
00011 #include "Gral/Subranges/find-boundary-components.h"
00012
00013 #include "list.h"
00014
00015
00030
00031
00032
00033 template<class GRID>
00034 class boundary_range_iterator;
00035
00036 template<class GRID>
00037 class boundary_range_vertex_iterator;
00038
00039 template<class GRID>
00040 class boundary_range_edge_iterator;
00041
00042
00047 template<class GRID>
00048 class boundary_range_generic {
00049 typedef boundary_range_generic<GRID> self;
00050
00051 typedef GRID grid_type;
00052 typedef grid_types<GRID> gt;
00053 typedef typename gt::Facet Facet;
00054
00055 friend class boundary_range_iterator<GRID>;
00056 typedef boundary_range_vertex_iterator<GRID> VertexIterator;
00057 typedef boundary_range_edge_iterator<GRID> EdgeIterator;
00058 typedef boundary_range_edge_iterator<GRID> FacetIterator;
00059
00060 typedef typename list<Facet>::const_iterator germ_iterator;
00061 private:
00062 list<Facet> component_germs;
00063 grid_type const* g;
00064 bool initialized;
00065 public:
00066 boundary_range_generic()
00067 : g(0), initialized(false) {}
00068 boundary_range_generic(grid_type const& gg)
00069 : g(&gg), initialized(false) {}
00070
00071 VertexIterator FirstVertex() const;
00072 FacetIterator FirstEdge() const;
00073 FacetIterator FirstFacet() const;
00074
00075 grid_type const& TheGrid() const {
00076 REQUIRE((g != 0), "No grid!\n",1);
00077 return *g;
00078 }
00079
00080 private:
00081 void init() const {
00082 self * my = (self *) this;
00083 find_boundary_component_germs(TheGrid(), my->component_germs);
00084 my->initialized = true;
00085 }
00086
00087 };
00088
00089
00090
00095 template<class GRID>
00096 class boundary_range_iterator
00097 {
00098 typedef GRID grid_type;
00099 typedef grid_types<GRID> gt;
00100 typedef typename gt::Vertex Vertex;
00101 typedef typename gt::Edge Edge;
00102 typedef typename gt::Facet Facet;
00103
00104 typedef boundary_range_generic<GRID> bd_range_type;
00105 typedef typename bd_range_type::germ_iterator germ_iterator;
00106
00107 typedef iscellinside_pred<grid_type> inside;
00108 typedef BoundaryComponentIterator2D<grid_type, inside> BoundaryComponentIterator;
00109
00110
00111 private:
00112 boundary_range_generic<GRID> const* r;
00113 germ_iterator germ;
00114 BoundaryComponentIterator bc;
00115
00116 typedef boundary_range_iterator<GRID> self;
00117 public:
00118 boundary_range_iterator(boundary_range_generic<GRID> const& BR)
00119 : r(&BR),
00120 germ(BR.component_germs.begin()),
00121 bc(*germ,inside(BR.TheGrid()))
00122 {}
00123
00124 self& operator++()
00125 {
00126 ++bc;
00127 if(bc.IsDone()) {
00128 ++germ;
00129 if( germ != r->component_germs.end())
00130 bc = BoundaryComponentIterator(*germ,inside(TheGrid()));
00131 }
00132 return *this;
00133 }
00134 bool IsDone() const { return ( germ == r->component_germs.end());}
00135
00136 grid_type const& TheGrid() const { return r->TheGrid(); }
00137 Vertex curr_vertex() const { return bc.curr_vertex();}
00138 Edge curr_edge() const { return bc.curr_edge();}
00139 Facet curr_facet() const { return bc.curr_facet();}
00140 };
00141
00142
00147 template<class GRID>
00148 class boundary_range_vertex_iterator {
00149 typedef GRID grid_type;
00150 typedef grid_types<GRID> gt;
00151 typedef typename gt::Vertex Vertex;
00152 typedef typename gt::Edge Edge;
00153 typedef typename gt::Facet Facet;
00154
00155 private:
00156 boundary_range_iterator<GRID> base;
00157
00158 typedef boundary_range_vertex_iterator<GRID> self;
00159 public:
00160 boundary_range_vertex_iterator() {}
00161 boundary_range_vertex_iterator(boundary_range_iterator<GRID> const& b)
00162 : base(b) {}
00163
00164 Vertex operator*() const { return base.curr_vertex();}
00165 bool IsDone() const { return base.IsDone();}
00166 self& operator++() { ++base; return (*this);}
00167
00168 grid_type const& TheGrid() const { return base.TheGrid();}
00169
00170 };
00171
00176 template<class GRID>
00177 class boundary_range_edge_iterator {
00178 typedef GRID grid_type;
00179 typedef grid_types<GRID> gt;
00180 typedef typename gt::Vertex Vertex;
00181 typedef typename gt::Edge Edge;
00182 typedef typename gt::Facet Facet;
00183
00184 private:
00185 boundary_range_iterator<GRID> base;
00186
00187 typedef boundary_range_edge_iterator<GRID> self;
00188 public:
00189 boundary_range_edge_iterator() {}
00190 boundary_range_edge_iterator(boundary_range_iterator<GRID> const& b)
00191 : base(b) {}
00192
00193 Edge operator*() const { return base.curr_edge();}
00194 bool IsDone() const { return base.IsDone();}
00195 self& operator++() { ++base; return (*this);}
00196
00197 grid_type const& TheGrid() const { return base.TheGrid();}
00198
00199 };
00200
00201
00202
00203
00204
00205 template<class GRID>
00206 inline
00207 boundary_range_vertex_iterator<GRID>
00208 boundary_range_generic<GRID>::FirstVertex() const
00209 {
00210 if ( ! initialized)
00211 init();
00212 return VertexIterator(*this);
00213 }
00214
00215 template<class GRID>
00216 inline
00217 boundary_range_edge_iterator<GRID>
00218 boundary_range_generic<GRID>::FirstFacet() const
00219 {
00220 if ( ! initialized)
00221 init();
00222 return FacetIterator(*this);
00223 }
00224
00225 template<class GRID>
00226 inline
00227 boundary_range_edge_iterator<GRID>
00228 boundary_range_generic<GRID>::FirstEdge() const
00229 { return FirstFacet();}
00230
00231 #endif
00232