14namespace rotor_light {
34 inline operator bool() {
return message; }
67 template <
typename MessageType,
typename... Args>
68 MessageType *
put(Args... args) {
69 static_assert(std::is_base_of<Message, MessageType>::value,
70 "type should be inherited from Message");
71 assert((
sizeof(MessageType) <= item_size) &&
72 "no storage for the message, increase ItemSize");
73 if (items_size == items_count) {
76 auto ptr = buff_ptr + item_size * free_index;
77 if (free_index == items_size - 1) {
82 auto message =
new (ptr) MessageType(std::forward<Args>(args)...);
83 message->type = MessageType::type_id;
100 volatile Index items_count;
101 volatile Index free_index;
102 volatile Index occupied_index;
108template <
typename Storage,
size_t ItemsCount>
110 static_assert(Storage::item_size > 0,
"queue size have to be positive");
117 using Item =
typename Storage::Item;
118 Item storage[ItemsCount];
135 template <
typename MessageType,
typename... Args>
136 bool put(
size_t queue_index, Args... args) {
137 assert((queue_index < queue_count) &&
"valid queue/priority");
138 return queues[queue_index]->
put<MessageType>(std::forward<Args>(args)...);
155 static_assert(Storage::item_size >
sizeof(
Message),
156 "not enough storage for a message");
158 using Queues = std::tuple<ItemQueue<Storage, Counts>...>;
161 static constexpr size_t Size = std::tuple_size<Queues>::value;
162 static_assert(
Size > 0,
"there should be at least one queue");
167 template <
size_t Index>
void fill_queue() {
168 auto &queue = std::get<Index>(queues_storage);
169 queues[Index] = &queue;
170 if constexpr (Index + 1 <
Size) {
171 fill_queue<Index + 1>();
176 ItemQueueBase *queues[
Size];
Message removal helper after message delivery.
Definition: queue.hpp:21
ItemGuard(Message *message_, ItemQueueBase *item_queue_)
Definition: queue.hpp:25
Message & operator*()
Definition: queue.hpp:37
ItemGuard & operator=(const ItemGuard &)=default
Message * message
Definition: queue.hpp:40
ItemQueueBase * item_queue
Definition: queue.hpp:43
base class for queues.
Definition: queue.hpp:51
MessageType * put(Args... args)
Definition: queue.hpp:68
ItemQueueBase(size_t item_size, size_t items_count)
void post_constructor(char *buff)
convenient helper for storing fixed amount of messages
Definition: queue.hpp:109
base class for all rotor-light messages
Definition: message.hpp:22
base class for meta-queue (list of queues, ordered by priorities))
Definition: queue.hpp:124
QueueBase(ItemQueueBase **queues, size_t queue_count)
bool put(size_t queue_index, Args... args)
Definition: queue.hpp:136
conveninent helper for meta-queue (list of queues, ordered by priorities)
Definition: queue.hpp:154
static constexpr size_t Size
Definition: queue.hpp:161
std::tuple< ItemQueue< Storage, Counts >... > Queues
Definition: queue.hpp:158