dune-fem 2.8.0
Loading...
Searching...
No Matches
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
12namespace 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 if (data_)
51 ++data_->second;
52 }
53
54 SharedGeometry ( This &&other )
55 : data_( other.data_ ), allocator_( std::move( other.allocator_ ) )
56 {
57 other.data_ = nullptr;
58 }
59
61 {
62 if( data_ && (--data_->second == 0) )
63 destroy();
64 }
65
66 This &operator= ( const This &other )
67 {
68 if( other.data_ )
69 ++other.data_->second;
70 if( data_ && (--data_->second == 0) )
71 destroy();
72 data_ = other.data_;
73 allocator_ = other.allocator_;
74 return *this;
75 }
76
77 This &operator= ( This &&other )
78 {
79 if( data_ && (--data_->second == 0) )
80 destroy();
81 data_ = other.data_;
82 allocator_ = std::move( other.allocator_ );
83 other.data_ = nullptr;
84 return *this;
85 }
86
87 operator bool () const { return static_cast< bool >( data_ ); }
88
89 bool affine () const { return impl().affine(); }
90 GeometryType type () const { return impl().type(); }
91
92 int corners () const { return impl().corners(); }
93 GlobalCoordinate corner ( int i ) const { return impl().corner( i ); }
94 GlobalCoordinate center () const { return impl().center(); }
95
96 GlobalCoordinate global ( const LocalCoordinate &local ) const { return impl().global( local ); }
97 LocalCoordinate local ( const GlobalCoordinate &global ) const { return impl().local( global ); }
98
99 ctype integrationElement ( const LocalCoordinate &local ) const { return impl().integrationElement( local ); }
100 ctype volume () const { return impl().volume(); }
101
102 JacobianTransposed jacobianTransposed ( const LocalCoordinate &local ) const { return impl().jacobianTransposed( local ); }
103 JacobianInverseTransposed jacobianInverseTransposed ( const LocalCoordinate &local ) const { return impl().jacobianInverseTransposed( local ); }
104
105 Allocator allocator () const { return allocator_; }
106
107 const Impl &impl () const { assert( data_ ); return data_->first; }
108 Impl &impl () { assert( data_ ); return data_->first; }
109
110 private:
111 template< class... Args >
112 Data *construct ( std::tuple< Args... > args )
113 {
114 Data *data = allocator_.allocate( 1 );
115 return new (data) Data( std::piecewise_construct, args, std::make_tuple( 1u ) );
116 }
117
118 void destroy ()
119 {
120 data_->~Data();
121 allocator_.deallocate( data_, 1 );
122 }
123
124 Data *data_ = nullptr;
125 typename std::allocator_traits< Allocator >::template rebind_alloc< Data > allocator_;
126 };
127
128} // namespace Dune
129
130#endif // #ifndef DUNE_FEM_GRIDPART_COMMON_SHAREDGEOMETRY_HH
STL namespace.
Definition: bindguard.hh:11
Definition: sharedgeometry.hh:20
Implementation::ctype ctype
Definition: sharedgeometry.hh:32
bool affine() const
Definition: sharedgeometry.hh:89
~SharedGeometry()
Definition: sharedgeometry.hh:60
SharedGeometry(const This &other)
Definition: sharedgeometry.hh:47
const Impl & impl() const
Definition: sharedgeometry.hh:107
GlobalCoordinate center() const
Definition: sharedgeometry.hh:94
GlobalCoordinate global(const LocalCoordinate &local) const
Definition: sharedgeometry.hh:96
SharedGeometry(This &&other)
Definition: sharedgeometry.hh:54
Alloc Allocator
Definition: sharedgeometry.hh:27
GlobalCoordinate corner(int i) const
Definition: sharedgeometry.hh:93
SharedGeometry(Args &&... args)
Definition: sharedgeometry.hh:43
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
Definition: sharedgeometry.hh:102
static const int coorddimension
Definition: sharedgeometry.hh:30
Impl & impl()
Definition: sharedgeometry.hh:108
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
Definition: sharedgeometry.hh:103
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
Implementation::GlobalCoordinate GlobalCoordinate
Definition: sharedgeometry.hh:35
Allocator allocator() const
Definition: sharedgeometry.hh:105
Implementation::JacobianInverseTransposed JacobianInverseTransposed
Definition: sharedgeometry.hh:38
ctype volume() const
Definition: sharedgeometry.hh:100
GeometryType type() const
Definition: sharedgeometry.hh:90
This & operator=(const This &other)
Definition: sharedgeometry.hh:66
int corners() const
Definition: sharedgeometry.hh:92
ctype integrationElement(const LocalCoordinate &local) const
Definition: sharedgeometry.hh:99