reference_counted_object and reference_counted_message specialisations

This commit is contained in:
John Wellbelove 2021-01-02 13:39:59 +00:00
parent 920dcdf4b6
commit cbf07b053c
3 changed files with 72 additions and 60 deletions

View File

@ -68,6 +68,7 @@ cog.outl("//********************************************************************
#include "platform.h"
#include "message.h"
#include "shared_message.h"
#include "message_packet.h"
#include "message_types.h"
#include "alignment.h"
@ -107,6 +108,13 @@ namespace etl
}
};
//***************************************************************************
/// Forward declare null message router functionality.
//***************************************************************************
class imessage_router;
etl::imessage_router& get_null_message_router();
//***************************************************************************
/// This is the base of all message routers.
//***************************************************************************
@ -115,14 +123,48 @@ namespace etl
public:
virtual ~imessage_router() {}
virtual void receive(const etl::imessage& message) = 0;
virtual void receive(imessage_router& source, const etl::imessage& message) = 0;
virtual void receive(imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& message) = 0;
virtual bool accepts(etl::message_id_t id) const = 0;
virtual bool is_null_router() const = 0;
virtual bool is_producer() const = 0;
virtual bool is_consumer() const = 0;
//********************************************
void receive(const etl::imessage& message)
{
receive(etl::get_null_message_router(), message);
}
//********************************************
void receive(imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& message)
{
if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
{
receive(source, message);
}
}
//********************************************
virtual void receive(imessage_router& source, etl::shared_message shared_msg)
{
receive(source, shared_msg.get_message());
}
//********************************************
void receive(etl::shared_message shared_msg)
{
receive(etl::get_null_message_router(), shared_msg);
}
//********************************************
void receive(imessage_router& source, etl::message_router_id_t destination_router_id, etl::shared_message shared_msg)
{
if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
{
receive(source, shared_msg);
}
}
//********************************************
bool accepts(const etl::imessage& msg) const
{
@ -156,23 +198,23 @@ namespace etl
enum
{
NULL_MESSAGE_ROUTER = 255,
MESSAGE_BUS = 254,
MESSAGE_BUS = 254,
ALL_MESSAGE_ROUTERS = 253,
MAX_MESSAGE_ROUTER = 249
MAX_MESSAGE_ROUTER = 249
};
protected:
imessage_router(etl::message_router_id_t id_)
: successor(ETL_NULLPTR),
message_router_id(id_)
message_router_id(id_)
{
}
imessage_router(etl::message_router_id_t id_,
imessage_router& successor_)
imessage_router& successor_)
: successor(&successor_),
message_router_id(id_)
message_router_id(id_)
{
}
@ -199,21 +241,13 @@ namespace etl
{
}
//********************************************
void receive(const etl::imessage&) ETL_OVERRIDE
{
}
using imessage_router::receive;
//********************************************
void receive(etl::imessage_router&, const etl::imessage&) ETL_OVERRIDE
{
}
//********************************************
void receive(imessage_router&, etl::message_router_id_t, const etl::imessage&) ETL_OVERRIDE
{
}
//********************************************
bool accepts(etl::message_id_t) const ETL_OVERRIDE
{
@ -246,6 +280,13 @@ namespace etl
}
};
//***********************************************
/// null message router functionality.
inline etl::imessage_router& get_null_message_router()
{
return etl::null_message_router::instance();
}
//***************************************************************************
/// This router can be used as a producer-only of messages, such an interrupt routine.
//***************************************************************************
@ -258,21 +299,13 @@ namespace etl
{
}
//********************************************
void receive(const etl::imessage&) ETL_OVERRIDE
{
}
using imessage_router::receive;
//********************************************
void receive(etl::imessage_router&, const etl::imessage&) ETL_OVERRIDE
{
}
//********************************************
void receive(imessage_router&, etl::message_router_id_t, const etl::imessage&) ETL_OVERRIDE
{
}
//********************************************
bool accepts(etl::message_id_t) const ETL_OVERRIDE
{
@ -358,20 +391,7 @@ namespace etl
cog.outl(" ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
cog.outl(" }")
cog.outl("")
cog.outl(" //**********************************************")
cog.outl(" void receive(const etl::imessage& msg) ETL_OVERRIDE")
cog.outl(" {")
cog.outl(" receive(etl::null_message_router::instance(), msg);")
cog.outl(" }")
cog.outl("")
cog.outl(" //**********************************************")
cog.outl(" void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE")
cog.outl(" {")
cog.outl(" if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))")
cog.outl(" {")
cog.outl(" receive(source, msg);")
cog.outl(" }")
cog.outl(" }")
cog.outl(" using imessage_router::receive;")
cog.outl("")
cog.outl(" //**********************************************")
cog.outl(" void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE")
@ -491,20 +511,7 @@ namespace etl
cog.outl(" ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
cog.outl(" }")
cog.outl("")
cog.outl(" //**********************************************")
cog.outl(" void receive(const etl::imessage& msg) ETL_OVERRIDE")
cog.outl(" {")
cog.outl(" receive(etl::null_message_router::instance(), msg);")
cog.outl(" }")
cog.outl("")
cog.outl(" //**********************************************")
cog.outl(" void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) ETL_OVERRIDE")
cog.outl(" {")
cog.outl(" if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))")
cog.outl(" {")
cog.outl(" receive(source, msg);")
cog.outl(" }")
cog.outl(" }")
cog.outl(" using imessage_router::receive;")
cog.outl("")
cog.outl(" //**********************************************")
cog.outl(" void receive(etl::imessage_router& source, const etl::imessage& msg) ETL_OVERRIDE")

View File

@ -54,7 +54,7 @@ namespace etl
//***************************************************************************
// Reference counted message type.
//***************************************************************************
template <typename TMessage, typename TCounter>
template <typename TMessage, typename TCounter = void>
class reference_counted_message : public etl::ireference_counted_message
{
public:
@ -132,7 +132,7 @@ namespace etl
// Uncounted message type.
//***************************************************************************
template <typename TMessage>
class uncounted_message : virtual public etl::ireference_counted_message
class reference_counted_message<TMessage, void> : virtual public etl::ireference_counted_message
{
public:
@ -143,7 +143,7 @@ namespace etl
/// Constructor
/// \param msg The message to count.
//***************************************************************************
uncounted_message(const TMessage& msg_)
reference_counted_message(const TMessage& msg_)
: rc_object(msg_)
{
}
@ -178,7 +178,7 @@ namespace etl
private:
/// The reference counted object.
etl::uncounted_object<TMessage> rc_object;
etl::reference_counted_object<TMessage, void> rc_object;
};
}

View File

@ -55,7 +55,7 @@ namespace etl
/// \tparam TObject The type to be reference counted.
/// \tparam TCounter The type to use as the counter.
//***************************************************************************
template <typename TObject, typename TCounter>
template <typename TObject, typename TCounter = void>
class reference_counted_object : public etl::ireference_counted_object
{
public:
@ -146,8 +146,13 @@ namespace etl
};
#endif
//***************************************************************************
/// Specialisation creating objects that have the ireference_counted_object interface
/// but do not actually count.
/// \tparam TObject The type stored in the object.
//***************************************************************************
template <typename TObject>
class uncounted_object : public etl::ireference_counted_object
class reference_counted_object<TObject, void> : public etl::ireference_counted_object
{
public:
@ -157,7 +162,7 @@ namespace etl
//***************************************************************************
/// Constructor.
//***************************************************************************
uncounted_object(const TObject& object_)
reference_counted_object(const TObject& object_)
: object(object_)
{
}