1 #ifndef DUNE_POLYGONGRID_SUBENTITY_HH
2 #define DUNE_POLYGONGRID_SUBENTITY_HH
3 
4 #include <cassert>
5 
6 #include <dune/geometry/dimension.hh>
7 
8 #include <dune/polygongrid/meshobjects.hh>
9 
10 namespace Dune
11 {
12 
13   namespace __PolygonGrid
14   {
15 
16     // numSubEntities
17     // --------------
18 
19     template< class Item >
numSubEntities(Item item,Dune::Codim<0>)20     inline static std::size_t numSubEntities ( Item item, Dune::Codim< 0 > ) noexcept
21     {
22       return 1u;
23     }
24 
25     template< class ct >
numSubEntities(Node<ct> cell,Dune::Codim<1>)26     inline static std::size_t numSubEntities ( Node< ct > cell, Dune::Codim< 1 > ) noexcept
27     {
28       return cell.halfEdges().size();
29     }
30 
31     template< class ct >
numSubEntities(Node<ct> cell,Dune::Codim<2>)32     inline static std::size_t numSubEntities ( Node< ct > cell, Dune::Codim< 2 > ) noexcept
33     {
34       return cell.halfEdges().size();
35     }
36 
37     template< class ct >
numSubEntities(HalfEdge<ct> halfEdge,Dune::Codim<1>)38     inline static std::size_t numSubEntities ( HalfEdge< ct > halfEdge, Dune::Codim< 1 > ) noexcept
39     {
40       return 2u;
41     }
42 
43 
44 
45     // subEntity
46     // ---------
47 
48     template< class Item >
subEntity(Item item,Dune::Codim<0>,std::size_t i)49     inline static Item subEntity ( Item item, Dune::Codim< 0 >, std::size_t i ) noexcept
50     {
51       assert( i == 0u );
52       return item;
53     }
54 
55     template< class ct >
subEntity(Node<ct> cell,Dune::Codim<1>,std::size_t i)56     inline static HalfEdge< ct > subEntity ( Node< ct > cell, Dune::Codim< 1 >, std::size_t i ) noexcept
57     {
58       assert( i < cell.halfEdges().size() );
59       return cell.halfEdges().begin()[ i ];
60     }
61 
62     template< class ct >
subEntity(Node<ct> cell,Dune::Codim<2>,std::size_t i)63     inline static Node< ct > subEntity ( Node< ct > cell, Dune::Codim< 2 >, std::size_t i ) noexcept
64     {
65       assert( i < cell.halfEdges().size() );
66       return cell.halfEdges().begin()[ i ].target();
67     }
68 
69     template< class ct >
subEntity(HalfEdge<ct> halfEdge,Dune::Codim<1>,std::size_t i)70     inline static Node< ct > subEntity ( HalfEdge< ct > halfEdge, Dune::Codim< 1 >, std::size_t i ) noexcept
71     {
72       assert( i < 2u );
73       return (i == 1u ? halfEdge.target() : halfEdge.flip().target());
74     }
75 
76   } // namespace __PolygonGrid
77 
78 } // namespace Dune
79 
80 
81 #endif // #ifndef DUNE_POLYGONGRID_SUBENTITY_HH
82