diff options
author | ivanmorozov <ivanmorozov@yandex-team.com> | 2022-10-21 12:24:37 +0300 |
---|---|---|
committer | ivanmorozov <ivanmorozov@yandex-team.com> | 2022-10-21 12:24:37 +0300 |
commit | df864686c3757d3f7186d276ee2a7c22005d69ab (patch) | |
tree | 7de23d6902467e310bb6615a94033cbf8bbb7104 | |
parent | da6b80efbb16a0dffe6c3ef42e67b8ae6ce0e922 (diff) | |
download | ydb-df864686c3757d3f7186d276ee2a7c22005d69ab.tar.gz |
event for anything (temporary compatibility with simple events)
-rw-r--r-- | library/cpp/actors/core/actor.cpp | 6 | ||||
-rw-r--r-- | library/cpp/actors/core/actor_virtual.h | 28 | ||||
-rw-r--r-- | library/cpp/actors/core/event.h | 12 |
3 files changed, 30 insertions, 16 deletions
diff --git a/library/cpp/actors/core/actor.cpp b/library/cpp/actors/core/actor.cpp index 1247a1dd01e..3be4043168a 100644 --- a/library/cpp/actors/core/actor.cpp +++ b/library/cpp/actors/core/actor.cpp @@ -187,10 +187,8 @@ namespace NActors { } void TActorVirtualBehaviour::Receive(IActor* actor, std::unique_ptr<IEventHandle> ev) { - Y_VERIFY(!!ev); - Y_ASSERT(dynamic_cast<IEventBehavioral*>(ev->GetBase())); - IEventBehavioral* eActor = static_cast<IEventBehavioral*>(ev->GetBase()); - eActor->Execute(actor, std::move(ev)); + Y_VERIFY(!!ev && ev->GetBase()); + ev->GetBase()->Execute(actor, std::move(ev)); } } diff --git a/library/cpp/actors/core/actor_virtual.h b/library/cpp/actors/core/actor_virtual.h index 9af1559c80b..c9c34c4729d 100644 --- a/library/cpp/actors/core/actor_virtual.h +++ b/library/cpp/actors/core/actor_virtual.h @@ -19,29 +19,35 @@ public: TEventContext(std::unique_ptr<IEventHandle> handle) : Handle(std::move(handle)) { - Y_ASSERT(dynamic_cast<TEvent*>(Handle->GetBase())); + Y_VERIFY_DEBUG(dynamic_cast<TEvent*>(Handle->GetBase())); Event = static_cast<TEvent*>(Handle->GetBase()); Y_VERIFY(Event); } }; -class IEventBehavioral: public IEventBase { +template <class TEvent, class TExpectedActor> +class IEventForActor: public IEventBase { protected: - virtual bool DoExecute(IActor* actor, std::unique_ptr<IEventHandle> eventPtr) = 0; -public: - bool Execute(IActor* actor, std::unique_ptr<IEventHandle> eventPtr) { - return DoExecute(actor, std::move(eventPtr)); + virtual bool DoExecute(IActor* actor, std::unique_ptr<IEventHandle> eventPtr) override { + Y_VERIFY_DEBUG(dynamic_cast<TExpectedActor*>(actor)); + auto* actorCorrect = static_cast<TExpectedActor*>(actor); + TEventContext<TEvent> context(std::move(eventPtr)); + actorCorrect->ProcessEvent(context); + return true; } +public: }; -template <class TEvent, class TExpectedActor> -class IEventForActor: public IEventBehavioral { +template <class TBaseEvent, class TEvent, class TExpectedObject> +class IEventForAnything: public TBaseEvent { protected: virtual bool DoExecute(IActor* actor, std::unique_ptr<IEventHandle> eventPtr) override { - Y_ASSERT(dynamic_cast<TExpectedActor*>(actor)); - auto* actorCorrect = static_cast<TExpectedActor*>(actor); + auto* objImpl = dynamic_cast<TExpectedObject*>(actor); + if (!objImpl) { + return false; + } TEventContext<TEvent> context(std::move(eventPtr)); - actorCorrect->ProcessEvent(context); + objImpl->ProcessEvent(context); return true; } public: diff --git a/library/cpp/actors/core/event.h b/library/cpp/actors/core/event.h index 6ff02aaf943..6b92edaf41b 100644 --- a/library/cpp/actors/core/event.h +++ b/library/cpp/actors/core/event.h @@ -12,7 +12,7 @@ namespace NActors { class TChunkSerializer; - + class IActor; class ISerializerToStream { public: virtual bool SerializeToArcadiaStream(TChunkSerializer*) const = 0; @@ -21,12 +21,22 @@ namespace NActors { class IEventBase : TNonCopyable, public ISerializerToStream { + protected: + // for compatibility with virtual actors + virtual bool DoExecute(IActor* /*actor*/, std::unique_ptr<IEventHandle> /*eventPtr*/) { + Y_VERIFY_DEBUG(false); + return false; + } public: // actual typing is performed by IEventHandle virtual ~IEventBase() { } + bool Execute(IActor* actor, std::unique_ptr<IEventHandle> eventPtr) { + return DoExecute(actor, std::move(eventPtr)); + } + virtual TString ToStringHeader() const = 0; virtual TString ToString() const { return ToStringHeader(); |