Skip to content

Commit

Permalink
Altered 'unhandled' delegate to tbe the last in the array for the con…
Browse files Browse the repository at this point in the history
…stexpr vspecialisation.
  • Loading branch information
John Wellbelove committed Jul 23, 2021
1 parent d49c2d2 commit 7a061a4
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 103 deletions.
31 changes: 1 addition & 30 deletions include/etl/delegate_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,6 @@ namespace etl
{
public:

//*************************************************************************
/// Registers an alternative delegate for unhandled ids.
/// \param delegate A reference to the user supplied 'unhandled' delegate.
//*************************************************************************
void register_unhandled_delegate(etl::delegate<void(size_t)> callback)
{
unhandled_delegate = callback;
}

//*************************************************************************
/// Executes the delegate function for the index.
/// Compile time assert if the id is out of range.
Expand All @@ -91,29 +82,9 @@ namespace etl
}
else
{
if (unhandled_delegate.is_valid())
{
unhandled_delegate(id);
}
}
}

private:

//*************************************************************************
/// The default callback function.
/// Calls the user defined 'unhandled' callback if it exists.
//*************************************************************************
void unhandled(size_t id) const
{
if (unhandled_delegate.is_valid())
{
unhandled_delegate(id);
Delegates[Range](id);
}
}

/// The default delegate for unhandled ids.
etl::delegate<void(size_t)> unhandled_delegate;
};

//***************************************************************************
Expand Down
110 changes: 55 additions & 55 deletions test/test_delegate_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ SOFTWARE.

namespace
{
const size_t SIZE = 3U;
const size_t OFFSET = 5U;
const size_t Size = 3U;
const size_t Offset = 5U;

using Service = etl::delegate_service<SIZE, OFFSET>;
using Service = etl::delegate_service<Size, Offset>;

//*****************************************************************************
bool global_called = false;
Expand Down Expand Up @@ -122,10 +122,10 @@ namespace
{
enum
{
GLOBAL = OFFSET,
MEMBER1,
MEMBER2,
OUT_OF_RANGE
Global = Offset,
Member1,
Member2,
Out_Of_Range
};

SUITE(test_delegate_service)
Expand All @@ -135,13 +135,13 @@ namespace
{
Service service;

service.register_delegate<GLOBAL>(global_callback);
service.register_delegate<MEMBER1>(test.callback);
service.register_delegate<MEMBER2>(member_callback);
service.register_delegate<Global>(global_callback);
service.register_delegate<Member1>(test.callback);
service.register_delegate<Member2>(member_callback);

service.call<GLOBAL>();
service.call<Global>();

CHECK_EQUAL(GLOBAL, called_id);
CHECK_EQUAL(Global, called_id);
CHECK(global_called);
CHECK(!member1_called);
CHECK(!member2_called);
Expand All @@ -153,13 +153,13 @@ namespace
{
Service service;

service.register_delegate(GLOBAL, global_callback);
service.register_delegate(MEMBER1, test.callback);
service.register_delegate(MEMBER2, member_callback);
service.register_delegate(Global, global_callback);
service.register_delegate(Member1, test.callback);
service.register_delegate(Member2, member_callback);

service.call(GLOBAL);
service.call(Global);

CHECK_EQUAL(GLOBAL, called_id);
CHECK_EQUAL(Global, called_id);
CHECK(global_called);
CHECK(!member1_called);
CHECK(!member2_called);
Expand All @@ -171,13 +171,13 @@ namespace
{
Service service;

service.register_delegate<GLOBAL>(global_callback);
service.register_delegate<MEMBER1>(test.callback);
service.register_delegate<MEMBER2>(member_callback);
service.register_delegate<Global>(global_callback);
service.register_delegate<Member1>(test.callback);
service.register_delegate<Member2>(member_callback);

service.call<MEMBER1>();
service.call<Member1>();

CHECK_EQUAL(MEMBER1, called_id);
CHECK_EQUAL(Member1, called_id);
CHECK(!global_called);
CHECK(member1_called);
CHECK(!member2_called);
Expand All @@ -189,13 +189,13 @@ namespace
{
Service service;

service.register_delegate(GLOBAL, global_callback);
service.register_delegate(MEMBER1, test.callback);
service.register_delegate(MEMBER2, member_callback);
service.register_delegate(Global, global_callback);
service.register_delegate(Member1, test.callback);
service.register_delegate(Member2, member_callback);

service.call(MEMBER1);
service.call(Member1);

CHECK_EQUAL(MEMBER1, called_id);
CHECK_EQUAL(Member1, called_id);
CHECK(!global_called);
CHECK(member1_called);
CHECK(!member2_called);
Expand All @@ -207,13 +207,13 @@ namespace
{
Service service;

service.register_delegate<GLOBAL>(global_callback);
service.register_delegate<MEMBER1>(test.callback);
service.register_delegate<MEMBER2>(member_callback);
service.register_delegate<Global>(global_callback);
service.register_delegate<Member1>(test.callback);
service.register_delegate<Member2>(member_callback);

service.call<MEMBER2>();
service.call<Member2>();

CHECK_EQUAL(MEMBER2, called_id);
CHECK_EQUAL(Member2, called_id);
CHECK(!global_called);
CHECK(!member1_called);
CHECK(member2_called);
Expand All @@ -225,11 +225,11 @@ namespace
{
Service service;

service.register_delegate<GLOBAL>(global_callback);
service.register_delegate<MEMBER1>(test.callback);
service.register_delegate<MEMBER2>(member_callback);
service.register_delegate<Global>(global_callback);
service.register_delegate<Member1>(test.callback);
service.register_delegate<Member2>(member_callback);

service.call(OUT_OF_RANGE);
service.call(Out_Of_Range);

CHECK_EQUAL(UINT_MAX, called_id);
CHECK(!global_called);
Expand All @@ -243,15 +243,15 @@ namespace
{
Service service;

service.register_delegate<GLOBAL>(global_callback);
service.register_delegate<MEMBER1>(test.callback);
service.register_delegate<MEMBER2>(member_callback);
service.register_delegate<Global>(global_callback);
service.register_delegate<Member1>(test.callback);
service.register_delegate<Member2>(member_callback);

service.register_unhandled_delegate(unhandled_callback);

service.call(OUT_OF_RANGE);
service.call(Out_Of_Range);

CHECK_EQUAL(OUT_OF_RANGE, called_id);
CHECK_EQUAL(Out_Of_Range, called_id);
CHECK(!global_called);
CHECK(!member1_called);
CHECK(!member2_called);
Expand All @@ -263,10 +263,10 @@ namespace
{
Service service;

service.register_delegate<GLOBAL>(global_callback);
service.register_delegate<MEMBER2>(member_callback);
service.register_delegate<Global>(global_callback);
service.register_delegate<Member2>(member_callback);

service.call<MEMBER1>();
service.call<Member1>();

CHECK_EQUAL(UINT_MAX, called_id);
CHECK(!global_called);
Expand All @@ -280,10 +280,10 @@ namespace
{
Service service;

service.register_delegate(GLOBAL, global_callback);
service.register_delegate(MEMBER2, member_callback);
service.register_delegate(Global, global_callback);
service.register_delegate(Member2, member_callback);

service.call(MEMBER1);
service.call(Member1);

CHECK_EQUAL(UINT_MAX, called_id);
CHECK(!global_called);
Expand All @@ -297,14 +297,14 @@ namespace
{
Service service;

service.register_delegate<GLOBAL>(global_callback);
service.register_delegate<MEMBER2>(member_callback);
service.register_delegate<Global>(global_callback);
service.register_delegate<Member2>(member_callback);

service.register_unhandled_delegate(unhandled_callback);

service.call<MEMBER1>();
service.call<Member1>();

CHECK_EQUAL(MEMBER1, called_id);
CHECK_EQUAL(Member1, called_id);
CHECK(!global_called);
CHECK(!member1_called);
CHECK(!member2_called);
Expand All @@ -316,14 +316,14 @@ namespace
{
Service service;

service.register_delegate(GLOBAL, global_callback);
service.register_delegate(MEMBER2, member_callback);
service.register_delegate(Global, global_callback);
service.register_delegate(Member2, member_callback);

service.register_unhandled_delegate(unhandled_callback);

service.call(MEMBER1);
service.call(Member1);

CHECK_EQUAL(MEMBER1, called_id);
CHECK_EQUAL(Member1, called_id);
CHECK(!global_called);
CHECK(!member1_called);
CHECK(!member2_called);
Expand Down
53 changes: 35 additions & 18 deletions test/test_delegate_service_compile_time.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ SOFTWARE.

namespace
{
const size_t SIZE = 3U;
const size_t OFFSET = 5U;
const size_t Size = 2U;
const size_t Offset = 5U;

using Service = etl::delegate_service<SIZE, OFFSET>;
using Service = etl::delegate_service<Size, Offset>;

//*****************************************************************************
bool global_called = false;
Expand Down Expand Up @@ -82,7 +82,7 @@ namespace

Test test;

// Callback for 'member2'.
// Callback for 'member'.
constexpr etl::delegate<void(size_t)> member_callback = etl::delegate<void(size_t)>::create<Test, test, &Test::member>();

// Callback for 'global'.
Expand All @@ -91,6 +91,13 @@ namespace
// Callback for 'unhandled'.
constexpr etl::delegate<void(size_t)> unhandled_callback = etl::delegate<void(size_t)>::create<unhandled>();

constexpr etl::delegate<void(size_t)> delegate_list[]
{
global_callback,
member_callback,
unhandled_callback
};

//*****************************************************************************
// Initialises the test results.
//*****************************************************************************
Expand All @@ -110,35 +117,45 @@ namespace
{
enum
{
GLOBAL = OFFSET,
MEMBER,
OUT_OF_RANGE
Global = Offset,
Member,
Out_Of_Range
};

SUITE(test_delegate_service)
{
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_delegate_compile_time_constexpr)
{
static constexpr etl::delegate<void(size_t)> delegate_list[]
{
global_callback,
member_callback
};
etl::delegate_service<Size, Offset, delegate_list> service;

etl::delegate_service<SIZE, OFFSET, delegate_list> service;

service.call<GLOBAL>();
CHECK_EQUAL(GLOBAL, called_id);
service.call<Global>();
CHECK_EQUAL(Global, called_id);
CHECK(global_called);
CHECK(!member_called);
CHECK(!unhandled_called);

called_id = UINT_MAX;
global_called = false;
member_called = false;
unhandled_called = false;

service.call<MEMBER>();
CHECK_EQUAL(MEMBER, called_id);
service.call<Member>();
CHECK_EQUAL(Member, called_id);
CHECK(!global_called);
CHECK(member_called);
CHECK(!unhandled_called);

called_id = UINT_MAX;
global_called = false;
member_called = false;
unhandled_called = false;

service.call(Out_Of_Range);
CHECK_EQUAL(Out_Of_Range, called_id);
CHECK(!global_called);
CHECK(!member_called);
CHECK(unhandled_called);
}
};
}

0 comments on commit 7a061a4

Please sign in to comment.