From aaf1f84935aeb362949af248fbcfd7aff61b0481 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 18 May 2022 16:49:42 +0100 Subject: [PATCH] Updates to etl::successor --- include/etl/successor.h | 12 +++ test/test_successor.cpp | 139 ++++++++++++++++++++++++++++++++ test/vs2019/etl.vcxproj.filters | 102 ++++++++++++----------- 3 files changed, 205 insertions(+), 48 deletions(-) diff --git a/include/etl/successor.h b/include/etl/successor.h index 1b6836bf..c19f57f0 100644 --- a/include/etl/successor.h +++ b/include/etl/successor.h @@ -155,6 +155,18 @@ namespace etl p_successor = ETL_NULLPTR; } + //************************************************************************* + /// Clear the successor chain. + //************************************************************************* + void clear_successor_chain() + { + if (has_successor()) + { + get_successor().clear_successor_chain(); + clear_successor(); + } + } + //************************************************************************* /// Get the successor. /// Emits an etl::successor_invalid if a successor has not been set. diff --git a/test/test_successor.cpp b/test/test_successor.cpp index a36974bf..dcc76fd3 100644 --- a/test/test_successor.cpp +++ b/test/test_successor.cpp @@ -371,6 +371,145 @@ namespace CHECK_EQUAL(2, successor2.value); CHECK_EQUAL(3, successor3.value); } + + //************************************************************************* + TEST(test_clear_successor) + { + SuccessorSameBase1 successor1; + SuccessorSameBase2 successor2; + SuccessorSameBase3 successor3; + SuccessorSameBase4 successor4; + SuccessorSameBase5 successor5; + + successor1.set_successor(successor2, successor3, successor4, successor5); + + successor2.clear_successor(); + + CHECK(successor1.has_successor()); + CHECK(!successor2.has_successor()); + CHECK(successor3.has_successor()); + CHECK(successor4.has_successor()); + CHECK(!successor5.has_successor()); + } + + //************************************************************************* + TEST(test_clear_successor_chain) + { + SuccessorSameBase1 successor1; + SuccessorSameBase2 successor2; + SuccessorSameBase3 successor3; + SuccessorSameBase4 successor4; + SuccessorSameBase5 successor5; + + successor1.set_successor(successor2, successor3, successor4, successor5); + + successor2.clear_successor_chain(); + + CHECK(successor1.has_successor()); + CHECK(!successor2.has_successor()); + CHECK(!successor3.has_successor()); + CHECK(!successor4.has_successor()); + CHECK(!successor5.has_successor()); + } + + //************************************************************************* + TEST(test_interative_successors) + { + class IProcessor : public etl::successor + { + public: + + //********************************* + virtual bool Check() = 0; + + //********************************* + bool Process() + { + bool handled = false; + + IProcessor* p = this; + + while (handled == false) + { + handled = p->Check(); + + // Were we unable to handle the call? + if (handled == false) + { + // Do we have a successor? + if (p->has_successor()) + { + // Get the next successor. + p = &(p->get_successor()); + } + else + { + break; + } + } + } + + return handled; + } + }; + + //********************************* + class Processor1 : public IProcessor + { + public: + + bool Check() override + { + return false; + } + }; + + //********************************* + class Processor2 : public IProcessor + { + public: + + bool Check() override + { + return false; + } + }; + + //********************************* + class Processor3 : public IProcessor + { + public: + + bool Check() override + { + return false; + } + }; + + //********************************* + class Processor4 : public IProcessor + { + public: + + bool Check() override + { + return true; + } + }; + + Processor1 processor1a; + Processor1 processor1b; + Processor2 processor2a; + Processor2 processor2b; + Processor3 processor3; + Processor4 processor4; + + processor1a.append_successor(processor2a, processor3); + processor1b.append_successor(processor2b, processor4); + + CHECK(processor1a.Process() == false); + CHECK(processor1b.Process() == true); + } } } diff --git a/test/vs2019/etl.vcxproj.filters b/test/vs2019/etl.vcxproj.filters index 9eaf26e8..f37e8a61 100644 --- a/test/vs2019/etl.vcxproj.filters +++ b/test/vs2019/etl.vcxproj.filters @@ -196,6 +196,12 @@ {4ee68175-3bc2-4d30-b8bf-be7261124979} + + {ba688ff7-bea4-4f7e-bfab-1033d3401426} + + + {ba80408c-0198-432a-a213-e4e2db946aab} + @@ -417,21 +423,9 @@ ETL\Frameworks - - ETL\Frameworks - ETL\Containers - - ETL\Frameworks - - - ETL\Frameworks - - - ETL\Frameworks - ETL\Frameworks @@ -456,9 +450,6 @@ ETL\Utilities - - ETL\Frameworks - ETL\Frameworks @@ -708,9 +699,6 @@ ETL\Utilities\Mutex - - ETL\Frameworks - ETL\Utilities @@ -756,12 +744,6 @@ ETL\Frameworks\Generators - - ETL\Frameworks\Generators - - - ETL\Frameworks\Generators - ETL\Containers\Generators @@ -816,15 +798,6 @@ ETL\Utilities - - ETL\Frameworks - - - ETL\Frameworks - - - ETL\Frameworks - ETL\Containers @@ -834,9 +807,6 @@ ETL\Utilities - - ETL\Frameworks - ETL\Utilities @@ -852,9 +822,6 @@ ETL\Containers - - ETL\Frameworks - Tests\Sanity Checks\C++03 @@ -963,18 +930,12 @@ ETL\Frameworks - - ETL\Frameworks - ETL\Private ETL\Private - - ETL\Frameworks - ETL\Utilities @@ -1173,9 +1134,6 @@ ETL\Frameworks - - ETL\Frameworks - UnitTest++\Header Files @@ -1275,6 +1233,54 @@ UnitTest++\Header Files\Win32 + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging + + + ETL\Messaging\Generators + + + ETL\Messaging\Generators +