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
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 ++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
STL namespace.
Definition: bindguard.hh:11
Definition: sharedgeometry.hh:20
Implementation::ctype ctype
Definition: sharedgeometry.hh:32
bool affine() const
Definition: sharedgeometry.hh:88
~SharedGeometry()
Definition: sharedgeometry.hh:59
SharedGeometry(const This &other)
Definition: sharedgeometry.hh:47
const Impl & impl() const
Definition: sharedgeometry.hh:106
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
Impl & impl()
Definition: sharedgeometry.hh:107
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
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
This & operator=(const This &other)
Definition: sharedgeometry.hh:65
int corners() const
Definition: sharedgeometry.hh:91
ctype integrationElement(const LocalCoordinate &local) const
Definition: sharedgeometry.hh:98