diff --git a/examples/SharedMessage/SharedMessage.cpp b/examples/SharedMessage/SharedMessage.cpp new file mode 100644 index 00000000..ca4e7609 --- /dev/null +++ b/examples/SharedMessage/SharedMessage.cpp @@ -0,0 +1,188 @@ +// SharedMessage.cpp : This file contains the 'main' function. Program execution begins and ends there. +// + +#include "etl/shared_message.h" +#include "etl/message.h" +#include "etl/reference_counted_message_pool.h" +#include "etl/message_router.h" +#include "etl/message_bus.h" +#include "etl/fixed_sized_memory_block_allocator.h" +#include "etl/queue.h" + +#include +#include +#include + +constexpr etl::message_router_id_t RouterId1 = 1U; +constexpr etl::message_router_id_t RouterId2 = 2U; + +//***************************************************************************** +struct Message1 : public etl::message<1> +{ + Message1(std::string s_) + : s(s_) + { + + } + + std::string s; +}; + +//***************************************************************************** +struct Message2 : public etl::message<2> +{ + Message2(std::string s_) + : s(s_) + { + + } + + std::string s; +}; + +//***************************************************************************** +void Print(const std::string& prefix, const etl::shared_message& sm) +{ + std::cout << prefix << " : " << int(sm.get_message().get_message_id()) << "\n"; +} + +//***************************************************************************** +class MessageRouter1 : public etl::message_router +{ +public: + + //**************************************** + MessageRouter1() + : message_router(RouterId1) + { + } + + //**************************************** + void on_receive(etl::imessage_router& source, const Message1& msg) + { + std::cout << "on_receive Message1 : " << msg.s << "\n"; + } + + //**************************************** + void on_receive(etl::imessage_router& source, const Message2& msg) + { + std::cout << "on_receive Message2 : " << msg.s << "\n"; + } + + //**************************************** + void on_receive_unknown(etl::imessage_router& source, const etl::imessage& msg) + { + std::cout << "on_receive Unknown\n"; + } +}; + +//***************************************************************************** +class MessageRouter2 : public etl::message_router +{ +public: + + using base_t = etl::message_router; + + //**************************************** + MessageRouter2() + : message_router(RouterId2) + { + } + + using base_t::receive; + + //**************************************** + void receive(etl::imessage_router& source, etl::shared_message shared_msg) override + { + if (!queue.full()) + { + Print("Queueing shared message", shared_msg); + + queue.push(QueuedData{ &source, shared_msg }); + } + } + + //**************************************** + void process_queue() + { + while (!queue.empty()) + { + // Get the shared message from the queue. + QueuedData data = queue.front(); + + Print("Process queued shared messages", data.shared_msg); + + // Send it to the base implementation for routing. + base_t::receive(*data.source, data.shared_msg); + + queue.pop(); + } + } + + //**************************************** + void on_receive(etl::imessage_router& source, const Message1& msg) + { + std::cout << "on_receive Message1 : " << msg.s << "\n"; + } + + //**************************************** + void on_receive(etl::imessage_router& source, const Message2& msg) + { + std::cout << "on_receive Message2 : " << msg.s << "\n"; + } + + //**************************************** + void on_receive_unknown(etl::imessage_router& source, const etl::imessage& msg) + { + std::cout << "on_receive Unknown\n"; + } + +private: + + struct QueuedData + { + etl::imessage_router* source; + etl::shared_message shared_msg; + }; + + etl::queue queue; +}; + +//***************************************************************************** +struct Bus : public etl::message_bus<2U> +{ +}; + +//***************************************************************************** +MessageRouter1 router1; +MessageRouter2 router2; +Bus bus; + +//***************************************************************************** +// The memory block allocator that supplies the pool with memory +// to store reference counted messages in. +etl::fixed_sized_memory_block_allocator<100U, 4U, 4U> memory_pool; + +//***************************************************************************** +// The pool that supplies reference counted messages. +// Uses memory_pool as its allocator. +etl::reference_counted_message_pool pool(memory_pool); + +//***************************************************************************** +int main() +{ + Message1 m1("One"); + Message2 m2("Two"); + + etl::shared_message sm1(pool, m1); + etl::shared_message sm2(pool, m2); + + bus.subscribe(router1); + bus.subscribe(router2); + + bus.receive(sm1); + bus.receive(sm2); + + router2.process_queue(); +} + diff --git a/examples/SharedMessage/SharedMessage.sln b/examples/SharedMessage/SharedMessage.sln new file mode 100644 index 00000000..fec1c6e1 --- /dev/null +++ b/examples/SharedMessage/SharedMessage.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30804.86 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SharedMessage", "SharedMessage.vcxproj", "{0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Debug|x64.ActiveCfg = Debug|x64 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Debug|x64.Build.0 = Debug|x64 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Debug|x86.ActiveCfg = Debug|Win32 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Debug|x86.Build.0 = Debug|Win32 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Release|x64.ActiveCfg = Release|x64 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Release|x64.Build.0 = Release|x64 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Release|x86.ActiveCfg = Release|Win32 + {0BDB4F2A-47E7-4105-A66A-6DFF8A76587B}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F7B7515D-19FA-42D4-9BA2-5F85A7FB7779} + EndGlobalSection +EndGlobal diff --git a/examples/SharedMessage/SharedMessage.vcxproj b/examples/SharedMessage/SharedMessage.vcxproj new file mode 100644 index 00000000..24249971 --- /dev/null +++ b/examples/SharedMessage/SharedMessage.vcxproj @@ -0,0 +1,165 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {0bdb4f2a-47e7-4105-a66a-6dff8a76587b} + SharedMessage + 10.0 + + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + D:\Users\John\Documents\Programming\GitHub\etl\include;%(AdditionalIncludeDirectories) + stdcpp17 + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/SharedMessage/SharedMessage.vcxproj.filters b/examples/SharedMessage/SharedMessage.vcxproj.filters new file mode 100644 index 00000000..673bfd20 --- /dev/null +++ b/examples/SharedMessage/SharedMessage.vcxproj.filters @@ -0,0 +1,66 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/examples/SharedMessage/etl_profile.h b/examples/SharedMessage/etl_profile.h new file mode 100644 index 00000000..e69de29b