1 #ifndef DUNE_FEM_OPERATOR_MATRIX_FUNCTOR_HH
2 #define DUNE_FEM_OPERATOR_MATRIX_FUNCTOR_HH
3 
4 #include <utility>
5 
6 
7 namespace Dune
8 {
9 
10   namespace Fem
11   {
12 
13     // IndexFunctor
14     // ------------
15 
16     template< class Functor, class LocalIndex, class GlobalIndex >
17     struct IndexFunctor
18     {
IndexFunctorDune::Fem::IndexFunctor19       constexpr IndexFunctor ( Functor functor, const LocalIndex &localIndex, const GlobalIndex &globalIndex )
20         : functor_( functor ),
21           localIndex_( localIndex ),
22           globalIndex_( globalIndex )
23       {}
24 
25       template< class LocalKey, class GlobalKey >
operator ()Dune::Fem::IndexFunctor26       void operator() ( const LocalKey localKey, const GlobalKey &globalKey ) const
27       {
28         functor_( std::make_pair( localIndex_, localKey ), std::make_pair( globalIndex_, globalKey ) );
29       }
30 
31     private:
32       Functor functor_;
33       LocalIndex localIndex_;
34       GlobalIndex globalIndex_;
35     };
36 
37 
38     // PairFunctor
39     // -----------
40 
41     template< class Mapper, class Entity, class Functor >
42     struct PairFunctor
43     {
PairFunctorDune::Fem::PairFunctor44       PairFunctor ( const Mapper &mapper, const Entity &entity, Functor functor )
45         : mapper_( mapper ), entity_( entity ), functor_( std::move( functor ) )
46       {}
47 
48       template< class LocalKey, class GlobalKey >
operator ()Dune::Fem::PairFunctor49       void operator() ( const LocalKey &localKey, const GlobalKey &globalKey ) const
50       {
51         mapper_.mapEach( entity_, IndexFunctor< Functor, LocalKey, GlobalKey >( functor_, localKey, globalKey ) );
52       }
53 
54     private:
55       const Mapper &mapper_;
56       const Entity &entity_;
57       Functor functor_;
58     };
59 
60 
61     // makeRowFunctor
62     // --------------
63 
64     template< class Mapper, class Entity, class Functor >
makePairFunctor(const Mapper & mapper,const Entity & entity,Functor functor)65     PairFunctor< Mapper, Entity, Functor > makePairFunctor ( const Mapper &mapper, const Entity &entity, Functor functor )
66     {
67       return PairFunctor< Mapper, Entity, Functor >( mapper, entity, std::move( functor ) );
68     }
69 
70   } // namespace Fem
71 
72 } // namespace Dune
73 
74 #endif // #ifndef DUNE_FEM_OPERATOR_MATRIX_FUNCTOR_HH
75