31#ifndef ETL_SHARED_MESSAGE_INCLUDED
32#define ETL_SHARED_MESSAGE_INCLUDED
37#include "reference_counted_message.h"
38#include "static_assert.h"
57 template <
typename TMessage,
typename TPool,
typename... TArgs>
67 template <
typename TPool,
typename TMessage>
70 ETL_STATIC_ASSERT((etl::is_base_of<etl::ireference_counted_message_pool, TPool>::value),
71 "TPool not derived from etl::ireference_counted_message_pool");
72 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage>::value),
"TMessage not derived from etl::imessage");
74 p_rcmessage = owner.allocate(
message);
76 if (p_rcmessage != ETL_NULLPTR)
78 p_rcmessage->get_reference_counter().set_reference_count(1U);
86 template <
typename TPool,
typename TMessage,
typename... TArgs>
89 ETL_STATIC_ASSERT((etl::is_base_of<etl::ireference_counted_message_pool, TPool>::value),
90 "TPool not derived from etl::ireference_counted_message_pool");
91 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage>::value),
"TMessage not derived from etl::imessage");
93 p_rcmessage = owner.template allocate<TMessage>(etl::forward<TArgs>(args)...);
95 if (p_rcmessage != ETL_NULLPTR)
116 : p_rcmessage(other.p_rcmessage)
118 p_rcmessage->get_reference_counter().increment_reference_count();
126 : p_rcmessage(etl::move(other.p_rcmessage))
128 other.p_rcmessage = ETL_NULLPTR;
140 if (p_rcmessage->get_reference_counter().decrement_reference_count() == 0U)
142 p_rcmessage->release();
146 p_rcmessage = other.p_rcmessage;
168 p_rcmessage = etl::move(other.p_rcmessage);
169 other.p_rcmessage = ETL_NULLPTR;
182 if ((p_rcmessage != ETL_NULLPTR) && (p_rcmessage->get_reference_counter().decrement_reference_count() == 0U))
184 p_rcmessage->release();
194 return p_rcmessage->get_message();
203 return p_rcmessage->get_message();
221 return p_rcmessage != ETL_NULLPTR;
Definition reference_counted_message.h:48
virtual ETL_NODISCARD etl::ireference_counter & get_reference_counter()=0
virtual void release()=0
Release back to the owner.
Definition shared_message.h:50
ETL_NODISCARD bool is_valid() const
Checks if the shared message is valid.
Definition shared_message.h:219
ETL_NODISCARD uint32_t get_reference_count() const
Get the current reference count for this shared message.
Definition shared_message.h:210
ETL_NODISCARD etl::imessage & get_message()
Get a reference to the contained message.
Definition shared_message.h:192
shared_message(const etl::shared_message &other)
Copy constructor.
Definition shared_message.h:115
~shared_message()
Definition shared_message.h:180
ETL_NODISCARD const etl::imessage & get_message() const
Get a const reference to the contained message.
Definition shared_message.h:201
shared_message(etl::ireference_counted_message &rcm)
Constructor.
Definition shared_message.h:105
shared_message(TPool &owner, const TMessage &message)
Constructor.
Definition shared_message.h:68
shared_message & operator=(const etl::shared_message &other)
Copy assignment operator.
Definition shared_message.h:135
bitset_ext
Definition absolute.h:40