4#ifndef DUNE_TYPETREE_TREEPATH_HH
5#define DUNE_TYPETREE_TREEPATH_HH
10#include <dune/common/documentation.hh>
11#include <dune/common/typetraits.hh>
12#include <dune/common/indices.hh>
13#include <dune/common/hybridutilities.hh>
22 template<
typename... T>
29 namespace TreePathType {
36 template<
typename,std::
size_t>
39 template<
typename,std::
size_t>
48 template<
typename, std::size_t...>
54 template<
typename,
typename>
57 template<std::size_t... i>
61 template<std::size_t k, std::size_t... i>
77 template<
typename... T>
102 template<
typename... U,
typename std::enable_if<(
sizeof...(T) > 0 &&
sizeof...(U) ==
sizeof...(T)),
bool>::type =
true>
114 constexpr static std::size_t
size()
120 template<std::
size_t i>
123 return std::get<i>(_data);
129 std::size_t entry = 0;
130 Dune::Hybrid::forEach(
enumerate(), [&] (
auto i) {
138 template<std::
size_t i>
139 constexpr auto element(Dune::index_constant<i> pos = {})
const
141 return std::get<i>(_data);
145 constexpr std::size_t
element(std::size_t pos)
const
147 std::size_t entry = 0;
148 Dune::Hybrid::forEach(
enumerate(), [&] (
auto i) {
158 return std::get<
sizeof...(T)-1>(_data);
166 using Data = std::tuple<T...>;
179 template<
typename... T>
190 template<
typename... T>
198 template<
typename... T>
221 template<std::size_t i,
typename... T>
223 ->
typename std::decay<
decltype(std::get<i>(tp._data))>::type
225 return std::get<i>(tp._data);
244 template<std::size_t i,
typename... T>
247 return std::get<i>(tp._data);
256 template<
typename... T,
typename std::enable_if<(
sizeof...(T) > 0),
bool>::type =
true>
269 template<
typename... T>
271 ->
decltype(treePathEntry<0>(tp))
273 return treePathEntry<0>(tp);
280 template<
typename... T>
283 return HybridTreePath<T...,std::size_t>(std::tuple_cat(tp._data,std::make_tuple(i)));
301 template<std::size_t i,
typename... T>
304 return HybridTreePath<T...,index_constant<i> >(std::tuple_cat(tp._data,std::make_tuple(i_)));
311 template<
typename... T>
314 return HybridTreePath<std::size_t,T...>(std::tuple_cat(std::make_tuple(element),tp._data));
332 template<std::size_t i,
typename... T>
335 return HybridTreePath<index_constant<i>,T...>(std::tuple_cat(std::make_tuple(_i),tp._data));
342 template <
class... T>
345 static_assert(
sizeof...(T) != 0,
"HybridTreePath must not be empty");
346 return unpackIntegerSequence([&](
auto... i){
347 return HybridTreePath{std::make_tuple(std::get<i+1>(tp._data)...)};
348 }, std::make_index_sequence<(
sizeof...(T) - 1)>{});
355 template <
class... T>
358 static_assert(
sizeof...(T) != 0,
"HybridTreePath must not be empty");
359 return unpackIntegerSequence([&](
auto... i){
361 }, std::make_index_sequence<(
sizeof...(T) - 1)>{});
373 template <
class... S,
class... T>
378 if constexpr (
sizeof...(S) ==
sizeof...(T)) {
379 if constexpr ((Dune::IsInteroperable<S,T>::value &&...)) {
380 return unpackIntegerSequence([&](
auto... i){
381 return ((std::get<i>(lhs._data) == std::get<i>(rhs._data)) &&...);
382 }, std::make_index_sequence<(
sizeof...(S))>{});
397 template <
class S, S... lhs,
class T, T... rhs>
407 template <
class... S,
class... T>
412 return !(lhs == rhs);
416 template <
class S, S... lhs,
class T, T... rhs>
424 template<std::size_t... i>
426 :
public index_constant<sizeof...(i)>
430 template<std::size_t k, std::size_t... i>
436 template<std::size_t k, std::size_t... i>
442 template<std::
size_t k>
444 :
public index_constant<k>
447 template<std::size_t j, std::size_t k, std::size_t... l>
449 :
public TreePathBack<HybridTreePath<index_constant<k>,index_constant<l>...>>
452 template<std::size_t k, std::size_t... i>
454 :
public index_constant<k>
457 template<std::size_t k, std::size_t... i>
463 template<std::size_t j,
468 :
public TreePathPopBack<HybridTreePath<index_constant<k>,index_constant<l>...>,i...,j>
471 template<std::size_t k, std::size_t... i>
477 template<std::size_t... i, std::size_t... k>
488 template<std::size_t i,
typename... T>
489 typename std::enable_if<
496 template<std::size_t i,
typename... T>
497 typename std::enable_if<
500 print_hybrid_tree_path(std::ostream& os,
const HybridTreePath<T...>& tp, index_constant<i> _i)
503 print_hybrid_tree_path(os,tp,index_constant<i+1>{});
511 template<
typename... T>
514 os <<
"HybridTreePath< ";
515 impl::print_hybrid_tree_path(os, tp, index_constant<0>{});
520 template<std::size_t... i>
523 template<std::size_t... i>
constexpr HybridTreePath< T..., std::size_t > push_back(const HybridTreePath< T... > &tp, std::size_t i)
Appends a run time index to a HybridTreePath.
Definition: treepath.hh:281
constexpr auto pop_front(const HybridTreePath< T... > &tp)
Removes first index on a HybridTreePath.
Definition: treepath.hh:343
std::ostream & operator<<(std::ostream &os, const HybridTreePath< T... > &tp)
Dumps a HybridTreePath to a stream.
Definition: treepath.hh:512
constexpr auto back(const HybridTreePath< T... > &tp) -> decltype(treePathEntry< sizeof...(T) -1 >(tp))
Returns a copy of the last element of the HybridTreePath.
Definition: treepath.hh:257
constexpr std::size_t treePathSize(const HybridTreePath< T... > &)
Returns the size (number of components) of the given HybridTreePath.
Definition: treepath.hh:199
constexpr HybridTreePath< std::size_t, T... > push_front(const HybridTreePath< T... > &tp, std::size_t element)
Prepends a run time index to a HybridTreePath.
Definition: treepath.hh:312
constexpr HybridTreePath< T... > hybridTreePath(const T &... t)
Constructs a new HybridTreePath from the given indices.
Definition: treepath.hh:180
constexpr auto front(const HybridTreePath< T... > &tp) -> decltype(treePathEntry< 0 >(tp))
Returns a copy of the first element of the HybridTreePath.
Definition: treepath.hh:270
constexpr auto treePathEntry(const HybridTreePath< T... > &tp, index_constant< i >={}) -> typename std::decay< decltype(std::get< i >(tp._data))>::type
Returns a copy of the i-th element of the HybridTreePath.
Definition: treepath.hh:222
constexpr auto operator!=(const HybridTreePath< S... > &lhs, const HybridTreePath< T... > &rhs)
Compare two HybridTreePaths for unequality.
Definition: treepath.hh:408
constexpr std::size_t treePathIndex(const HybridTreePath< T... > &tp, index_constant< i >={})
Returns the index value of the i-th element of the HybridTreePath.
Definition: treepath.hh:245
constexpr auto pop_back(const HybridTreePath< T... > &tp)
Removes last index on a HybridTreePath.
Definition: treepath.hh:356
constexpr HybridTreePath< T... > treePath(const T &... t)
Constructs a new HybridTreePath from the given indices.
Definition: treepath.hh:191
constexpr bool operator==(const HybridTreePath< S... > &lhs, const HybridTreePath< T... > &rhs)
Compare two HybridTreePaths for value equality.
Definition: treepath.hh:374
void print_tree_path(std::ostream &os)
Definition: treepath.hh:58
Definition: accumulate_static.hh:13
Type
Definition: treepath.hh:30
@ fullyStatic
Definition: treepath.hh:30
@ dynamic
Definition: treepath.hh:30
A hybrid version of TreePath that supports both compile time and run time indices.
Definition: treepath.hh:79
constexpr HybridTreePath(HybridTreePath &&tp)=default
constexpr HybridTreePath & operator=(const HybridTreePath &tp)=default
constexpr std::size_t element(std::size_t pos) const
Get the index value at position pos.
Definition: treepath.hh:145
constexpr HybridTreePath(std::tuple< T... > t)
Constructor from a std::tuple
Definition: treepath.hh:97
constexpr HybridTreePath & operator=(HybridTreePath &&tp)=default
constexpr HybridTreePath(U... t)
Constructor from arguments.
Definition: treepath.hh:103
constexpr HybridTreePath()
Default constructor.
Definition: treepath.hh:87
static constexpr std::size_t size()
Get the size (length) of this path.
Definition: treepath.hh:114
constexpr auto operator[](Dune::index_constant< i >) const
Get the index value at position pos.
Definition: treepath.hh:121
constexpr auto element(Dune::index_constant< i > pos={}) const
Get the last index value.
Definition: treepath.hh:139
static constexpr index_sequence enumerate()
Returns an index_sequence for enumerating the components of this HybridTreePath.
Definition: treepath.hh:108
constexpr HybridTreePath(const HybridTreePath &tp)=default
constexpr std::size_t operator[](std::size_t pos) const
Get the index value at position pos.
Definition: treepath.hh:127
auto back() const
Get the last index value.
Definition: treepath.hh:156
std::index_sequence_for< T... > index_sequence
An index_sequence for the entries in this HybridTreePath.
Definition: treepath.hh:84
Definition: treepath.hh:34
Definition: treepath.hh:37
Definition: treepath.hh:40
Definition: treepath.hh:43
Definition: treepath.hh:46
Definition: treepath.hh:49
Definition: treepath.hh:52
Definition: treepath.hh:55
HybridTreePath< index_constant< i >..., index_constant< k > > type
Definition: treepath.hh:433
HybridTreePath< index_constant< k >, index_constant< i >... > type
Definition: treepath.hh:439
HybridTreePath< index_constant< i >... > type
Definition: treepath.hh:460
HybridTreePath< index_constant< i >... > type
Definition: treepath.hh:474
HybridTreePath< index_constant< i >..., index_constant< k >... > type
Definition: treepath.hh:480