Updates to etl::successor

This commit is contained in:
John Wellbelove 2022-05-18 16:49:42 +01:00
parent 48b0c52e92
commit aaf1f84935
3 changed files with 205 additions and 48 deletions

View File

@ -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.

View File

@ -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<IProcessor>
{
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);
}
}
}

View File

@ -196,6 +196,12 @@
<Filter Include="Resource Files\Scripts">
<UniqueIdentifier>{4ee68175-3bc2-4d30-b8bf-be7261124979}</UniqueIdentifier>
</Filter>
<Filter Include="ETL\Messaging">
<UniqueIdentifier>{ba688ff7-bea4-4f7e-bfab-1033d3401426}</UniqueIdentifier>
</Filter>
<Filter Include="ETL\Messaging\Generators">
<UniqueIdentifier>{ba80408c-0198-432a-a213-e4e2db946aab}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\include\etl\enum_type.h">
@ -417,21 +423,9 @@
<ClInclude Include="..\..\include\etl\fsm.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_router.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\packet.h">
<Filter>ETL\Containers</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_bus.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_types.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\scheduler.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
@ -456,9 +450,6 @@
<ClInclude Include="..\..\include\etl\compare.h">
<Filter>ETL\Utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_timer.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\callback_timer.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
@ -708,9 +699,6 @@
<ClInclude Include="..\..\include\etl\mutex\mutex_freertos.h">
<Filter>ETL\Utilities\Mutex</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_packet.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\null_type.h">
<Filter>ETL\Utilities</Filter>
</ClInclude>
@ -756,12 +744,6 @@
<ClInclude Include="..\..\include\etl\generators\fsm_generator.h">
<Filter>ETL\Frameworks\Generators</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\generators\message_packet_generator.h">
<Filter>ETL\Frameworks\Generators</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\generators\message_router_generator.h">
<Filter>ETL\Frameworks\Generators</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\generators\variant_pool_generator.h">
<Filter>ETL\Containers\Generators</Filter>
</ClInclude>
@ -816,15 +798,6 @@
<ClInclude Include="..\..\include\etl\multi_range.h">
<Filter>ETL\Utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\ireference_counted_message_pool.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\reference_counted_message.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\reference_counted_message_pool.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\generic_pool.h">
<Filter>ETL\Containers</Filter>
</ClInclude>
@ -834,9 +807,6 @@
<ClInclude Include="..\..\include\etl\file_error_numbers.h">
<Filter>ETL\Utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\shared_message.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\reference_counted_object.h">
<Filter>ETL\Utilities</Filter>
</ClInclude>
@ -852,9 +822,6 @@
<ClInclude Include="..\..\include\etl\imemory_block_allocator.h">
<Filter>ETL\Containers</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_router_registry.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\sanity-check\c++03\etl_profile.h">
<Filter>Tests\Sanity Checks\C++03</Filter>
</ClInclude>
@ -963,18 +930,12 @@
<ClInclude Include="..\..\include\etl\callback_timer_locked.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_timer_atomic.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\private\delegate_cpp03.h">
<Filter>ETL\Private</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\private\delegate_cpp11.h">
<Filter>ETL\Private</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_timer_locked.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\bit.h">
<Filter>ETL\Utilities</Filter>
</ClInclude>
@ -1173,9 +1134,6 @@
<ClInclude Include="..\..\include\etl\callback_timer_interrupt.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_timer_interrupt.h">
<Filter>ETL\Frameworks</Filter>
</ClInclude>
<ClInclude Include="..\unittest++\AssertException.h">
<Filter>UnitTest++\Header Files</Filter>
</ClInclude>
@ -1275,6 +1233,54 @@
<ClInclude Include="..\unittest++\Win32\TimeHelpers.h">
<Filter>UnitTest++\Header Files\Win32</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\ireference_counted_message_pool.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_bus.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_packet.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_router.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_router_registry.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_timer.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_timer_atomic.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_timer_interrupt.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_timer_locked.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\message_types.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\reference_counted_message.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\reference_counted_message_pool.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\shared_message.h">
<Filter>ETL\Messaging</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\generators\message_packet_generator.h">
<Filter>ETL\Messaging\Generators</Filter>
</ClInclude>
<ClInclude Include="..\..\include\etl\generators\message_router_generator.h">
<Filter>ETL\Messaging\Generators</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\test_string_char.cpp">