diff --git a/include/etl/callback_service.h b/include/etl/callback_service.h index e7c207fe..d7122030 100644 --- a/include/etl/callback_service.h +++ b/include/etl/callback_service.h @@ -34,6 +34,7 @@ SOFTWARE. #include "nullptr.h" #include "static_assert.h" #include "function.h" +#include "array.h" namespace etl { @@ -51,14 +52,11 @@ namespace etl /// Reset the callback service. /// Sets all callbacks to the internal default. //************************************************************************* - static void initialize() + callback_service() + : unhandled_callback(*this, &callback_service::unhandled), + p_unhandled(nullptr) { - for (size_t i = 0; i < NUMBER_OF_CALLBACKS; ++i) - { - lookup[i] = &unhandled_callback; - } - - p_unhandled = nullptr; + lookup.fill(&unhandled_callback); } //************************************************************************* @@ -68,7 +66,7 @@ namespace etl /// \param callback reference to the callback. //************************************************************************* template - static void register_callback(etl::ifunction& callback) + void register_callback(etl::ifunction& callback) { ETL_STATIC_ASSERT(ID < NUMBER_OF_CALLBACKS, "Callback Id out of range"); @@ -81,7 +79,7 @@ namespace etl /// \param id Id of the callback. /// \param callback Reference to the callback. //************************************************************************* - static void register_callback(const size_t id, etl::ifunction& callback) + void register_callback(const size_t id, etl::ifunction& callback) { if (id < NUMBER_OF_CALLBACKS) { @@ -95,7 +93,7 @@ namespace etl /// \tparam ID The id of the callback. //************************************************************************* template - static void callback() + void callback() { ETL_STATIC_ASSERT(ID < NUMBER_OF_CALLBACKS, "Callback Id out of range"); @@ -106,7 +104,7 @@ namespace etl /// Executes the callback function for the index. /// \param id Id of the callback. //************************************************************************* - static void callback(const size_t id) + void callback(const size_t id) { if (id < NUMBER_OF_CALLBACKS) { @@ -122,7 +120,7 @@ namespace etl /// Registers an alternative callback for unhandled ids. /// \param callback A reference to the user supplied 'unhandled' callback. //************************************************************************* - static void register_unhandled_callback(etl::ifunction& callback) + void register_unhandled_callback(etl::ifunction& callback) { p_unhandled = &callback; } @@ -133,7 +131,7 @@ namespace etl /// The default callback function. /// Does nothing. //************************************************************************* - static void unhandled(size_t id) + void unhandled(size_t id) { if (p_unhandled != nullptr) { @@ -142,23 +140,14 @@ namespace etl } /// The default callback for unhandled ids. - static etl::function_fp::unhandled> unhandled_callback; + etl::function, size_t> unhandled_callback; /// Pointer to the user defined 'unhandled' callback. - static etl::ifunction* p_unhandled; + etl::ifunction* p_unhandled; /// Lookup table of callbacks. - static etl::ifunction* lookup[NUMBER_OF_CALLBACKS]; + etl::array*, NUMBER_OF_CALLBACKS> lookup; }; - - template - etl::function_fp::unhandled> etl::callback_service::unhandled_callback; - - template - etl::ifunction* etl::callback_service::lookup[NUMBER_OF_CALLBACKS]; - - template - etl::ifunction* etl::callback_service::p_unhandled = nullptr; } #endif diff --git a/test/test_callback_service.cpp b/test/test_callback_service.cpp index acb9ca40..900c4fae 100644 --- a/test/test_callback_service.cpp +++ b/test/test_callback_service.cpp @@ -131,12 +131,13 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_callback_global_compile_time) { - Service::initialize(); - Service::register_callback(global_callback); - Service::register_callback(test.callback); - Service::register_callback(member_callback); + Service service; - Service::callback(); + service.register_callback(global_callback); + service.register_callback(test.callback); + service.register_callback(member_callback); + + service.callback(); CHECK_EQUAL(GLOBAL, called_id); CHECK(global_called); @@ -148,12 +149,13 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_callback_global_run_time) { - Service::initialize(); - Service::register_callback(GLOBAL, global_callback); - Service::register_callback(MEMBER1, test.callback); - Service::register_callback(MEMBER2, member_callback); + Service service; - Service::callback(GLOBAL); + service.register_callback(GLOBAL, global_callback); + service.register_callback(MEMBER1, test.callback); + service.register_callback(MEMBER2, member_callback); + + service.callback(GLOBAL); CHECK_EQUAL(GLOBAL, called_id); CHECK(global_called); @@ -165,12 +167,13 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_callback_member1_compile_time) { - Service::initialize(); - Service::register_callback(global_callback); - Service::register_callback(test.callback); - Service::register_callback(member_callback); + Service service; - Service::callback(); + service.register_callback(global_callback); + service.register_callback(test.callback); + service.register_callback(member_callback); + + service.callback(); CHECK_EQUAL(MEMBER1, called_id); CHECK(!global_called); @@ -182,12 +185,13 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_callback_member1_run_time) { - Service::initialize(); - Service::register_callback(GLOBAL, global_callback); - Service::register_callback(MEMBER1, test.callback); - Service::register_callback(MEMBER2, member_callback); + Service service; - Service::callback(MEMBER1); + service.register_callback(GLOBAL, global_callback); + service.register_callback(MEMBER1, test.callback); + service.register_callback(MEMBER2, member_callback); + + service.callback(MEMBER1); CHECK_EQUAL(MEMBER1, called_id); CHECK(!global_called); @@ -199,12 +203,13 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_callback_member2_compile_time) { - Service::initialize(); - Service::register_callback(global_callback); - Service::register_callback(test.callback); - Service::register_callback(member_callback); + Service service; - Service::callback(); + service.register_callback(global_callback); + service.register_callback(test.callback); + service.register_callback(member_callback); + + service.callback(); CHECK_EQUAL(MEMBER2, called_id); CHECK(!global_called); @@ -216,12 +221,13 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_callback_unhandled_out_of_range_run_time_default) { - Service::initialize(); - Service::register_callback(global_callback); - Service::register_callback(test.callback); - Service::register_callback(member_callback); + Service service; - Service::callback(OUT_OF_RANGE); + service.register_callback(global_callback); + service.register_callback(test.callback); + service.register_callback(member_callback); + + service.callback(OUT_OF_RANGE); CHECK_EQUAL(UINT_MAX, called_id); CHECK(!global_called); @@ -233,14 +239,15 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_callback_unhandled_out_of_range_run_time_user_supplied) { - Service::initialize(); - Service::register_callback(global_callback); - Service::register_callback(test.callback); - Service::register_callback(member_callback); + Service service; - Service::register_unhandled_callback(unhandled_callback); + service.register_callback(global_callback); + service.register_callback(test.callback); + service.register_callback(member_callback); - Service::callback(OUT_OF_RANGE); + service.register_unhandled_callback(unhandled_callback); + + service.callback(OUT_OF_RANGE); CHECK_EQUAL(OUT_OF_RANGE, called_id); CHECK(!global_called); @@ -252,11 +259,12 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_callback_unhandled_not_registered_compile_time_default) { - Service::initialize(); - Service::register_callback(global_callback); - Service::register_callback(member_callback); + Service service; - Service::callback(); + service.register_callback(global_callback); + service.register_callback(member_callback); + + service.callback(); CHECK_EQUAL(UINT_MAX, called_id); CHECK(!global_called); @@ -268,11 +276,12 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_callback_unhandled_not_registered_run_time_default) { - Service::initialize(); - Service::register_callback(GLOBAL, global_callback); - Service::register_callback(MEMBER2, member_callback); + Service service; - Service::callback(MEMBER1); + service.register_callback(GLOBAL, global_callback); + service.register_callback(MEMBER2, member_callback); + + service.callback(MEMBER1); CHECK_EQUAL(UINT_MAX, called_id); CHECK(!global_called); @@ -284,13 +293,14 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_callback_not_registered_compile_time_user_supplied) { - Service::initialize(); - Service::register_callback(global_callback); - Service::register_callback(member_callback); + Service service; - Service::register_unhandled_callback(unhandled_callback); + service.register_callback(global_callback); + service.register_callback(member_callback); - Service::callback(); + service.register_unhandled_callback(unhandled_callback); + + service.callback(); CHECK_EQUAL(MEMBER1, called_id); CHECK(!global_called); @@ -302,13 +312,14 @@ namespace //************************************************************************* TEST_FIXTURE(SetupFixture, test_callback_unhandled_run_time_user_supplied) { - Service::initialize(); - Service::register_callback(GLOBAL, global_callback); - Service::register_callback(MEMBER2, member_callback); + Service service; - Service::register_unhandled_callback(unhandled_callback); + service.register_callback(GLOBAL, global_callback); + service.register_callback(MEMBER2, member_callback); - Service::callback(MEMBER1); + service.register_unhandled_callback(unhandled_callback); + + service.callback(MEMBER1); CHECK_EQUAL(MEMBER1, called_id); CHECK(!global_called);