1#ifndef __DUNE_ACFEM_MPL_TOARRAY_HH__
2#define __DUNE_ACFEM_MPL_TOARRAY_HH__
4#include "generators.hh"
25 template<
class T,
class Tuple, std::size_t... I>
26 auto toArrayHelper(Tuple&& tuple, IndexSequence<I...>)
28 return std::array<T,
sizeof...(I)>({{ (T)std::get<I>(std::forward<Tuple>(tuple))... }});
31 template<
class Tuple,
class Idx,
class SFINAE =
void>
32 struct ScalarTupleTypePromotionHelper;
34 template<
class Tuple, std::size_t... Idx>
35 struct ScalarTupleTypePromotionHelper<
37 std::enable_if_t<IsTupleLike<Tuple>::value && sizeof...(Idx) != 0> >
39 using Type = std::decay_t<
decltype((std::declval<TupleElement<0, Tuple> >() + ... + std::declval<TupleElement<Idx, Tuple> >()))>;
42 template<
class T, T... Ts, std::size_t... Idx>
43 struct ScalarTupleTypePromotionHelper<
45 std::enable_if_t<sizeof...(Idx) != 0> >
55 typename ScalarTupleTypePromotionHelper<Tuple, MakeSequenceFor<Tuple> >::Type;
58 template<
class T,
class SFINAE =
void>
75 template<
class T, T... Ind>
78 return std::array<T,
sizeof...(Ind)>({{ Ind... }});
82 template<class T, class Tuple, std::enable_if_t<IsTupleLike<Tuple>::value,
int> = 0>
91 std::enable_if_t<(IsTupleLike<Tuple>::value
92 && CanPromoteTupleTypes<Tuple>::value
96 return toArray<TupleScalarPromotionType<Tuple> >(std::forward<Tuple>(t));
99 template<class T, std::enable_if_t<IsArray<T>::value,
int> = 0>
100 constexpr decltype(
auto)
toArray(T&& t)
102 return std::forward<T>(t);
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