mirror of
https://github.com/ETLCPP/etl.git
synced 2026-11-09 14:49:53 +08:00
reference_counted_object and reference_counted_message specialisations
This commit is contained in:
parent
920dcdf4b6
commit
cbf07b053c
@ -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")
|
||||
|
||||
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@ -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_)
|
||||
{
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user