1 #ifndef DUNE_IDGRID_DATAHANDLE_HH
2 #define DUNE_IDGRID_DATAHANDLE_HH
3 
4 //- C++ include
5 #include <type_traits>
6 
7 //- dune-grid includes
8 #include <dune/grid/common/datahandleif.hh>
9 
10 #if HAVE_DUNE_ALUGRID
11 #include <dune/alugrid/common/ldbhandleif.hh>
12 #endif
13 
14 namespace Dune
15 {
16 
17   // IdDataHandle
18   // ------------
19 
20   template< class WrappedHandle, class GridFamily >
21   class IdDataHandle
22     : public CommDataHandleIF< IdDataHandle< WrappedHandle, GridFamily >, typename WrappedHandle::DataType >
23   {
24   protected:
25     typedef IdDataHandle< WrappedHandle, GridFamily > ThisType;
26 
27     // type of traits
28     typedef typename std::remove_const< GridFamily >::type::Traits Traits;
29 
30     typedef typename Traits :: ExtraData ExtraData ;
31 
32     template< int codim >
33     struct Codim
34     {
35       // type of entity
36       typedef typename Traits::template Codim< codim >::Entity EntityType;
37     };
38 
39   public:
40     // type of data to be communicated
41     typedef typename WrappedHandle::DataType DataType;
42 
43     typedef CommDataHandleIF< ThisType, DataType > DataHandleIFType;
44 
45     IdDataHandle ( const ThisType & ) = delete;
46 
IdDataHandle(ExtraData data,WrappedHandle & wrappedHandle)47     IdDataHandle ( ExtraData data, WrappedHandle &wrappedHandle )
48     : wrappedHandle_( wrappedHandle ),
49       data_( data )
50     {}
51 
contains(int dim,int codim) const52     bool contains ( int dim, int codim ) const
53     {
54       return wrappedHandle_.contains( dim, codim );
55     }
56 
fixedSize(int dim,int codim) const57     bool fixedSize ( int dim, int codim ) const
58     {
59       return wrappedHandle_.fixedSize( dim, codim );
60     }
61 
62     template< class HostEntity >
size(const HostEntity & hostEntity) const63     size_t size ( const HostEntity &hostEntity ) const
64     {
65       typedef typename Codim< HostEntity::codimension >::EntityType EntityType;
66       const EntityType entity( typename EntityType::Implementation( data(), hostEntity ) );
67       return wrappedHandle_.size( entity );
68     }
69 
70     template< class MessageBuffer, class HostEntity >
gather(MessageBuffer & buffer,const HostEntity & hostEntity) const71     void gather ( MessageBuffer &buffer, const HostEntity &hostEntity ) const
72     {
73       typedef typename Codim< HostEntity::codimension >::EntityType EntityType;
74       const EntityType entity( typename EntityType::Implementation( data(), hostEntity ) );
75       wrappedHandle_.gather( buffer, entity );
76     }
77 
78     template< class MessageBuffer, class HostEntity >
scatter(MessageBuffer & buffer,const HostEntity & hostEntity,size_t size)79     void scatter ( MessageBuffer &buffer, const HostEntity &hostEntity, size_t size )
80     {
81       typedef typename Codim< HostEntity::codimension >::EntityType EntityType;
82       const EntityType entity( typename EntityType::Implementation( data(), hostEntity ) );
83       wrappedHandle_.scatter( buffer, entity, size );
84     }
85 
data() const86     ExtraData data() const { return data_; }
87 
88   protected:
89     WrappedHandle &wrappedHandle_;
90     ExtraData data_;
91   };
92 
93 } // namespace Dune
94 
95 #endif // #ifndef DUNE_IDGRID_DATAHANDLE_HH
96