Dune Core Modules (2.6.0)

persistentcontainermap.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_PERSISTENTCONTAINERMAP_HH
4 #define DUNE_PERSISTENTCONTAINERMAP_HH
5 
6 #include <algorithm>
7 #include <cassert>
8 
9 #include <dune/common/hybridutilities.hh>
10 #include <dune/common/std/utility.hh>
13 
14 namespace Dune
15 {
16 
17  // PersistentContainerMap
18  // ----------------------
19 
21  template< class G, class IdSet, class Map >
23  {
25 
26  protected:
27  template< class reference, class iterator >
28  class IteratorWrapper;
29 
30  public:
31  typedef G Grid;
32 
33  typedef typename Map::mapped_type Value;
34  typedef typename Map::size_type Size;
35 
36  typedef IteratorWrapper< const Value, typename Map::const_iterator > ConstIterator;
37  typedef IteratorWrapper< Value, typename Map::iterator > Iterator;
38 
39  PersistentContainerMap ( const Grid &grid, int codim, const IdSet &idSet, const Value &value )
40  : grid_( &grid ),
41  codim_( codim ),
42  idSet_( &idSet ),
43  data_()
44  {
45  resize( value );
46  }
47 
48  template< class Entity >
49  const Value &operator[] ( const Entity &entity ) const
50  {
51  assert( Entity::codimension == codimension() );
52  typename Map::const_iterator pos = data_.find( idSet().id( entity ) );
53  assert( pos != data_.end() );
54  return pos->second;
55  }
56 
57  template< class Entity >
58  Value &operator[] ( const Entity &entity )
59  {
60  assert( Entity::codimension == codimension() );
61  typename Map::iterator pos = data_.find( idSet().id( entity ) );
62  assert( pos != data_.end() );
63  return pos->second;
64  }
65 
66  template< class Entity >
67  const Value &operator() ( const Entity &entity, int subEntity ) const
68  {
69  typename Map::const_iterator pos = data_.find( idSet().subId( entity, subEntity, codimension() ) );
70  assert( pos != data_.end() );
71  return pos->second;
72  }
73 
74  template< class Entity >
75  Value &operator() ( const Entity &entity, int subEntity )
76  {
77  typename Map::iterator pos = data_.find( idSet().subId( entity, subEntity, codimension() ) );
78  assert( pos != data_.end() );
79  return pos->second;
80  }
81 
82  Size size () const { return data_.size(); }
83 
84  void resize ( const Value &value = Value() )
85  {
86  Hybrid::forEach( Std::make_index_sequence< Grid::dimension+1 >{},
87  [ & ]( auto i ){ if( i == this->codimension() ) this->template resize< i >( value ); } );
88  }
89 
90  void shrinkToFit () {}
91 
92  void fill ( const Value &value ) { std::fill( begin(), end(), value ); }
93 
94  void swap ( This &other )
95  {
96  std::swap( grid_, other.grid_ );
97  std::swap( codim_, other.codim_ );
98  std::swap( idSet_, other.idSet_ );
99  std::swap( data_, other.data_ );
100  }
101 
102  ConstIterator begin () const;
103  Iterator begin ();
104 
105  ConstIterator end () const;
106  Iterator end ();
107 
108  int codimension () const { return codim_; }
109 
110  protected:
111  const Grid &grid () const { return *grid_; }
112 
113  template< int codim >
114  void resize ( const Value &value );
115 
116  template< int codim >
117  void migrateLevel ( int level, const Value &value, Map &data,
118  std::integral_constant< bool, true > );
119 
120  template< int codim >
121  void migrateLevel ( int level, const Value &value, Map &data,
122  std::integral_constant< bool, false > );
123 
124  static void migrateEntry ( const typename IdSet::IdType &id, const Value &value,
125  Map &oldData, Map &newData );
126 
127  const IdSet &idSet () const { return *idSet_; }
128 
129  const Grid *grid_;
130  int codim_;
131  const IdSet *idSet_;
132  Map data_;
133  };
134 
135 
136 
137  // PersistentContainerMap::IteratorWrapper
138  // ---------------------------------------
139 
140  template< class G, class IdSet, class Map >
141  template< class value, class iterator >
143  : public iterator
144  {
145  typedef IteratorWrapper< const value, typename Map::const_iterator > ConstWrapper;
146 
147  public:
148  IteratorWrapper ( const iterator &it ) : it_( it ) {}
149 
150  operator ConstWrapper () const { return ConstWrapper( it_ ); }
151 
152  value &operator* () { return it_->second; }
153  value *operator-> () { return &(it_->second); }
154 
155  bool operator== ( const IteratorWrapper &other ) const { return (it_ == other.it_); }
156  bool operator!= ( const IteratorWrapper &other ) const { return (it_ != other.it_); }
157 
158  IteratorWrapper &operator++ () { ++it_; return *this; }
159 
160  private:
161  iterator it_;
162  };
163 
164 
165 
166 
167  // Implementation of PersistentContainerMap
168  // ----------------------------------------
169 
170  template< class G, class IdSet, class Map >
171  inline typename PersistentContainerMap< G, IdSet, Map >::ConstIterator
172  PersistentContainerMap< G, IdSet, Map >::begin () const
173  {
174  return ConstIterator( data_.begin() );
175  }
176 
177  template< class G, class IdSet, class Map >
178  inline typename PersistentContainerMap< G, IdSet, Map >::Iterator
179  PersistentContainerMap< G, IdSet, Map >::begin ()
180  {
181  return Iterator( data_.begin() );
182  }
183 
184 
185  template< class G, class IdSet, class Map >
186  inline typename PersistentContainerMap< G, IdSet, Map >::ConstIterator
187  PersistentContainerMap< G, IdSet, Map >::end () const
188  {
189  return ConstIterator( data_.end() );
190  }
191 
192  template< class G, class IdSet, class Map >
193  inline typename PersistentContainerMap< G, IdSet, Map >::Iterator
194  PersistentContainerMap< G, IdSet, Map >::end ()
195  {
196  return Iterator( data_.end() );
197  }
198 
199 
200  template< class G, class IdSet, class Map >
201  template< int codim >
202  inline void PersistentContainerMap< G, IdSet, Map >::resize ( const Value &value )
203  {
204  std::integral_constant< bool, Capabilities::hasEntity< Grid, codim >::v > hasEntity;
205  assert( codim == codimension() );
206 
207  // create empty map and swap it with current map (no need to copy twice)
208  Map data;
209  std::swap( data, data_ );
210 
211  // copy all data from old map into new one (adding new entries, if necessary)
212  const int maxLevel = grid().maxLevel();
213  for ( int level = 0; level <= maxLevel; ++level )
214  migrateLevel< codim >( level, value, data, hasEntity );
215  }
216 
217 
218  template< class G, class IdSet, class Map >
219  template< int codim >
220  inline void PersistentContainerMap< G, IdSet, Map >
221  ::migrateLevel ( int level, const Value &value, Map &data,
222  std::integral_constant< bool, true > )
223  {
224  typedef typename Grid::LevelGridView LevelView;
225  typedef typename LevelView::template Codim< codim >::Iterator LevelIterator;
226 
227  const LevelView levelView = grid().levelGridView( level );
228  const LevelIterator end = levelView.template end< codim >();
229  for( LevelIterator it = levelView.template begin< codim >(); it != end; ++it )
230  migrateEntry( idSet().id( *it ), value, data, data_ );
231  }
232 
233 
234  template< class G, class IdSet, class Map >
235  template< int codim >
236  inline void PersistentContainerMap< G, IdSet, Map >
237  ::migrateLevel ( int level, const Value &value, Map &data,
238  std::integral_constant< bool, false > )
239  {
240  typedef typename Grid::LevelGridView LevelView;
241  typedef typename LevelView::template Codim< 0 >::Iterator LevelIterator;
242 
243  const LevelView levelView = grid().levelGridView( level );
244  const LevelIterator end = levelView.template end< 0 >();
245  for( LevelIterator it = levelView.template begin< 0 >(); it != end; ++it )
246  {
247  const typename LevelIterator::Entity &entity = *it;
248  const int subEntities = entity.subEntities( codim );
249  for( int i = 0; i < subEntities; ++i )
250  migrateEntry( idSet().subId( entity, i, codim ), value, data, data_ );
251  }
252  }
253 
254 
255  template< class G, class IdSet, class Map >
256  inline void PersistentContainerMap< G, IdSet, Map >
257  ::migrateEntry ( const typename IdSet::IdType &id, const Value &value,
258  Map &oldData, Map &newData )
259  {
260  // insert entry for id
261  const std::pair< typename Map::iterator, bool > inserted
262  = newData.insert( std::make_pair( id, value ) );
263 
264  // if entry did not exist previously, copy data
265  if( inserted.second )
266  {
267  const typename Map::iterator pos = oldData.find( id );
268  if( pos != oldData.end() )
269  {
270  inserted.first->second = pos->second;
271  oldData.erase( pos );
272  }
273  }
274  }
275 
276 } // namespace Dune
277 
278 #endif // #ifndef DUNE_PERSISTENTCONTAINERMAP_HH
Wrapper class for entities.
Definition: entity.hh:64
@ codimension
Know your own codimension.
Definition: entity.hh:105
GridFamily::Traits::LevelGridView LevelGridView
type of view for level grid
Definition: grid.hh:406
Id Set Interface.
Definition: indexidset.hh:441
IdTypeImp IdType
Type used to represent an id.
Definition: indexidset.hh:444
map-based implementation of the PersistentContainer
Definition: persistentcontainermap.hh:23
A set of traits classes to store static information about grid implementation.
constexpr void forEach(Range &&range, F &&f)
Range based for loop.
Definition: hybridutilities.hh:308
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition: iteratorfacades.hh:255
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:233
Dune namespace.
Definition: alignedallocator.hh:10
Traits for type conversions and type information.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 3, 22:32, 2024)