From 0dc07525309ecc1d522fa4f18ecb09993b035f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Thu, 20 Aug 2020 01:26:10 +0200 Subject: ksys/act: Implement ActorLinkConstDataAccess --- src/KingSystem/ActorSystem/actActor.h | 2 ++ .../ActorSystem/actActorLinkConstDataAccess.cpp | 33 ++++++++++++++++++++++ .../ActorSystem/actActorLinkConstDataAccess.h | 15 ++++++++++ 3 files changed, 50 insertions(+) (limited to 'src') diff --git a/src/KingSystem/ActorSystem/actActor.h b/src/KingSystem/ActorSystem/actActor.h index cc51e126..39f41064 100644 --- a/src/KingSystem/ActorSystem/actActor.h +++ b/src/KingSystem/ActorSystem/actActor.h @@ -11,6 +11,8 @@ public: Actor(); // FIXME ~Actor() override; + SEAD_RTTI_OVERRIDE(Actor, BaseProc) + void emitBasicSigOn(); void emitBasicSigOff(); }; diff --git a/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp b/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp index e69de29b..476482ce 100644 --- a/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp +++ b/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp @@ -0,0 +1,33 @@ +#include "KingSystem/ActorSystem/actActorLinkConstDataAccess.h" +#include "KingSystem/ActorSystem/actBaseProc.h" + +namespace ksys::act { + +ActorLinkConstDataAccess::~ActorLinkConstDataAccess() { + if (mAcquired) + acquire(nullptr); +} + +bool ActorLinkConstDataAccess::acquire(BaseProc* proc) { + if (mProc) { + if (mAcquired) + mProc->release(); + + mAcquired = false; + mProc = nullptr; + } + + if (proc) + return proc->acquire(*this); + return false; +} + +bool ActorLinkConstDataAccess::hasProc(BaseProc* proc) const { + return mProc == proc; +} + +void ActorLinkConstDataAccess::debugLog(s32, const sead::SafeString&) { + // Intentionally left empty. +} + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.h b/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.h index 628138b1..ff4258ec 100644 --- a/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.h +++ b/src/KingSystem/ActorSystem/actActorLinkConstDataAccess.h @@ -1,5 +1,8 @@ #pragma once +#include +#include + namespace ksys { namespace act { @@ -9,9 +12,21 @@ class BaseProc; /// Provides read-only access to actor data for safe, multi-threaded access. class ActorLinkConstDataAccess { public: + ActorLinkConstDataAccess() = default; + explicit ActorLinkConstDataAccess(BaseProc* proc) { acquire(proc); } + /// Destructor that automatically releases any acquired BaseProc. ~ActorLinkConstDataAccess(); + /// Acquire a BaseProc. This increments its reference count. + /// If an actor was already acquired, it is released. + bool acquire(BaseProc* proc); + + /// Checks whether the acquired BaseProc is `proc`. + bool hasProc(BaseProc* proc) const; + private: + void debugLog(s32, const sead::SafeString& method_name); + bool mAcquired = false; BaseProc* mProc = nullptr; }; -- cgit v1.2.3