Dune Core Modules (2.9.0)

persistentcontainervector.hh
1 // SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
2 // SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
3 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
4 // vi: set et ts=4 sw=2 sts=2:
5 #ifndef DUNE_PERSISTENTCONTAINERVECTOR_HH
6 #define DUNE_PERSISTENTCONTAINERVECTOR_HH
7 
8 #include <algorithm>
9 #include <cassert>
10 
11 namespace Dune
12 {
13 
14  // PersistentContainerVector
15  // -------------------------
16 
49  template< class G, class IndexSet, class Vector >
51  {
53 
54  public:
55  typedef G Grid;
56 
57  typedef typename Vector::value_type Value;
58  typedef typename Vector::size_type Size;
59  typedef typename Vector::const_iterator ConstIterator;
60  typedef typename Vector::iterator Iterator;
61 
62  typedef typename Vector::allocator_type Allocator;
63 
64  PersistentContainerVector ( const IndexSet &indexSet, int codim, const Value &value,
65  const Allocator &allocator = Allocator() )
66  : codim_( codim ),
67  indexSet_( &indexSet ),
68  data_( indexSet.size( codim ), value, allocator )
69  {}
70 
71  template< class Entity >
72  const Value &operator[] ( const Entity &entity ) const
73  {
74  assert( Entity::codimension == codimension() );
75  const Size index = indexSet().index( entity );
76  assert( index < data_.size() );
77  return data_[ index ];
78  }
79 
80  template< class Entity >
81  Value &operator[] ( const Entity &entity )
82  {
83  assert( Entity::codimension == codimension() );
84  const Size index = indexSet().index( entity );
85  assert( index < data_.size() );
86  return data_[ index ];
87  }
88 
89  template< class Entity >
90  const Value &operator() ( const Entity &entity, int subEntity ) const
91  {
92  const Size index = indexSet().subIndex( entity, subEntity, codimension() );
93  assert( index < data_.size() );
94  return data_[ index ];
95  }
96 
97  template< class Entity >
98  Value &operator() ( const Entity &entity, int subEntity )
99  {
100  const Size index = indexSet().subIndex( entity, subEntity, codimension() );
101  assert( index < data_.size() );
102  return data_[ index ];
103  }
104 
105  Size size () const { return data_.size(); }
106 
107  void resize ( const Value &value = Value() )
108  {
109  const Size indexSetSize = indexSet().size( codimension() );
110  data_.resize( indexSetSize, value );
111  }
112 
113  void shrinkToFit () {}
114 
115  void fill ( const Value &value ) { std::fill( begin(), end(), value ); }
116 
117  void swap ( This &other )
118  {
119  std::swap( codim_, other.codim_ );
120  std::swap( indexSet_, other.indexSet_ );
121  std::swap( data_, other.data_ );
122  }
123 
124  ConstIterator begin () const { return data_.begin(); }
125  Iterator begin () { return data_.begin(); }
126 
127  ConstIterator end () const { return data_.end(); }
128  Iterator end () { return data_.end(); }
129 
130  int codimension () const { return codim_; }
131 
132  protected:
133  const IndexSet &indexSet () const { return *indexSet_; }
134 
135  int codim_;
136  const IndexSet *indexSet_;
137  Vector data_;
138  };
139 
140 } // namespace Dune
141 
142 #endif // #ifndef DUNE_PERSISTENTCONTAINERVECTOR_HH
Wrapper class for entities.
Definition: entity.hh:66
constexpr static int codimension
Know your own codimension.
Definition: entity.hh:106
Index Set Interface base class.
Definition: indexidset.hh:78
auto size(GeometryType type) const
Return total number of entities of given geometry type in entity set .
Definition: indexidset.hh:223
IndexType subIndex(const typename Traits::template Codim< cc >::Entity &e, int i, unsigned int codim) const
Map a subentity to an index.
Definition: indexidset.hh:153
IndexType index(const typename Traits::template Codim< cc >::Entity &e) const
Map entity to index. The result of calling this method with an entity that is not in the index set is...
Definition: indexidset.hh:113
vector-based implementation of the PersistentContainer
Definition: persistentcontainervector.hh:51
Dune namespace.
Definition: alignedallocator.hh:13
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (Apr 27, 22:29, 2024)