123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #pragma once
- #include "arc.hpp"
- #include "address.hpp"
- #include <typeindex>
- #include <deque>
- namespace rotor {
- struct message_base_t : public arc_base_t<message_base_t> {
- virtual ~message_base_t();
-
- const void *type_index;
-
- address_ptr_t address;
-
- message_base_t(const void *type_index_, const address_ptr_t &addr) : type_index{type_index_}, address{addr} {}
- };
- inline message_base_t::~message_base_t() {}
- template <typename T> struct message_t : public message_base_t {
-
- using payload_t = T;
-
- template <typename... Args>
- message_t(const address_ptr_t &addr, Args &&...args)
- : message_base_t{message_type, addr}, payload{std::forward<Args>(args)...} {}
-
- T payload;
-
- static const void *message_type;
- };
- using message_ptr_t = intrusive_ptr_t<message_base_t>;
- using messages_queue_t = std::deque<message_ptr_t>;
- template <typename T> const void *message_t<T>::message_type = static_cast<const void *>(typeid(message_t<T>).name());
- template <typename M, typename... Args> auto make_message(const address_ptr_t &addr, Args &&...args) -> message_ptr_t {
- return message_ptr_t{new message_t<M>(addr, std::forward<Args>(args)...)};
- }
- }
|