Advertisement
Guest User

Untitled

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