Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. namespace IntegralList
  2. {
  3. template <typename T, T... Series>
  4. struct List {};
  5.  
  6. template <typename T, T... Head, T... Tail>
  7. List<T, Head..., Tail...> Append(List<T, Head...>, List<T, Tail...>);
  8.  
  9. namespace Private
  10. {
  11.     template <typename T>
  12.     constexpr bool is_empty_list(T Begin, T End, T Step)
  13.     {
  14.         return (End * Step) <= (Begin * Step);
  15.     }
  16. }
  17.  
  18. template <typename T, T Begin, T End, T Step, bool Empty = false>
  19. struct MakeIntegralSeriesImpl
  20. {
  21.     using Type = typename std::conditional<Private::is_empty_list(Begin, End, Step),
  22.                                            List<T>,
  23.                                            decltype(Append(std::declval<List<T, Begin>>(),
  24.                                                     typename MakeIntegralSeriesImpl<T, Begin + Step, End, Step, Private::is_empty_list(Begin, End, Step)>::Type()))>::type;
  25. };
  26.  
  27. template <typename T, T Begin, T End, T Step>
  28. struct MakeIntegralSeriesImpl<T, Begin, End, Step, true>
  29. {
  30.     using Type = List<T>;
  31. };
  32.  
  33. }
  34.  
  35. template <template<std::size_t> class T, typename... Args>
  36. struct Multiplex
  37. {
  38.     std::size_t n;
  39.     const std::tuple<Args...> &args;
  40. };
  41.  
  42. template <std::size_t Max>
  43. struct MultiplexingModule
  44. {
  45.     template<typename Messenger, template<std::size_t> class T, typename... Args>
  46.     std::tuple<> process_message(const Messenger& messenger, const Multiplex<T, Args...> &message)
  47.     {
  48.         generate_message_and_pass_message<Messenger, T, Args...>(typename IntegralList::MakeIntegralSeriesImpl<std::size_t, 0, sizeof...(Args), 1>::Type(),
  49.                                                                  typename IntegralList::MakeIntegralSeriesImpl<std::size_t, 0, Max, 1>::Type(),
  50.                                                                  message.n, messenger, message.args);
  51.         return std::make_tuple();
  52.     }
  53.     private:
  54.  
  55.     template<typename Messenger, template<std::size_t> class T,  typename... Args, std::size_t... ArgsIndices, std::size_t... FuncIndices>
  56.     static void generate_message_and_pass_message(IntegralList::List<std::size_t, ArgsIndices...>,
  57.                                                   IntegralList::List<std::size_t, FuncIndices...>,
  58.                                                   const std::size_t n, const Messenger &messenger, const std::tuple<Args...> &args)
  59.     {
  60.         constexpr void(*func_array[])(const Messenger &messenger, Args... args) = {generate_message_and_pass_message<FuncIndices, Messenger, T, Args...>...};
  61.         func_array[n](messenger, std::forward<typename std::tuple_element<ArgsIndices, const std::tuple<Args...>>::type>(std::get<ArgsIndices>(args))...);
  62.     }
  63.  
  64.     template<std::size_t N, typename Messenger, template<std::size_t> class T,  typename... Args>
  65.     static void generate_message_and_pass_message(const Messenger &messenger, Args... args)
  66.     {
  67.         messenger.pass_message(T<N>(std::forward<Args>(args)...));
  68.     }
  69. };
  70.  
  71. template <std::size_t N>
  72. struct Foo
  73. {
  74.     Foo(int n, int i1, int i2, int i3, int i4)
  75.     {
  76.         std::cout<< "Foo " << N << " was constructed with " << n << i1 << i2 << i3 << i4 << std::endl;
  77.     };
  78. };
  79.  
  80. int main()
  81. {
  82.     volatile std::size_t i = 0;
  83.     int b;
  84.     Messenger::Messenger<MultiplexingModule<500>> messenger;
  85.     messenger.pass_message(Multiplex<Foo, int&, int, int, int, int>{i, {b, 0, 0, 1, 2}});
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement