Added 'successor' member to allow implementation 'Chain Of Responsibility' pattern.

This commit is contained in:
John Wellbelove 2017-11-30 16:56:22 +00:00
parent 0f03a90cda
commit 9f4fe86df9
3 changed files with 561 additions and 150 deletions

File diff suppressed because it is too large Load Diff

View File

@ -72,6 +72,7 @@ cog.outl("//********************************************************************
#include "error_handler.h"
#include "exception.h"
#include "largest.h"
#include "nullptr.h"
#undef ETL_FILE
#define ETL_FILE "35"
@ -138,6 +139,12 @@ namespace etl
return (message_router_id == MESSAGE_BUS);
}
//********************************************
void set_successor(imessage_router& successor_)
{
successor = &successor_;
}
enum
{
NULL_MESSAGE_ROUTER = 255,
@ -148,11 +155,21 @@ namespace etl
protected:
imessage_router(etl::message_router_id_t id)
: message_router_id(id)
imessage_router(etl::message_router_id_t id_)
: successor(nullptr),
message_router_id(id_)
{
}
imessage_router(etl::message_router_id_t id_,
imessage_router& successor_)
: successor(&successor_),
message_router_id(id_)
{
}
etl::imessage_router* successor;
private:
// Disabled.
@ -313,10 +330,17 @@ namespace etl
cog.outl(" };")
cog.outl("")
cog.outl(" //**********************************************")
cog.outl(" message_router(etl::message_router_id_t id)")
cog.outl(" : imessage_router(id)")
cog.outl(" message_router(etl::message_router_id_t id_)")
cog.outl(" : imessage_router(id_)")
cog.outl(" {")
cog.outl(" ETL_ASSERT(id <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
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(" message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)")
cog.outl(" : imessage_router(id_, successor_)")
cog.outl(" {")
cog.outl(" ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
cog.outl(" }")
cog.outl("")
cog.outl(" //**********************************************")
@ -336,9 +360,18 @@ namespace etl
cog.out(" case T%d::ID:" % n)
cog.out(" static_cast<TDerived*>(this)->on_receive(source, static_cast<const T%d&>(msg));" % n)
cog.outl(" break;")
cog.out(" default:")
cog.out(" static_cast<TDerived*>(this)->on_receive_unknown(source, msg);")
cog.outl(" break;")
cog.outl(" default:")
cog.outl(" {")
cog.outl(" if (successor != nullptr)")
cog.outl(" {")
cog.outl(" successor->receive(source, msg);")
cog.outl(" }")
cog.outl(" else")
cog.outl(" {")
cog.outl(" static_cast<TDerived*>(this)->on_receive_unknown(source, msg);")
cog.outl(" }")
cog.outl(" break;")
cog.outl(" }")
cog.outl(" }")
cog.outl(" }")
cog.outl("")
@ -469,10 +502,17 @@ namespace etl
cog.outl(" };")
cog.outl("")
cog.outl(" //**********************************************")
cog.outl(" message_router(etl::message_router_id_t id)")
cog.outl(" : imessage_router(id)")
cog.outl(" message_router(etl::message_router_id_t id_)")
cog.outl(" : imessage_router(id_)")
cog.outl(" {")
cog.outl(" ETL_ASSERT(id <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
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(" message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)")
cog.outl(" : imessage_router(id_, successor_)")
cog.outl(" {")
cog.outl(" ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));")
cog.outl(" }")
cog.outl("")
cog.outl(" //**********************************************")
@ -492,9 +532,18 @@ namespace etl
cog.out(" case T%d::ID:" % t)
cog.out(" static_cast<TDerived*>(this)->on_receive(source, static_cast<const T%d&>(msg));" % t)
cog.outl(" break;")
cog.out(" default:")
cog.out(" static_cast<TDerived*>(this)->on_receive_unknown(source, msg);")
cog.outl(" break;")
cog.outl(" default:")
cog.outl(" {")
cog.outl(" if (successor != nullptr)")
cog.outl(" {")
cog.outl(" successor->receive(source, msg);")
cog.outl(" }")
cog.outl(" else")
cog.outl(" {")
cog.outl(" static_cast<TDerived*>(this)->on_receive_unknown(source, msg);")
cog.outl(" }")
cog.outl(" break;")
cog.outl(" }")
cog.outl(" }")
cog.outl(" }")
cog.outl("")

View File

@ -417,5 +417,62 @@ namespace
CHECK_EQUAL(4, r1.callback_count);
queue.pop();
}
//=========================================================================
TEST(message_router_successor)
{
Router1 r1;
Router2 r2;
r2.set_successor(r1);
etl::send_message(r2, message1);
CHECK_EQUAL(1, r2.message1_count);
CHECK_EQUAL(0, r2.message2_count);
CHECK_EQUAL(0, r2.message4_count);
CHECK_EQUAL(0, r2.message_unknown_count);
CHECK_EQUAL(0, r1.message1_count);
CHECK_EQUAL(0, r1.message2_count);
CHECK_EQUAL(0, r1.message3_count);
CHECK_EQUAL(0, r1.message4_count);
CHECK_EQUAL(0, r1.message_unknown_count);
etl::send_message(r2, message2);
CHECK_EQUAL(1, r2.message1_count);
CHECK_EQUAL(1, r2.message2_count);
CHECK_EQUAL(0, r2.message4_count);
CHECK_EQUAL(0, r2.message_unknown_count);
CHECK_EQUAL(0, r1.message1_count);
CHECK_EQUAL(0, r1.message2_count);
CHECK_EQUAL(0, r1.message3_count);
CHECK_EQUAL(0, r1.message4_count);
CHECK_EQUAL(0, r1.message_unknown_count);
etl::send_message(r2, message3);
CHECK_EQUAL(1, r2.message1_count);
CHECK_EQUAL(1, r2.message2_count);
CHECK_EQUAL(0, r2.message4_count);
CHECK_EQUAL(0, r2.message_unknown_count);
CHECK_EQUAL(0, r1.message1_count);
CHECK_EQUAL(0, r1.message2_count);
CHECK_EQUAL(1, r1.message3_count);
CHECK_EQUAL(0, r1.message4_count);
CHECK_EQUAL(0, r1.message_unknown_count);
etl::send_message(r2, message4);
CHECK_EQUAL(1, r2.message1_count);
CHECK_EQUAL(1, r2.message2_count);
CHECK_EQUAL(1, r2.message4_count);
CHECK_EQUAL(0, r2.message_unknown_count);
CHECK_EQUAL(0, r1.message1_count);
CHECK_EQUAL(0, r1.message2_count);
CHECK_EQUAL(1, r1.message3_count);
CHECK_EQUAL(0, r1.message4_count);
CHECK_EQUAL(0, r1.message_unknown_count);
}
};
}