#pragma once #include "ddkit/utils/Logger.hpp" namespace ddkit { namespace actors { // // IComponent, IObserver, ISender // // IObserver or ISender class IComponent { public: virtual std::string module() = 0; virtual bool isService() = 0; // caution: these method-names refer to Service and Client (Actor), virtual bool isObserver() = 0; // in which the Sender/Observer live, not to IService/IClient! // exceptionally we have (very lightweight) convenience-methods in the interface as well inline bool isClient() { return !isService(); } inline bool isSender() { return !isObserver(); } virtual ~IComponent() = default; }; class IObserver : public IComponent { public: // IComponent std::string module() override = 0; bool isService() override = 0; bool isObserver() override { return true; } virtual void clearCallbacks() {} virtual ~IObserver() = default; }; typedef std::shared_ptr IObserverPtr; class ISender : public IComponent { public: // IComponent std::string module() override = 0; bool isService() override = 0; bool isObserver() override { return false; } virtual ~ISender() = default; }; typedef std::shared_ptr ISenderPtr; // // static_asserts to be included in every template-function // // observer w/o object - call checkTypeOfObserver(); template void checkObserverType() { DDKIT_LOG_TRACE; static_assert(std::is_base_of::value, "Observer not derived from IObserver"); static_assert(!std::is_same::value, "Observer same class as IObserver"); } // observer with object - simply call checkTypeOfObserver(observer); template void checkTypeOfObserver(Observer* observer) { DDKIT_LOG_TRACE << DDKIT_LOG_VAR_VALUE(observer); checkObserverType(); } // sender w/o object - call checkSenderType(); template void checkSenderType() { DDKIT_LOG_TRACE; static_assert(std::is_base_of::value, "Sender not derived from ISender"); static_assert(!std::is_same::value, "Sender same class as ISender"); static_assert(std::is_base_of::value, "Sender not derived from TypeUser"); } // sender with object - simply call checkTypeOfSender(sender); template void checkTypeOfSender(Sender* sender) { DDKIT_LOG_TRACE << DDKIT_LOG_VAR_VALUE(sender); checkSenderType(); } } // namespace actors } // namespace ddkit