Dune Core Modules (2.5.0)

topologyfactory.hh
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3#ifndef DUNE_GEOMETRY_TOPOLOGYFACTORY_HH
4#define DUNE_GEOMETRY_TOPOLOGYFACTORY_HH
5
6#include <vector>
7#include <map>
8
10
11#include <dune/geometry/type.hh>
12
13namespace Dune
14{
15
34 template <class Traits>
36 {
37 // extract types from Traits class
38 static const unsigned int dimension = Traits::dimension;
39 typedef typename Traits::Key Key;
40 typedef typename Traits::Object Object;
41 typedef typename Traits::Factory Factory;
42
44 static Object *create ( const Dune::GeometryType &gt, const Key &key )
45 {
46 return Impl::IfTopology< Maker, dimension >::apply( gt.id(), key );
47 }
48
50 template< class Topology >
51 static Object *create ( const Key &key )
52 {
53 return Factory::template createObject< Topology >( key );
54 }
55
57 static void release( Object *object ) { delete object; }
58
59 private:
60 // Internal maker class used in ifTopology helper
61 template< class Topology >
62 struct Maker
63 {
64 static Object *apply ( const Key &key )
65 {
66 return create< Topology >( key );
67 };
68 };
69 };
70
71
72
77 template <class Factory>
79 {
80 static const unsigned int dimension = Factory::dimension;
81 typedef typename Factory::Key Key;
82 typedef const typename Factory::Object Object;
83
85 static Object *create ( const Dune::GeometryType &gt, const Key &key )
86 {
87 assert( gt.id() < numTopologies );
88 return instance().getObject( gt, key );
89 }
91 template< class Topology >
92 static Object *create ( const Key &key )
93 {
94 static_assert((Topology::dimension == dimension),
95 "Topology with incompatible dimension used");
96 return instance().template getObject< Topology >( key );
97 }
99 static void release ( Object *object )
100 {}
101 private:
102 static TopologySingletonFactory &instance ()
103 {
104 static TopologySingletonFactory instance;
105 return instance;
106 }
107
108 static const unsigned int numTopologies = (1 << dimension);
109 typedef std::array< Object *, numTopologies > Array;
110 typedef std::map< Key, Array > Storage;
111
112 TopologySingletonFactory ()
113 {}
114 ~TopologySingletonFactory ()
115 {
116 const typename Storage::iterator end = storage_.end();
117 for( typename Storage::iterator it = storage_.begin(); it != end; ++it )
118 {
119 for( unsigned int topologyId = 0; topologyId < numTopologies; ++topologyId )
120 {
121 Object *&object = it->second[ topologyId ];
122 if( object != 0 )
123 Factory::release( object );
124 object = 0;
125 }
126 }
127 }
128
129 Object *&find( const unsigned int topologyId, const Key &key )
130 {
131 typename Storage::iterator it = storage_.find( key );
132 if( it == storage_.end() )
133 it = storage_.insert( std::make_pair( key, fill_array<Object*, numTopologies>( nullptr ) ) ).first;
134 return it->second[ topologyId ];
135 }
136
137 Object *getObject ( const Dune::GeometryType &gt, const Key &key )
138 {
139 Object *&object = find( gt.id(), key );
140 if( object == 0 )
141 object = Factory::create( gt, key );
142 return object;
143 }
144
145 template< class Topology >
146 Object *getObject ( const Key &key )
147 {
148 Object *&object = find(Topology::id,key);
149 if( object == 0 )
150 object = Factory::template create< Topology >( key );
151 return object;
152 }
153 Storage storage_;
154 };
155
156}
157
158#endif // #ifndef DUNE_GEOMETRY_TOPOLOGYFACTORY_HH
Fallback implementation of the std::array class (a static array)
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:268
bool gt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first greater than second
Definition: float_cmp.cc:132
Dune namespace.
Definition: alignment.hh:11
Provide a factory over the generic topologies.
Definition: topologyfactory.hh:36
static Object * create(const Dune::GeometryType &gt, const Key &key)
dynamically create objects
Definition: topologyfactory.hh:44
static Object * create(const Key &key)
statically create objects
Definition: topologyfactory.hh:51
static void release(Object *object)
release the object returned by the create methods
Definition: topologyfactory.hh:57
A wrapper for a TopologyFactory providing singleton storage. Same usage as TopologyFactory but with e...
Definition: topologyfactory.hh:79
static Object * create(const Dune::GeometryType &gt, const Key &key)
dynamically create objects
Definition: topologyfactory.hh:85
static void release(Object *object)
release the object returned by the create methods
Definition: topologyfactory.hh:99
static Object * create(const Key &key)
statically create objects
Definition: topologyfactory.hh:92
A unique label for each type of element that can occur in a grid.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)