DUNE-ACFEM (unstable)

toarray.hh
1#ifndef __DUNE_ACFEM_MPL_TOARRAY_HH__
2#define __DUNE_ACFEM_MPL_TOARRAY_HH__
3
4#include "generators.hh"
5#include "access.hh"
6
7namespace Dune {
8
9 namespace ACFem {
10
24 namespace {
25 template<class T, class Tuple, std::size_t... I>
26 auto toArrayHelper(Tuple&& tuple, IndexSequence<I...>)
27 {
28 return std::array<T, sizeof...(I)>({{ (T)std::get<I>(std::forward<Tuple>(tuple))... }});
29 }
30
31 template<class Tuple, class Idx, class SFINAE = void>
32 struct ScalarTupleTypePromotionHelper;
33
34 template<class Tuple, std::size_t... Idx>
35 struct ScalarTupleTypePromotionHelper<
36 Tuple, IndexSequence<Idx...>,
37 std::enable_if_t<IsTupleLike<Tuple>::value && sizeof...(Idx) != 0> >
38 {
39 using Type = std::decay_t<decltype((std::declval<TupleElement<0, Tuple> >() + ... + std::declval<TupleElement<Idx, Tuple> >()))>;
40 };
41
42 template<class T, T... Ts, std::size_t... Idx>
43 struct ScalarTupleTypePromotionHelper<
44 Sequence<T, Ts...>, IndexSequence<Idx...>,
45 std::enable_if_t<sizeof...(Idx) != 0> >
46 {
47 using Type = T;
48 };
49
50 }
51
53 template<class Tuple>
55 typename ScalarTupleTypePromotionHelper<Tuple, MakeSequenceFor<Tuple> >::Type;
56
58 template<class T, class SFINAE = void>
60 : FalseType
61 {};
62
67 template<class T>
68 struct CanPromoteTupleTypes<T, std::enable_if_t<sizeof(TupleScalarPromotionType<T>) >= 0> >
69 : TrueType
70 {};
71
75 template<class T, T... Ind>
77 {
78 return std::array<T, sizeof...(Ind)>({{ Ind... }});
79 }
80
82 template<class T, class Tuple, std::enable_if_t<IsTupleLike<Tuple>::value, int> = 0>
83 auto toArray(Tuple&& t)
84 {
85 return toArrayHelper<T>(std::forward<Tuple>(t), MakeSequenceFor<Tuple>{});
86 }
87
89 template<
90 class Tuple,
91 std::enable_if_t<(IsTupleLike<Tuple>::value
92 && CanPromoteTupleTypes<Tuple>::value
93 ), int> = 0>
94 auto toArray(Tuple&& t)
95 {
96 return toArray<TupleScalarPromotionType<Tuple> >(std::forward<Tuple>(t));
97 }
98
99 template<class T, std::enable_if_t<IsArray<T>::value, int> = 0>
100 constexpr decltype(auto) toArray(T&& t)
101 {
102 return std::forward<T>(t);
103 }
104
106
108
109 } // ACFem::
110
111} // Dune::
112
113#endif // __DUNE_ACFEM_MPL_TOARRAY_HH__
MakeIndexSequence< size< T >()> MakeSequenceFor
Make a simple index sequence of the size of the argument, which may be anything for which size<T>() e...
Definition: generators.hh:41
auto toArray(Sequence< T, Ind... >)
Convert a compile-time constant integer sequence to a rutime-object with the same values.
Definition: toarray.hh:76
typename ScalarTupleTypePromotionHelper< Tuple, MakeSequenceFor< Tuple > >::Type TupleScalarPromotionType
Generate the type resulting from summing up all tuple elements.
Definition: toarray.hh:55
Sequence< std::size_t, V... > IndexSequence
Sequence of std::size_t values.
Definition: types.hh:64
std::integer_sequence< T, V... > Sequence
Sequence of any type of integer values.
Definition: types.hh:56
BoolConstant< false > FalseType
Alias for std::false_type.
Definition: types.hh:110
BoolConstant< true > TrueType
Alias for std::true_type.
Definition: types.hh:107
STL namespace.
Definition: toarray.hh:61
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)