Go to Overview over all GrAL packages.
Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

Gral/Subranges/boundary-range-generic.h

00001 #ifndef GRAL_BASE_GB_GRID_BOUNDARY_GENERIC_H
00002 #define GRAL_BASE_GB_GRID_BOUNDARY_GENERIC_H
00003 
00004 
00005 // $LICENSE
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 //---------------- inline functions ---------------------
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 

Copyright (c) Guntram Berti 1997-2002. See the GrAL Homepage for up-to-date information.

Generated at Tue Feb 26 16:05:48 2002 for GrAL Base by doxygen 1.2.11-20011104 written by Dimitri van Heesch, © 1997-2000