00001 #ifndef GRAL_GB_VIEWS_RESTRICTED_COMPONENT_VIEW_H
00002 #define GRAL_GB_VIEWS_RESTRICTED_COMPONENT_VIEW_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "Gral/Base/common-grid-basics.h"
00019 #include "Gral/Base/archetypes-from-base.h"
00020 #include "Gral/Subranges/enumerated-subrange.h"
00021 #include "Gral/Base/grid-function-hash.h"
00022
00023 #include "Gral/Iterators/closure-iterator.h"
00024 #include "Gral/Iterators/iterator-base.h"
00025
00026 #include "Gral/Base/wrap-elements.h"
00027
00028
00029 namespace GrAL {
00030
00031
00053 namespace restricted_grid_component_view {
00054
00055 template<class GRID, class INSIDE_PRED, class GT> class vertex;
00056 template<class GRID, class INSIDE_PRED, class GT> class vertex_iterator;
00057 template<class GRID, class INSIDE_PRED, class GT> class cell;
00058 template<class GRID, class INSIDE_PRED, class GT> class cell_iterator;
00059 template<class GRID, class INSIDE_PRED, class GT> class vertex_on_cell_iterator;
00060 template<class GRID, class INSIDE_PRED, class GT> class grid_view;
00061
00062
00063 template<class GRID, class INSIDE_PRED, class GT>
00064 struct grid_types_grid_view_b
00065 : public archetypes_from_base_grid_types<GT>
00066 ,public grid_types_detail::grid_types_root
00067
00068 {
00069 typedef GRID base_grid_type;
00070 typedef grid_view<GRID, INSIDE_PRED, GT> grid_type;
00071 typedef GT bgt;
00072
00073 typedef typename bgt::size_type size_type;
00074 typedef typename bgt::dimension_tag dimension_tag;
00075 typedef typename bgt::vertex_handle vertex_handle;
00076 typedef typename bgt::cell_handle cell_handle;
00077
00078 typedef vertex <GRID,INSIDE_PRED, GT> Vertex;
00079 typedef cell <GRID,INSIDE_PRED, GT> Cell;
00080 typedef vertex_iterator <GRID,INSIDE_PRED, GT> VertexIterator;
00081 typedef cell_iterator <GRID,INSIDE_PRED, GT> CellIterator;
00082 typedef vertex_on_cell_iterator<GRID,INSIDE_PRED, GT> VertexOnCellIterator;
00083
00084 typedef typename bgt::Vertex BaseVertex;
00085 typedef typename bgt::Cell BaseCell;
00086 };
00087
00088 template<class GRID, class INSIDE_PRED, class GT>
00089 struct grid_types_grid_view_b2 :
00090 public wrap_all_downward_incidence_iterator_types<grid_types_grid_view_b<GRID, INSIDE_PRED, GT>, GT>
00091 {};
00092
00093 template<class GRID, class INSIDE_PRED, class GT>
00094 struct grid_types_grid_view : public grid_types_grid_view_b2<GRID, INSIDE_PRED, GT>
00095 {
00096 typedef grid_types_grid_view_b2<GRID, INSIDE_PRED, GT> base;
00097 typedef closure_iterator<typename base::CellIterator, typename base::EdgeOnCellIterator, base> EdgeIterator;
00098
00099 static typename base::cell_handle invalid_cell_handle(typename base::grid_type const& g)
00100 { return GT::invalid_cell_handle(g.BaseGrid()); }
00101 };
00102
00118 template<class GRID, class INSIDE_PRED, class GT = grid_types<GRID> >
00119 class grid_view : public archetypes_from_base<grid_view<GRID, INSIDE_PRED, GT>, GRID, GT> {
00120 public:
00121 typedef grid_view<GRID, INSIDE_PRED, GT> self;
00122 typedef grid_types_grid_view_b <GRID, INSIDE_PRED, GT>
00123 gt;
00124 typedef GT bgt;
00125 typedef self grid_type;
00126 typedef GRID base_grid_type;
00127 typedef INSIDE_PRED pred_type;
00128
00129 enum { dim = gt::dimension_tag::dim };
00130 typedef grid_view_category_d<dim> category;
00131
00132 typedef typename bgt::Vertex baseVertex;
00133 typedef typename bgt::Cell baseCell;
00134 typedef typename bgt::CellOnCellIterator baseCellOnCellIterator;
00135 typedef typename bgt::VertexOnCellIterator baseVertexOnCellIterator;
00136 typedef typename bgt::vertex_handle vertex_handle;
00137 typedef typename bgt::cell_handle cell_handle;
00138
00139
00140 typedef typename gt::Vertex Vertex;
00141 typedef typename gt::VertexIterator VertexIterator;
00142 typedef typename gt::Cell Cell;
00143 typedef typename gt::CellIterator CellIterator;
00144
00145 typedef enumerated_subrange<GRID> range_type;
00146 private:
00147 ref_ptr<base_grid_type const> g;
00148 pred_type inside;
00149 range_type germs;
00150
00151 mutable range_type range;
00152 mutable bool cells_initialized;
00153 mutable bool vertices_initialized;
00154 public:
00155 grid_view() {}
00156 grid_view(base_grid_type const& gg,
00157 pred_type ins,
00158 baseCell const& grm);
00159 template<class IT>
00160 grid_view(base_grid_type const& gg,
00161 pred_type ins,
00162 IT begin_germ, IT end_germ);
00163
00164 void init(base_grid_type const& gg,
00165 pred_type ins,
00166 baseCell const& grm);
00167
00168 template<class IT>
00169 void init(base_grid_type const& gg,
00170 pred_type ins,
00171 IT begin_germ, IT end_germ);
00172
00173 void clear();
00174
00175 friend class restricted_grid_component_view::vertex_iterator<GRID,INSIDE_PRED, GT>;
00176 friend class restricted_grid_component_view::cell_iterator <GRID,INSIDE_PRED, GT>;
00177 friend class vertex<GRID,INSIDE_PRED, GT>;
00178
00179 VertexIterator FirstVertex() const { return VertexIterator(*this);}
00180 VertexIterator EndVertex() const { return VertexIterator(*this, TheRange().EndVertex());}
00181 unsigned NumOfVertices() const { return TheRange().NumOfVertices();}
00182 CellIterator FirstCell() const { return CellIterator(*this);}
00183 CellIterator EndCell() const { return CellIterator(*this, TheRange().EndCell());}
00184 unsigned NumOfCells() const { return TheRange().NumOfCells();}
00185
00186
00187 base_grid_type const& BaseGrid() const { return *g;}
00188 base_grid_type const& TheGrid() const { return *g;}
00189 range_type const& TheRange() const { init_cells(); init_vertices(); return range;}
00190 private:
00191 void init_cells() const;
00192 void init_vertices() const;
00193 };
00194
00195
00196
00197 template<class GRID, class INSIDE_PRED, class GT = grid_types<GRID> >
00198 class vertex {
00199 typedef vertex<GRID,INSIDE_PRED, GT> self;
00200 public:
00201 typedef vertex_type_tag element_type_tag;
00202 typedef grid_vertex_category category;
00203 typedef grid_view<GRID,INSIDE_PRED, GT> grid_type;
00204 typedef typename grid_type::baseVertex baseVertex;
00205 typedef typename grid_type::vertex_handle vertex_handle;
00206
00207 private:
00208 grid_type const* g;
00209 baseVertex v;
00210 public:
00211 vertex() : g(0) {}
00212 vertex(grid_type const& gg)
00213 : g(&gg), v(* gg.TheRange().FirstVertex()) {}
00214
00218 vertex(grid_type const& gg, vertex_handle vv)
00219 : g(&gg), v(gg.BaseGrid(), vv) {}
00220
00221 operator baseVertex() const { return v;}
00222 baseVertex Base() const { return v;}
00223 vertex_handle handle() const { return v.handle();}
00224 grid_type const& TheGrid () const { return *g;}
00225 grid_type const& BaseGrid() const { return *g;}
00226
00227 bool operator==(self const& rhs) const { return v == rhs.v;}
00228 bool operator!=(self const& rhs) const { return !(*this == rhs);}
00229 };
00230
00231
00232 template<class GRID, class INSIDE_PRED, class GT = grid_types<GRID> >
00233 class vertex_iterator : public sequence_iter_base<grid_types_grid_view<GRID,INSIDE_PRED,GT>,
00234 vertex_type_tag>
00235 {
00236 typedef vertex_iterator<GRID,INSIDE_PRED, GT> self;
00237 public:
00238 typedef grid_vertex_iterator_category category;
00239 typedef grid_view<GRID,INSIDE_PRED, GT> grid_type;
00240 typedef grid_types<typename grid_type ::range_type> rgt;
00241 typedef typename rgt::VertexIterator rangeVertexIterator;
00242 typedef typename grid_type::baseVertex baseVertex;
00243 typedef typename grid_type::Vertex Vertex;
00244 typedef typename grid_type::vertex_handle vertex_handle;
00245
00246 typedef grid_type anchor_type;
00247 typedef Vertex value_type;
00248 private:
00249 grid_type const* g;
00250 rangeVertexIterator v;
00251 public:
00252 vertex_iterator() : g(0) {}
00253 vertex_iterator(grid_type const& gg) : g(&gg), v(gg.TheRange().FirstVertex()) {}
00254 vertex_iterator(grid_type const& gg, rangeVertexIterator vv) : g(&gg), v(vv) {}
00255
00256 self& operator++() { ++v; return *this;}
00257 Vertex operator*() const { return Vertex(*g, handle());}
00258 operator baseVertex() const { return *v;}
00259 baseVertex Base() const { return *v;}
00260 bool IsDone() const { return v.IsDone();}
00261 grid_type const& TheGrid () const { return *g;}
00262 grid_type const& TheAnchor () const { return *g;}
00263
00264
00265
00266 vertex_handle handle() const { return v.handle();}
00267
00268 bool operator==(self const& rhs) const { return v == rhs.v;}
00269 bool operator!=(self const& rhs) const { return !(*this == rhs);}
00270
00271 bool bound() const { return g!=0;}
00272 bool valid() const { return v.valid();}
00273 };
00274
00275
00276
00277
00278 template<class GRID, class INSIDE_PRED, class GT = grid_types<GRID> >
00279 class cell {
00280 typedef cell<GRID,INSIDE_PRED, GT> self;
00281 public:
00282 typedef cell_type_tag element_type_tag;
00283 typedef grid_cell_category category;
00284 typedef grid_view<GRID,INSIDE_PRED, GT> grid_type;
00285 typedef typename grid_type::baseCell baseCell;
00286 typedef typename grid_type::cell_handle cell_handle;
00287
00288 typedef grid_type anchor_type;
00289 typedef self value_type;
00290 private:
00291 grid_type const* g;
00292 cell_handle c;
00293 public:
00294 cell() : g(0) {}
00295 cell(grid_type const& gg, cell_handle cc) : g(&gg), c(cc) {}
00296 cell(grid_type const& gg, baseCell const& bc) : g(&gg), c(bc.handle()) {}
00297
00298 operator baseCell() const { return Base();}
00299 baseCell Base() const { return baseCell(g->BaseGrid(),c);}
00300 cell_handle handle() const { return c;}
00301 unsigned NumOfVertices() const { return Base().NumOfVertices();}
00302
00303 grid_type const& TheGrid () const { return *g;}
00304
00305 bool operator==(self const& rhs) const { return c == rhs.c;}
00306 bool operator!=(self const& rhs) const { return !(*this == rhs);}
00307
00308 bool bound() const { return g!=0;}
00309 };
00310
00311
00312
00313
00314 template<class GRID, class INSIDE_PRED, class GT = grid_types<GRID> >
00315 class cell_iterator : public sequence_iter_base<grid_types_grid_view<GRID,INSIDE_PRED,GT>,
00316 cell_type_tag>
00317 {
00318 typedef cell_iterator<GRID,INSIDE_PRED, GT> self;
00319 public:
00320 typedef grid_cell_iterator_category category;
00321 typedef grid_view<GRID,INSIDE_PRED, GT> grid_type;
00322 typedef grid_types<typename grid_type ::range_type> rgt;
00323 typedef typename rgt::CellIterator RangeCellIterator;
00324 typedef typename grid_type::baseCell baseCell;
00325 typedef typename grid_type::Cell Cell;
00326 typedef typename grid_type::cell_handle cell_handle;
00327
00328 typedef grid_type anchor_type;
00329 typedef Cell value_type;
00330 private:
00331 grid_type const* g;
00332 RangeCellIterator c;
00333 public:
00334 cell_iterator() : g(0) {}
00335 cell_iterator(grid_type const& gg)
00336 : g(&gg), c(gg.TheRange().FirstCell()) {}
00337 cell_iterator(grid_type const& gg, RangeCellIterator cc)
00338 : g(&gg), c(cc) {}
00339
00340 self& operator++() { ++c; return *this;}
00341 Cell operator*() const { return Cell(TheGrid(), handle());}
00342 bool IsDone() const { return c.IsDone();}
00343 cell_handle handle() const { return c.handle();}
00344
00345 grid_type const& TheGrid () const { return *g;}
00346 grid_type const& TheAnchor() const { return *g;}
00347
00348 bool operator==(self const& rhs) const { return c == rhs.c;}
00349 bool operator!=(self const& rhs) const { return !(*this == rhs);}
00350
00351 bool bound() const { return g!=0;}
00352 bool valid() const { return c.valid();}
00353 };
00354
00355
00356
00357
00358 template<class GRID, class INSIDE_PRED, class GT = grid_types<GRID> >
00359 class vertex_on_cell_iterator
00360 : public incidence_iter_base<grid_types_grid_view<GRID,INSIDE_PRED,GT>,
00361 vertex_type_tag,
00362 cell_type_tag>
00363 {
00364 typedef vertex_on_cell_iterator<GRID,INSIDE_PRED, GT> self;
00365 public:
00366 typedef grid_view<GRID,INSIDE_PRED, GT> grid_type;
00367 typedef typename grid_type::baseVertexOnCellIterator baseVertexOnCellIterator;
00368 typedef typename grid_type::vertex_handle vertex_handle;
00369 typedef typename grid_type::Cell Cell;
00370 typedef typename grid_type::Vertex Vertex;
00371
00372 typedef grid_incidence_iterator_category_d<0,grid_type::dim> category;
00373 typedef Vertex value_type;
00374 typedef Cell anchor_type;
00375 private:
00376 Cell c;
00377 baseVertexOnCellIterator vc;
00378 public:
00379 vertex_on_cell_iterator() {}
00380 vertex_on_cell_iterator(Cell const& cc)
00381 : c(cc), vc(c.Base()) {}
00382 vertex_on_cell_iterator(Cell const& cc, baseVertexOnCellIterator vvc)
00383 : c(cc), vc(vvc) {}
00384
00385 self& operator++() { ++vc; return *this;}
00386 Vertex operator*() const { return Vertex(TheGrid(),handle());}
00387 bool IsDone() const { return vc.IsDone();}
00388 vertex_handle handle() const { return vc.handle();}
00389
00390 grid_type const& TheGrid() const { return c.TheGrid();}
00391 anchor_type const& TheAnchor() const { return c;}
00392 anchor_type const& TheCell () const { return c;}
00393
00394 bool operator==(self const& rhs) const { return c == rhs.c && vc == rhs.vc;}
00395 bool operator!=(self const& rhs) const { return !(*this == rhs);}
00396 };
00397
00398
00399 }
00400
00401 template<class GRID, class INSIDE_PRED, class GT>
00402 struct grid_types<restricted_grid_component_view::grid_view<GRID,INSIDE_PRED,GT> >
00403 : public grid_types_base<restricted_grid_component_view::grid_types_grid_view<GRID,INSIDE_PRED,GT> >
00404 {};
00405
00406 template<class GRID, class INSIDE_PRED, class GT>
00407 struct element_traits<restricted_grid_component_view::vertex<GRID,INSIDE_PRED,GT> >
00408 : public element_traits_vertex_base<restricted_grid_component_view::grid_view<GRID,INSIDE_PRED,GT> >
00409 {
00410 typedef element_traits_vertex_base<restricted_grid_component_view::grid_view<GRID,INSIDE_PRED,GT> > base;
00411 typedef typename base::hasher_type_elem_base hasher_type;
00412 };
00413
00414 template<class GRID, class INSIDE_PRED, class GT>
00415 struct element_traits<restricted_grid_component_view::cell<GRID,INSIDE_PRED,GT> >
00416 : public element_traits_cell_base<restricted_grid_component_view::grid_view<GRID,INSIDE_PRED,GT> >
00417 {
00418 typedef element_traits_cell_base<restricted_grid_component_view::grid_view<GRID,INSIDE_PRED,GT> > base;
00419 typedef typename base::hasher_type_elem_base hasher_type;
00420 };
00421
00422
00423
00424 namespace restricted_grid_component_view {
00425
00426 #define gt grid_types<grid_view<GRID,INSIDE_PRED,GT> >
00427
00428 template<class GRID, class INSIDE_PRED, class GT>
00429 vertex_iterator<GRID,INSIDE_PRED, GT>
00430 gral_begin(grid_view<GRID,INSIDE_PRED, GT> const& g, vertex_iterator<GRID,INSIDE_PRED, GT>)
00431 { return g.FirstVertex();}
00432
00433 template<class GRID, class INSIDE_PRED, class GT>
00434 vertex_iterator<GRID,INSIDE_PRED, GT>
00435 gral_end(grid_view<GRID,INSIDE_PRED, GT> const& g, vertex_iterator<GRID,INSIDE_PRED, GT>)
00436 { return g.EndVertex();}
00437
00438 template<class GRID, class INSIDE_PRED, class GT>
00439 typename grid_types<grid_view<GRID,INSIDE_PRED, GT> >::size_type
00440 gral_size(grid_view<GRID,INSIDE_PRED, GT> const& g, vertex_iterator<GRID,INSIDE_PRED, GT>)
00441 { return g.NumOfVertices();}
00442
00443
00444
00445 template<class GRID, class INSIDE_PRED, class GT>
00446 cell_iterator<GRID,INSIDE_PRED, GT>
00447 gral_begin(grid_view<GRID,INSIDE_PRED, GT> const& g, cell_iterator<GRID,INSIDE_PRED, GT>)
00448 { return g.FirstCell();}
00449
00450 template<class GRID, class INSIDE_PRED, class GT>
00451 cell_iterator<GRID,INSIDE_PRED, GT>
00452 gral_end(grid_view<GRID,INSIDE_PRED, GT> const& g, cell_iterator<GRID,INSIDE_PRED, GT>)
00453 { return g.EndCell();}
00454
00455 template<class GRID, class INSIDE_PRED, class GT>
00456 typename grid_types<grid_view<GRID,INSIDE_PRED, GT> >::size_type
00457 gral_size(grid_view<GRID,INSIDE_PRED, GT> const& g, cell_iterator<GRID,INSIDE_PRED, GT>)
00458 { return g.NumOfCells();}
00459
00460
00461 template<class GRID, class INSIDE_PRED, class GT>
00462 vertex_on_cell_iterator<GRID,INSIDE_PRED, GT>
00463 gral_begin(cell<GRID,INSIDE_PRED, GT> const& c, vertex_on_cell_iterator<GRID,INSIDE_PRED, GT>)
00464 { return vertex_on_cell_iterator<GRID,INSIDE_PRED, GT>(c); }
00465
00466 template<class GRID, class INSIDE_PRED, class GT>
00467 vertex_on_cell_iterator<GRID,INSIDE_PRED, GT>
00468 gral_end (cell<GRID,INSIDE_PRED, GT> const& c, vertex_on_cell_iterator<GRID,INSIDE_PRED, GT>)
00469 { return vertex_on_cell_iterator<GRID,INSIDE_PRED, GT>(c, GrAL::end<typename gt::BaseVertex>(c.Base()));}
00470
00471 template<class GRID, class INSIDE_PRED, class GT>
00472 typename grid_types<grid_view<GRID,INSIDE_PRED, GT> >::size_type
00473 gral_size (cell<GRID,INSIDE_PRED, GT> const& c, vertex_on_cell_iterator<GRID,INSIDE_PRED, GT>)
00474 { return c.NumOfVertices();}
00475
00476 #undef gt
00477
00478 }
00479
00480 template<class GRID, class INSIDE_PRED, class GT, class T>
00481 class grid_function<restricted_grid_component_view::vertex<GRID,INSIDE_PRED,GT>, T>
00482 : public grid_function_hash<restricted_grid_component_view::vertex<GRID,INSIDE_PRED,GT>, T>
00483 {
00484 typedef grid_function_hash<restricted_grid_component_view::vertex<GRID,INSIDE_PRED,GT>, T> base;
00485 typedef restricted_grid_component_view::grid_view<GRID,INSIDE_PRED,GT> grid_type;
00486 public:
00487 grid_function() {}
00488 grid_function(grid_type const& g) : base(g) {}
00489 grid_function(grid_type const& g, T const& t) : base(g,t) {}
00490 };
00491
00492 template<class GRID, class INSIDE_PRED, class GT, class T>
00493 class grid_function<restricted_grid_component_view::cell<GRID,INSIDE_PRED,GT>, T>
00494 : public grid_function_hash<restricted_grid_component_view::cell<GRID,INSIDE_PRED,GT>, T>
00495 {
00496 typedef grid_function_hash<restricted_grid_component_view::cell<GRID,INSIDE_PRED,GT>, T> base;
00497 typedef restricted_grid_component_view::grid_view<GRID,INSIDE_PRED,GT> grid_type;
00498 public:
00499 grid_function() {}
00500 grid_function(grid_type const& g) : base(g) {}
00501 grid_function(grid_type const& g, T const& t) : base(g,t) {}
00502 };
00503
00504 }
00505
00506 #ifdef NMWR_INCLUDE_TEMPLATE_DEFS
00507 #include "restricted-component-view.C"
00508 #endif
00509
00510 #endif
00511