1#ifndef DUNE_FEM_BASESETLOCALKEYSTORAGE_HH
2#define DUNE_FEM_BASESETLOCALKEYSTORAGE_HH
6#include <dune/common/exceptions.hh>
8#include <dune/geometry/type.hh>
9#include <dune/geometry/typeindex.hh>
24 template<
class Entry >
33 virtual ~FactoryIF () {}
34 virtual Entry* getObject(
const GeometryType& geomType )
const = 0;
35 virtual void removeObjects( std::vector<Entry*>& entryStorage )
const = 0;
36 virtual FactoryIF* clone()
const = 0;
40 template <
class SingletonProv
ider>
41 class FactoryImpl :
public FactoryIF
46 Entry* getObject(
const GeometryType& geomType )
const
48 return & SingletonProvider :: getObject( geomType );
51 void removeObjects( std::vector<Entry*>& entryStorage )
const
53 const size_t size = entryStorage.size();
54 for(
size_t i=0; i<size; ++i )
56 if( entryStorage[ i ] )
58 SingletonProvider :: removeObject( *(entryStorage[ i ]) );
59 entryStorage[ i ] = 0 ;
64 virtual FactoryIF* clone()
const {
return new FactoryImpl<SingletonProvider> (); }
68 const FactoryIF* factory_;
70 std::vector< Entry* > entryStorage_;
83 : factory_( other.factory_ ? other.factory_->clone() : 0 )
84 , entryStorage_( other.entryStorage_.size(), ( Entry * ) 0 )
87 const size_t size = entryStorage_.size();
88 for(
size_t i=0; i<size; ++i )
90 Entry* otherEntry = other.entryStorage_[ i ];
95 entryStorage_[ i ] = factory_->getObject( otherEntry->type() );
102 : factory_( other.factory_ ),
103 entryStorage_(
std::move( other.entryStorage_ ) )
105 other.factory_ =
nullptr;
106 other.entryStorage_.clear();
112 if( entryStorage_.size() > 0 )
114 factory_->removeObjects( entryStorage_ );
125 const size_t size = entryStorage_.size() ;
126 for(
size_t i=0; i<size; ++i)
128 if( entryStorage_[ i ] )
130 unsigned int enSize = entryStorage_[ i ]->size();
138 template <
class SingletonProv
ider>
139 bool insert(
const GeometryType geomType )
144 factory_ =
new FactoryImpl< SingletonProvider > ();
148 assert(
dynamic_cast< const FactoryImpl< SingletonProvider >*
> ( factory_ ) != 0 );
151 const size_t geomIndex =
index( geomType ) ;
153 if( entryStorage_.size() <= geomIndex )
154 entryStorage_.resize( geomIndex + 1, (Entry* ) 0 );
156 assert( geomIndex < entryStorage_.size() );
159 if( entryStorage_[ geomIndex ] == 0 )
161 entryStorage_[ geomIndex ] = factory_->getObject( geomType );
168 bool exists(
const GeometryType& geomType )
const
170 if(
index( geomType ) <
static_cast< int >( entryStorage_.size() ) )
171 return (entryStorage_[
index( geomType ) ] != 0) ;
180 assert(
index( geomType ) <
static_cast< int >( entryStorage_.size() ) );
181 assert( entryStorage_[
index( geomType ) ] != 0 );
182 return *( entryStorage_[
index( geomType ) ]);
185 int index(
const GeometryType& geomType )
const
187 return LocalGeometryTypeIndex::index( geomType );
195 template<
class CompiledLocalKey,
unsigned int minPolOrder,
unsigned int maxPolOrder >
236 const GeometryType& geometryType )
238 const size_t k = pOrd ;
243 CompiledLocalKeySingletonProviderType;
246 compiledLocalKeys[ k - minPolOrder ].template insert< CompiledLocalKeySingletonProviderType > ( geometryType );
258 template <
class Gr
idPart>
262 typedef typename GridPart :: IndexSetType IndexSetType ;
263 typedef typename GridPart :: GridType GridType ;
264 const IndexSetType &indexSet = gridPart.indexSet();
268 const std :: vector< GeometryType >& geometryTypes
272 for(
unsigned int i = 0; i < geometryTypes.size(); ++i )
287 assert( order - minPolOrder >= 0 );
double max(const Dune::Fem::Double &v, const double p)
Definition: double.hh:965
Definition: bindguard.hh:11
Definition: forloop.hh:17
default implementation uses method geomTypes of given index set. Used in DiscreteFunctionSpaces.
Definition: allgeomtypes.hh:99
const std ::vector< GeometryType > & geomTypes(unsigned int codim) const
returns vector with geometry tpyes this index set has indices for
Definition: allgeomtypes.hh:171
storage class for base function set pointer and compiled local key pointers
Definition: basesetlocalkeystorage.hh:26
int index(const GeometryType &geomType) const
Definition: basesetlocalkeystorage.hh:185
BaseSetLocalKeyStorage(BaseSetLocalKeyStorage &&other)
move constructor
Definition: basesetlocalkeystorage.hh:101
Entry value_type
Definition: basesetlocalkeystorage.hh:73
BaseSetLocalKeyStorage()
Definition: basesetlocalkeystorage.hh:76
BaseSetLocalKeyStorage(const BaseSetLocalKeyStorage &other)
copy constructor
Definition: basesetlocalkeystorage.hh:82
unsigned int maxSize() const
Definition: basesetlocalkeystorage.hh:122
bool insert(const GeometryType geomType)
insert entry to storage for given geometry type
Definition: basesetlocalkeystorage.hh:139
bool exists(const GeometryType &geomType) const
return true if an entry for this geometry type exists
Definition: basesetlocalkeystorage.hh:168
const Entry & operator[](const GeometryType &geomType) const
access to stored entry with given geometry type
Definition: basesetlocalkeystorage.hh:177
~BaseSetLocalKeyStorage()
destructor
Definition: basesetlocalkeystorage.hh:110
class for storage local keys for a given range of polynomial order and available geometry type
Definition: basesetlocalkeystorage.hh:197
LocalKeyVectorType compiledLocalKeys_
Definition: basesetlocalkeystorage.hh:252
CompiledLocalKeyContainer(const GridPart &gridPart)
Definition: basesetlocalkeystorage.hh:259
const CompiledLocalKeyType & compiledLocalKey(const GeometryType &type, const int order) const
provide access to the compiled local keys for a geometry type and polynomial order
Definition: basesetlocalkeystorage.hh:299
std::vector< LocalKeyStorageType > LocalKeyVectorType
Definition: basesetlocalkeystorage.hh:206
BaseSetLocalKeyStorage< CompiledLocalKeyType > LocalKeyStorageType
type of storage class for compiled local keys
Definition: basesetlocalkeystorage.hh:203
const LocalKeyStorageType & compiledLocalKeys(const int order) const
provide access to all compiled local keys for a given polynomial order
Definition: basesetlocalkeystorage.hh:285
@ numOrders
Definition: basesetlocalkeystorage.hh:209
CompiledLocalKey CompiledLocalKeyType
Definition: basesetlocalkeystorage.hh:200
Definition: basesetlocalkeystorage.hh:213
static void apply(LocalKeyVectorType &compiledLocalKeys, const GeometryType &geometryType)
Definition: basesetlocalkeystorage.hh:235
CompiledLocalKeyFactory method createObject and deleteObject for the SingletonList.
Definition: basesetlocalkeystorage.hh:220
static void deleteObject(CompiledLocalKeyType *obj)
delete BaseFunctionSet
Definition: basesetlocalkeystorage.hh:229
static CompiledLocalKeyType * createObject(const GeometryType &type)
create new BaseFunctionSet
Definition: basesetlocalkeystorage.hh:223
Singleton list for key/object pairs.
Definition: singletonlist.hh:53