Altered 'unhandled' delegate to tbe the last in the array for the constexpr vspecialisation.

This commit is contained in:
John Wellbelove 2021-07-23 12:50:17 +01:00
parent d49c2d28e0
commit 7a061a43cd
3 changed files with 91 additions and 103 deletions

View File

@ -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.
@ -91,29 +82,9 @@ namespace etl
}
else
{
if (unhandled_delegate.is_valid())
{
unhandled_delegate(id);
}
Delegates[Range](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);
}
}
/// The default delegate for unhandled ids.
etl::delegate<void(size_t)> unhandled_delegate;
};
//***************************************************************************

View File

@ -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;
@ -122,10 +122,10 @@ namespace
{
enum
{
GLOBAL = OFFSET,
MEMBER1,
MEMBER2,
OUT_OF_RANGE
Global = Offset,
Member1,
Member2,
Out_Of_Range
};
SUITE(test_delegate_service)
@ -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);
@ -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);
@ -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);
@ -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);
@ -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);
@ -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);
@ -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);
@ -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);
@ -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);
@ -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);
@ -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);

View File

@ -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;
@ -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'.
@ -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.
//*****************************************************************************
@ -110,9 +117,9 @@ namespace
{
enum
{
GLOBAL = OFFSET,
MEMBER,
OUT_OF_RANGE
Global = Offset,
Member,
Out_Of_Range
};
SUITE(test_delegate_service)
@ -120,25 +127,35 @@ namespace
//*************************************************************************
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);
}
};
}