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 
7 namespace 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
Definition: toarray.hh:61
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (Apr 26, 22:29, 2024)