aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorivanmorozov <ivanmorozov@yandex-team.com>2022-10-21 12:24:37 +0300
committerivanmorozov <ivanmorozov@yandex-team.com>2022-10-21 12:24:37 +0300
commitdf864686c3757d3f7186d276ee2a7c22005d69ab (patch)
tree7de23d6902467e310bb6615a94033cbf8bbb7104
parentda6b80efbb16a0dffe6c3ef42e67b8ae6ce0e922 (diff)
downloadydb-df864686c3757d3f7186d276ee2a7c22005d69ab.tar.gz
event for anything (temporary compatibility with simple events)
-rw-r--r--library/cpp/actors/core/actor.cpp6
-rw-r--r--library/cpp/actors/core/actor_virtual.h28
-rw-r--r--library/cpp/actors/core/event.h12
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();