dune-typetree 3.0-dev
simpletransformationdescriptors.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3
4#ifndef DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
5#define DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
6
7#include <array>
8#include <memory>
9
12#include <dune/common/exceptions.hh>
13
14
15namespace Dune {
16 namespace TypeTree {
17
23 template<typename SourceNode, typename Transformation, typename TransformedNode>
25 {
26
27 static const bool recursive = false;
28
29 typedef TransformedNode transformed_type;
30 typedef std::shared_ptr<transformed_type> transformed_storage_type;
31
32 static transformed_type transform(const SourceNode& s, const Transformation& t)
33 {
34 return transformed_type();
35 }
36
37 static transformed_storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t)
38 {
39 return std::make_shared<transformed_type>();
40 }
41
42 };
43
44
45 template<typename SourceNode, typename Transformation, template<typename Child, std::size_t> class TransformedNode>
47 {
48
49 static const bool recursive = true;
50
51 template<typename TC>
52 struct result
53 {
54 typedef TransformedNode<TC, StaticDegree<SourceNode>::value> type;
55 typedef std::shared_ptr<type> storage_type;
56 static const std::size_t degree = StaticDegree<type>::value;
57 };
58
59 template<typename TC>
60 static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
61 {
62 return typename result<TC>::type(children);
63 }
64
65 template<typename TC>
66 static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
67 {
68 return std::make_shared<typename result<TC>::type>(children);
69 }
70
71 };
72
73
74 template<typename SourceNode, typename Transformation, template<typename...> class TransformedNode>
76 {
77
78 static const bool recursive = true;
79
80 template<typename... TC>
81 struct result
82 {
83 typedef TransformedNode<TC...> type;
84 typedef std::shared_ptr<type> storage_type;
85 };
86
87 template<typename... TC>
88 static typename result<TC...>::type transform(const SourceNode& s, const Transformation& t, std::shared_ptr<TC>... children)
89 {
90 return typename result<TC...>::type(children...);
91 }
92
93 template<typename... TC>
94 static typename result<TC...>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, std::shared_ptr<TC>... children)
95 {
96 return std::make_shared<typename result<TC...>::type>(children...);
97 }
98
99 };
100
102
103 } // namespace TypeTree
104} //namespace Dune
105
106#endif // DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
std::integral_constant< std::size_t, degree(static_cast< std::decay_t< Node > * >(nullptr), NodeTag< std::decay_t< Node > >()) > StaticDegree
Returns the statically known degree of the given Node type as a std::integral_constant.
Definition nodeinterface.hh:105
Definition accumulate_static.hh:13
Definition simpletransformationdescriptors.hh:25
static transformed_type transform(const SourceNode &s, const Transformation &t)
Definition simpletransformationdescriptors.hh:32
static const bool recursive
Definition simpletransformationdescriptors.hh:27
std::shared_ptr< transformed_type > transformed_storage_type
Definition simpletransformationdescriptors.hh:30
static transformed_storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t)
Definition simpletransformationdescriptors.hh:37
TransformedNode transformed_type
Definition simpletransformationdescriptors.hh:29
Definition simpletransformationdescriptors.hh:47
static result< TC >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
Definition simpletransformationdescriptors.hh:66
static const bool recursive
Definition simpletransformationdescriptors.hh:49
static result< TC >::type transform(const SourceNode &s, const Transformation &t, const std::array< std::shared_ptr< TC >, result< TC >::degree > &children)
Definition simpletransformationdescriptors.hh:60
Definition simpletransformationdescriptors.hh:53
TransformedNode< TC, StaticDegree< SourceNode >::value > type
Definition simpletransformationdescriptors.hh:54
static const std::size_t degree
Definition simpletransformationdescriptors.hh:56
std::shared_ptr< type > storage_type
Definition simpletransformationdescriptors.hh:55
Definition simpletransformationdescriptors.hh:76
static const bool recursive
Definition simpletransformationdescriptors.hh:78
static result< TC... >::storage_type transform_storage(std::shared_ptr< const SourceNode > s, const Transformation &t, std::shared_ptr< TC >... children)
Definition simpletransformationdescriptors.hh:94
static result< TC... >::type transform(const SourceNode &s, const Transformation &t, std::shared_ptr< TC >... children)
Definition simpletransformationdescriptors.hh:88
Definition simpletransformationdescriptors.hh:82
std::shared_ptr< type > storage_type
Definition simpletransformationdescriptors.hh:84
TransformedNode< TC... > type
Definition simpletransformationdescriptors.hh:83