dune-fem  2.8-git
sharedgeometry.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_GRIDPART_COMMON_SHAREDGEOMETRY_HH
2 #define DUNE_FEM_GRIDPART_COMMON_SHAREDGEOMETRY_HH
3 
4 #include <tuple>
5 #include <type_traits>
6 #include <utility>
7 
8 #include <dune/common/fmatrix.hh>
9 
10 #include <dune/grid/common/geometry.hh>
11 
12 namespace Dune
13 {
14 
15  // SharedGeometry
16  // --------------
17 
18  template< class Impl, class Alloc = std::allocator< Impl > >
20  {
22 
23  typedef std::pair< Impl, std::size_t > Data;
24 
25  public:
26  typedef Impl Implementation;
27  typedef Alloc Allocator;
28 
29  static const int mydimension = Implementation::mydimension;
30  static const int coorddimension = Implementation::coorddimension;
31 
32  typedef typename Implementation::ctype ctype;
33 
34  typedef typename Implementation::LocalCoordinate LocalCoordinate;
35  typedef typename Implementation::GlobalCoordinate GlobalCoordinate;
36 
37  typedef typename Implementation::JacobianTransposed JacobianTransposed;
38  typedef typename Implementation::JacobianInverseTransposed JacobianInverseTransposed;
39 
40  SharedGeometry () = default;
41 
42  template< class... Args, std::enable_if_t< std::is_constructible< Impl, Args &&... >::value, int > = 0 >
43  SharedGeometry ( Args &&... args )
44  : data_( construct( std::forward_as_tuple< Args... >( args... ) ) )
45  {}
46 
47  SharedGeometry ( const This &other )
48  : data_( other.data_ ), allocator_( other.allocator_ )
49  {
50  ++data_->second;
51  }
52 
53  SharedGeometry ( This &&other )
54  : data_( other.data_ ), allocator_( std::move( other.allocator_ ) )
55  {
56  other.data_ = nullptr;
57  }
58 
60  {
61  if( data_ && (--data_->second == 0) )
62  destroy();
63  }
64 
65  This &operator= ( const This &other )
66  {
67  if( other.data_ )
68  ++other.data_->second;
69  if( data_ && (--data_->second == 0) )
70  destroy();
71  data_ = other.data_;
72  allocator_ = other.allocator_;
73  return *this;
74  }
75 
76  This &operator= ( This &&other )
77  {
78  if( data_ && (--data_->second == 0) )
79  destroy();
80  data_ = other.data_;
81  allocator_ = std::move( other.allocator_ );
82  other.data_ = nullptr;
83  return *this;
84  }
85 
86  operator bool () const { return static_cast< bool >( data_ ); }
87 
88  bool affine () const { return impl().affine(); }
89  GeometryType type () const { return impl().type(); }
90 
91  int corners () const { return impl().corners(); }
92  GlobalCoordinate corner ( int i ) const { return impl().corner( i ); }
93  GlobalCoordinate center () const { return impl().center(); }
94 
95  GlobalCoordinate global ( const LocalCoordinate &local ) const { return impl().global( local ); }
96  LocalCoordinate local ( const GlobalCoordinate &global ) const { return impl().local( global ); }
97 
98  ctype integrationElement ( const LocalCoordinate &local ) const { return impl().integrationElement( local ); }
99  ctype volume () const { return impl().volume(); }
100 
101  JacobianTransposed jacobianTransposed ( const LocalCoordinate &local ) const { return impl().jacobianTransposed( local ); }
102  JacobianInverseTransposed jacobianInverseTransposed ( const LocalCoordinate &local ) const { return impl().jacobianInverseTransposed( local ); }
103 
104  Allocator allocator () const { return allocator_; }
105 
106  const Impl &impl () const { assert( data_ ); return data_->first; }
107  Impl &impl () { assert( data_ ); return data_->first; }
108 
109  private:
110  template< class... Args >
111  Data *construct ( std::tuple< Args... > args )
112  {
113  Data *data = allocator_.allocate( 1 );
114  return new (data) Data( std::piecewise_construct, args, std::make_tuple( 1u ) );
115  }
116 
117  void destroy ()
118  {
119  data_->~Data();
120  allocator_.deallocate( data_, 1 );
121  }
122 
123  Data *data_ = nullptr;
124  typename std::allocator_traits< Allocator >::template rebind_alloc< Data > allocator_;
125  };
126 
127 } // namespace Dune
128 
129 #endif // #ifndef DUNE_FEM_GRIDPART_COMMON_SHAREDGEOMETRY_HH
Definition: bindguard.hh:11
Definition: sharedgeometry.hh:20
Implementation::ctype ctype
Definition: sharedgeometry.hh:32
This & operator=(const This &other)
Definition: sharedgeometry.hh:65
bool affine() const
Definition: sharedgeometry.hh:88
~SharedGeometry()
Definition: sharedgeometry.hh:59
SharedGeometry(const This &other)
Definition: sharedgeometry.hh:47
GlobalCoordinate center() const
Definition: sharedgeometry.hh:93
GlobalCoordinate global(const LocalCoordinate &local) const
Definition: sharedgeometry.hh:95
SharedGeometry(This &&other)
Definition: sharedgeometry.hh:53
Alloc Allocator
Definition: sharedgeometry.hh:27
GlobalCoordinate corner(int i) const
Definition: sharedgeometry.hh:92
SharedGeometry(Args &&... args)
Definition: sharedgeometry.hh:43
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
Definition: sharedgeometry.hh:101
static const int coorddimension
Definition: sharedgeometry.hh:30
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
Definition: sharedgeometry.hh:102
Implementation::JacobianTransposed JacobianTransposed
Definition: sharedgeometry.hh:37
Implementation::LocalCoordinate LocalCoordinate
Definition: sharedgeometry.hh:34
static const int mydimension
Definition: sharedgeometry.hh:29
Impl Implementation
Definition: sharedgeometry.hh:26
SharedGeometry()=default
const Impl & impl() const
Definition: sharedgeometry.hh:106
Impl & impl()
Definition: sharedgeometry.hh:107
Implementation::GlobalCoordinate GlobalCoordinate
Definition: sharedgeometry.hh:35
Allocator allocator() const
Definition: sharedgeometry.hh:104
Implementation::JacobianInverseTransposed JacobianInverseTransposed
Definition: sharedgeometry.hh:38
ctype volume() const
Definition: sharedgeometry.hh:99
GeometryType type() const
Definition: sharedgeometry.hh:89
int corners() const
Definition: sharedgeometry.hh:91
ctype integrationElement(const LocalCoordinate &local) const
Definition: sharedgeometry.hh:98