AMDiS 2.11-git
The Adaptive Multi-Dimensional Simulation Toolbox
 
Loading...
Searching...
No Matches
Concepts.hpp
1#pragma once
2
3#include <type_traits>
4
5#include <dune/common/typetree/childaccess.hh>
6#include <dune/common/typetree/nodeconcepts.hh>
7#include <dune/common/typetree/treepath.hh>
8
9#include <amdis/typetree/TreePath.hpp>
10#include <amdis/typetree/NodeTags.hpp>
11
12namespace AMDiS {
13namespace Traits {
14
15template <class Tree, class TreePath, class NodeTag = AMDiS::NodeTag_t<Tree>>
17
18// empty treepath
19template <class Tree, class NodeTag>
20struct IsValidTreePath<Tree, Dune::TypeTree::TreePath<>, NodeTag>
21 : std::true_type {};
22
23// leaf nodes
24template <class Tree, class I0, class... II>
25struct IsValidTreePath<Tree, Dune::TypeTree::TreePath<I0,II...>, AMDiS::LeafNodeTag>
26 : std::false_type {};
27
28// dynamic power nodes
29template <class Tree, class I0, class... II>
30struct IsValidTreePath<Tree, Dune::TypeTree::TreePath<I0,II...>, AMDiS::DynamicPowerNodeTag>
31 : IsValidTreePath<Dune::TypeTree::Child<Tree,0>, Dune::TypeTree::TreePath<II...>> {};
32
33// power nodes
34template <class Tree, class I0, class... II>
35struct IsValidTreePath<Tree, Dune::TypeTree::TreePath<I0,II...>, AMDiS::PowerNodeTag>
36 : IsValidTreePath<Dune::TypeTree::Child<Tree,0>, Dune::TypeTree::TreePath<II...>> {};
37
38// composite node with integer index
39template <class Tree, class I0, class... II>
40struct IsValidTreePath<Tree, Dune::TypeTree::TreePath<I0,II...>, AMDiS::CompositeNodeTag>
41 : std::false_type {};
42
43// composite node with integral-constant index
44template <class Tree, class Int, Int i, class... II>
45struct IsValidTreePath<Tree, Dune::TypeTree::TreePath<std::integral_constant<Int,i>,II...>, AMDiS::CompositeNodeTag>
46 : std::conditional_t<(i >= 0 && i < Int(Tree::degree())),
47 IsValidTreePath<typename Tree::template Child<(i >= 0 && i < Int(Tree::degree())) ? i : 0>::Type, Dune::TypeTree::TreePath<II...>>,
48 std::false_type> {};
49
50} // end namespace Traits
51
52
53namespace Concepts {
54
56template <class Tree, class Path>
57static constexpr bool ValidTreePath = Traits::IsValidTreePath<Tree,TYPEOF(makeTreePath(std::declval<Path>()))>::value;
58
59} // end namespace Concepts
60} // end namespace AMDiS
Definition NodeTags.hpp:12
Definition NodeTags.hpp:10
Definition NodeTags.hpp:9
Definition NodeTags.hpp:15
Definition NodeTags.hpp:11
Definition Concepts.hpp:16