#pragma once #include #include #include #include #include "IndexSeq.hpp" namespace AMDiS { template using int_ = std::integral_constant; template using bool_ = std::integral_constant; template using index_ = std::integral_constant; template using IdxPairList = std::map< std::pair, std::list > >; template using IdxList = std::map< int, std::list > >; namespace Impl { // add arg to repeated constructor argument list template Tuple construct_tuple_aux(int_, Arg&& arg, Args&&... args) { return construct_tuple_aux(int_(), std::forward(arg), std::forward(arg), std::forward(args)...); } template Tuple construct_tuple_aux(int_<1>, Args&&... args) { static_assert(std::tuple_size::value == sizeof...(args), "Nr. of argument != tuple-size"); return Tuple{std::forward(args)...}; } template Tuple construct_tuple_aux(int_<0>, Args&&... args) { static_assert(std::tuple_size::value == 0, "Construction of empty tuples with empty argument list only!"); return {}; } } // end namespace Impl // construct a tuple with each element constructed by the same argument arg. template Tuple construct_tuple(Arg&& arg) { return Impl::construct_tuple_aux(int_::value>(), std::forward(arg)); } // ----------- template class Base, class Tuple, class Indices> struct MakeTuple; template class Base, class Tuple, size_t... I> struct MakeTuple> { using type = std::tuple>...>; }; template class Base, class Tuple> using MakeTuple_t = typename MakeTuple::value>>::type; // ----------- template class Base, class Tuple1, class Tuple2, class Indices> struct MakeTuple2; template class Base, class Tuple1, class Tuple2, size_t... I> struct MakeTuple2> { using type = std::tuple, std::tuple_element_t>...>; }; template class Base, class Tuple1, class Tuple2> using MakeTuple2_t = typename MakeTuple2::value>>::type; // ----------- template class Base, class Tuple, class Indices> struct ExpandTuple; template class Base, class Tuple, size_t... I> struct ExpandTuple> { using type = Base...>; }; template class Base, class Tuple> using ExpandTuple_t = typename ExpandTuple::value>>::type; // ----------- template struct RepeatedTuple; template struct RepeatedTuple> { template using Id = U; using type = std::tuple...>; }; template using Repeat_t = typename RepeatedTuple>::type; } // end namespace AMDiS