1 #ifndef DUNE_GEOMETRY_GENERICGEOMETRY_TRACEPROVIDER_HH
2 #define DUNE_GEOMETRY_GENERICGEOMETRY_TRACEPROVIDER_HH
4 #include <dune/common/forloop.hh>
5 #include <dune/common/typetraits.hh>
13 namespace GenericGeometry
19 template<
class Topology,
class GeometryTraits >
20 class NonHybridMapping;
22 template<
unsigned int dim,
class GeometryTraits >
25 template<
class Topology,
class GeometryTraits >
33 template<
class Topology,
class GeometryTraits,
unsigned int codim,
bool forceHybr
id >
41 static const unsigned int dimension = Topology::dimension;
50 static const unsigned int numSubTopologies = Mapping::ReferenceElement::template Codim< codimension >::size;
52 template<
bool >
class HybridFactory;
53 template<
bool >
class NonHybridFactory;
55 typedef typename SelectType< hybrid, HybridFactory< true >, NonHybridFactory< false > >::Type Factory;
57 template<
int i >
struct Builder;
60 typedef typename Factory::Trace
Trace;
64 return (*instance().construct_[ i ])( mapping, traceStorage );
68 typedef Trace *(*Construct) (
const Mapping &mapping,
char *traceStorage );
72 ForLoop< Builder, 0, numSubTopologies-1 >::apply( construct_ );
75 static const This &instance ()
77 static This theInstance;
81 Construct construct_[ numSubTopologies ];
89 template<
class Topology,
class GeometryTraits,
unsigned int codim,
bool forceHybr
id >
91 class TraceProvider< Topology, GeometryTraits, codim, forceHybrid >::HybridFactory
93 template<
unsigned int i >
96 typedef typename GenericGeometry::SubTopology< Topology, codim, i >::type SubTopology;
97 typedef VirtualMapping< SubTopology, GeometryTraits > type;
101 typedef HybridMapping< mydimension, GeometryTraits >
Trace;
106 typedef typename VirtualTrace< i >::type TraceImpl;
107 return new( traceStorage ) TraceImpl( mapping.template trace< codim, i >() );
116 template<
class Topology,
class GeometryTraits,
unsigned int codim,
bool forceHybr
id >
118 class TraceProvider< Topology, GeometryTraits, codim, forceHybrid >::NonHybridFactory
120 typedef typename GenericGeometry::SubTopology< Topology, codim, 0 >::type SubTopology;
123 typedef NonHybridMapping< SubTopology, GeometryTraits >
Trace;
128 return new( traceStorage )
Trace( mapping.template trace< codim, i >() );
137 template<
class Topology,
class GeometryTraits,
unsigned int codim,
bool forceHybr
id >
139 struct TraceProvider< Topology, GeometryTraits, codim, forceHybrid >::Builder
141 static void apply ( Construct (&
construct)[ numSubTopologies ] )
143 construct[ i ] = &(Factory::template construct< i >);
151 #endif // #ifndef DUNE_GEOMETRY_GENERICGEOMETRY_TRACEPROVIDER_HH