diff --git a/dune/fem-dg/misc/tupleutility.hh b/dune/fem-dg/misc/tupleutility.hh index 3ea390f6b5f0546ef0c55b620cdf9d9bd0173cb4..d15739848eb955ea1f5c09f82444f12fe4255eb8 100644 --- a/dune/fem-dg/misc/tupleutility.hh +++ b/dune/fem-dg/misc/tupleutility.hh @@ -126,6 +126,47 @@ namespace Fem static const int value = true; }; + + template< class Sequence > + struct index_sequence_to_tuple; + + template< size_t... i > + struct index_sequence_to_tuple< std::index_sequence<i...> > + { + //wrap integral_constant around it... + typedef std::tuple< std::integral_constant< size_t, i >... > type; + }; + + template< class Sequence > + struct integer_sequence_to_tuple; + + template< int... i > + struct integer_sequence_to_tuple< std::integer_sequence<int, i...> > + { + //wrap integral_constant around it... + typedef std::tuple< std::integral_constant< int, i >... > type; + }; + + + template< class Sequence > + struct tuple_to_index_sequence; + + template< size_t... i > + struct tuple_to_index_sequence< std::tuple< std::integral_constant< size_t, i>... > > + { + typedef std::index_sequence< std::integral_constant< size_t, i >::value... > type; + }; + + template< class Sequence > + struct tuple_to_integer_sequence; + + template< int... i > + struct tuple_to_integer_sequence< std::tuple< std::integral_constant< int, i>... > > + { + typedef std::integer_sequence< std::integral_constant< int, i >::value... > type; + }; + + /** * \brief Picks some elements of a std::tuple, * with elements defined by a std::index_sequence. @@ -175,6 +216,57 @@ namespace Fem }; + //namespace details + //{ + // template< class FullTupleImp, template<class> class Selector > + // struct tuple_reducer_impl + // { + // typedef typename tuple_concat< std::conditional_t< Selector< std::tuple_element_t< i, FullTupleImp > >::value, + // std::tuple_element_t< i, FullTupleImp >, + // std::tuple<> + // >... >::type type; + // }; + + // template< class FullTupleImp, template<class> class Selector, class IndexSequenceType > + // struct index_sequence_reducer + // {}; + + // template< class FullTupleImp, template<class> class Selector > + // struct index_sequence_reducer< FullTupleImp, Selector, std::index_sequence<> > + // { + // typedef std::index_sequence<> type; + + // // + // typedef typename index_sequence_to_tuple< std::index_sequence<i...> >::type TupleType; + + + // typename tuple_to_index_sequence< typename index_sequence_to_tuple< std::index_sequence<i...> >::type >::type + // }; + + // template< class FullTupleImp, template<class> class Selector, std::size_t i > + // struct index_sequence_reducer< FullTupleImp, Selector, std::index_sequence< i > + // { + // typedef std::conditional_t< Selector< std::tuple_element_t< i, FullTupleImp > >::value, + // typename index_sequence_reducer<FullTupleImp, Selector, std::index_sequence<i> >::type, + // typename index_sequence_reducer<FullTupleImp, Selector, std::index_sequence<> >::type > type; + // }; + + + // template< class FullTupleImp, template<class> class Selector, std::size_t i, std::size_t... j > + // struct index_sequence_reducer< FullTupleImp, Selector, std::index_sequence< i, j... > > + // { + // private: + // typedef std::index_sequence<i,j...> FullIndexSequenceType; + // typedef std::index_sequence<j...> ShortenIndexSequenceType; + // public: + // typedef std::conditional_t< Selector< std::tuple_element_t< i, FullTupleImp > >::value, + // typename index_sequence_reducer<FullTupleImp, Selector, FullIndexSequenceType >::type, + // typename index_sequence_reducer<FullTupleImp, Selector, ShortenIndexSequenceType >::type > type; + // }; + + //} + + template< int Int, class Tuple > class checked_tuple_element {