3#ifndef DUNE_PERSISTENTCONTAINERMAP_HH 
    4#define DUNE_PERSISTENTCONTAINERMAP_HH 
   20  template< 
class G, 
class IdSet, 
class Map >
 
   26    template< 
class reference, 
class iterator >
 
   27    class IteratorWrapper;
 
   35    typedef typename Map::mapped_type Value;
 
   36    typedef typename Map::size_type Size;
 
   38    typedef IteratorWrapper< const Value, typename Map::const_iterator > ConstIterator;
 
   39    typedef IteratorWrapper< Value, typename Map::iterator > Iterator;
 
   50    template< 
class Entity >
 
   51    const Value &operator[] ( 
const Entity &entity )
 const 
   54      typename Map::const_iterator pos = data_.find( idSet().
id( entity ) );
 
   55      assert( pos != data_.end() );
 
   59    template< 
class Entity >
 
   60    Value &operator[] ( 
const Entity &entity )
 
   63      typename Map::iterator pos = data_.find( idSet().
id( entity ) );
 
   64      assert( pos != data_.end() );
 
   68    template< 
class Entity >
 
   69    const Value &operator() ( 
const Entity &entity, 
int subEntity )
 const 
   71      typename Map::const_iterator pos = data_.find( idSet().subId( entity, subEntity, codimension() ) );
 
   72      assert( pos != data_.end() );
 
   76    template< 
class Entity >
 
   77    Value &operator() ( 
const Entity &entity, 
int subEntity )
 
   79      typename Map::iterator pos = data_.find( idSet().subId( entity, subEntity, codimension() ) );
 
   80      assert( pos != data_.end() );
 
   84    Size size ()
 const { 
return data_.size(); }
 
   86    void resize ( 
const Value &value = Value() )
 
   91    void shrinkToFit () {}
 
   93    void fill ( 
const Value &value ) { std::fill( begin(), end(), value ); }
 
   95    void swap ( 
This &other )
 
   97      std::swap( grid_, other.grid_ );
 
   98      std::swap( codim_, other.codim_ );
 
   99      std::swap( idSet_, other.idSet_ );
 
  100      std::swap( data_, other.data_ );
 
  103    ConstIterator begin () 
const;
 
  106    ConstIterator end () 
const;
 
  109    int codimension ()
 const { 
return codim_; }
 
  112    const Grid &grid ()
 const { 
return *grid_; }
 
  114    template< 
int codim >
 
  115    void resize ( 
const Value &value );
 
  117    template< 
int codim >
 
  118    void migrateLevel ( 
int level, 
const Value &value, Map &data,
 
  119                        integral_constant< bool, true > );
 
  121    template< 
int codim >
 
  122    void migrateLevel ( 
int level, 
const Value &value, Map &data,
 
  123                        integral_constant< bool, false > );
 
  125    static void migrateEntry ( 
const typename IdSet::IdType &
id, 
const Value &value,
 
  126                               Map &oldData, Map &newData );
 
  128    const IdSet &idSet ()
 const { 
return *idSet_; }
 
  141  template< 
class G, 
class IdSet, 
class Map >
 
  142  template< 
class value, 
class iterator >
 
  146    typedef IteratorWrapper< const value, typename Map::const_iterator > ConstWrapper;
 
  149    IteratorWrapper ( 
const iterator &it ) : it_( it ) {}
 
  151    operator ConstWrapper ()
 const { 
return ConstWrapper( it_ ); }
 
  153    value &operator* () { 
return it_->second; }
 
  154    value *operator-> () { 
return &(it_->second); }
 
  156    bool operator== ( 
const IteratorWrapper &other )
 const { 
return (it_ == other.it_); }
 
  157    bool operator!= ( 
const IteratorWrapper &other )
 const { 
return (it_ != other.it_); }
 
  159    IteratorWrapper &operator++ () { ++it_; 
return *
this; }
 
  170  template< 
class G, 
class IdSet, 
class Map >
 
  171  template< 
int codim >
 
  172  struct PersistentContainerMap< G, IdSet, Map >::Resize
 
  174    static void apply ( PersistentContainerMap< G, IdSet, Map > &container,
 
  177      if( codim == container.codimension() )
 
  178        container.template resize< codim >( value );
 
  187  template< 
class G, 
class IdSet, 
class Map >
 
  188  inline typename PersistentContainerMap< G, IdSet, Map >::ConstIterator
 
  189  PersistentContainerMap< G, IdSet, Map >::begin ()
 const 
  191    return ConstIterator( data_.begin() );
 
  194  template< 
class G, 
class IdSet, 
class Map >
 
  195  inline typename PersistentContainerMap< G, IdSet, Map >::Iterator
 
  196  PersistentContainerMap< G, IdSet, Map >::begin ()
 
  198    return Iterator( data_.begin() );
 
  202  template< 
class G, 
class IdSet, 
class Map >
 
  203  inline typename PersistentContainerMap< G, IdSet, Map >::ConstIterator
 
  204  PersistentContainerMap< G, IdSet, Map >::end ()
 const 
  206    return ConstIterator( data_.end() );
 
  209  template< 
class G, 
class IdSet, 
class Map >
 
  210  inline typename PersistentContainerMap< G, IdSet, Map >::Iterator
 
  211  PersistentContainerMap< G, IdSet, Map >::end ()
 
  213    return Iterator( data_.end() );
 
  217  template< 
class G, 
class IdSet, 
class Map >
 
  218  template< 
int codim >
 
  219  inline void PersistentContainerMap< G, IdSet, Map >::resize ( 
const Value &value )
 
  221    integral_constant< bool, Capabilities::hasEntity< Grid, codim >::v > hasEntity;
 
  222    assert( codim == codimension() );
 
  226    std::swap( data, data_ );
 
  229    const int maxLevel = grid().maxLevel();
 
  230    for ( 
int level = 0; level <= maxLevel; ++level )
 
  231      migrateLevel< codim >( level, value, data, hasEntity );
 
  235  template< 
class G, 
class IdSet, 
class Map >
 
  236  template< 
int codim >
 
  237  inline void PersistentContainerMap< G, IdSet, Map >
 
  238  ::migrateLevel ( 
int level, 
const Value &value, Map &data,
 
  239                   integral_constant< bool, true > )
 
  242    typedef typename LevelView::template Codim< codim >::Iterator LevelIterator;
 
  244    const LevelView levelView = grid().levelGridView( level );
 
  245    const LevelIterator end = levelView.template end< codim >();
 
  246    for( LevelIterator it = levelView.template begin< codim >(); it != end; ++it )
 
  247      migrateEntry( idSet().
id( *it ), value, data, data_ );
 
  251  template< 
class G, 
class IdSet, 
class Map >
 
  252  template< 
int codim >
 
  253  inline void PersistentContainerMap< G, IdSet, Map >
 
  254  ::migrateLevel ( 
int level, 
const Value &value, Map &data,
 
  255                   integral_constant< bool, false > )
 
  258    typedef typename LevelView::template Codim< 0 >::Iterator LevelIterator;
 
  260    const LevelView levelView = grid().levelGridView( level );
 
  261    const LevelIterator end = levelView.template end< 0 >();
 
  262    for( LevelIterator it = levelView.template begin< 0 >(); it != end; ++it )
 
  264      const typename LevelIterator::Entity &entity = *it;
 
  265      const int subEntities = entity.subEntities( codim );
 
  266      for( 
int i = 0; i < subEntities; ++i )
 
  267        migrateEntry( idSet().subId( entity, i, codim ), value, data, data_ );
 
  272  template< 
class G, 
class IdSet, 
class Map >
 
  273  inline void PersistentContainerMap< G, IdSet, Map >
 
  274  ::migrateEntry ( 
const typename IdSet::IdType &
id, 
const Value &value,
 
  275                   Map &oldData, Map &newData )
 
  278    const std::pair< typename Map::iterator, bool > inserted
 
  279      = newData.insert( std::make_pair( 
id, value ) );
 
  282    if( inserted.second )
 
  284      const typename Map::iterator pos = oldData.find( 
id );
 
  285      if( pos != oldData.end() )
 
  287        inserted.first->second = pos->second;
 
  288        oldData.erase( pos );
 
Wrapper class for entities.
Definition: entity.hh:62
 
@ codimension
Know your own codimension.
Definition: entity.hh:104
 
A static loop using TMP.
Definition: forloop.hh:110
 
Partition< All_Partition >::LevelGridView LevelGridView
View types for All_Partition.
Definition: grid.hh:428
 
Id Set Interface.
Definition: indexidset.hh:414
 
IdTypeImp IdType
Type used to represent an id.
Definition: indexidset.hh:417
 
map-based implementation of the PersistentContainer
Definition: persistentcontainermap.hh:22
 
A set of traits classes to store static information about grid implementation.
 
A static for loop for template meta-programming.
 
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:230
 
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:252
 
Dune namespace.
Definition: alignment.hh:10
 
Traits for type conversions and type information.