summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actBaseProcJobHandler.h
blob: 4ba4c1d49226ec7c71e7a7b4492fbab7154b6c23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#pragma once

#include <prim/seadDelegate.h>
#include "KingSystem/ActorSystem/actBaseProcJob.h"
#include "KingSystem/Utils/Types.h"

namespace ksys::act {

class BaseProcJobHandler {
public:
    explicit BaseProcJobHandler(BaseProc* proc);
    virtual ~BaseProcJobHandler() = default;
    virtual void invoke() = 0;
    virtual void invokeSpecial() {}

    BaseProcJobLink& getLink() { return mLink; }
    const BaseProcJobLink& getLink() const { return mLink; }

protected:
    BaseProcJobLink mLink;
};
KSYS_CHECK_SIZE_NX150(BaseProcJobHandler, 0x30);

/// For binding actor member functions.
template <typename T>
class BaseProcJobHandlerT : public BaseProcJobHandler {
public:
    BaseProcJobHandlerT(T* proc, void (T::*fn)()) : BaseProcJobHandler(proc), mDelegate(proc, fn) {}

    void invoke() override { mDelegate.invoke(); }

private:
    sead::Delegate<T> mDelegate;
};

/// For binding two actor member functions.
template <typename T>
class BaseProcJobHandlerDualT : public BaseProcJobHandler {
public:
    BaseProcJobHandlerDualT(T* proc, void (T::*fn)(), void (T::*fn_special)())
        : BaseProcJobHandler(proc), mDelegate(proc, fn), mDelegateSpecial(proc, fn_special) {}

    void invoke() override { mDelegate.invoke(); }
    void invokeSpecial() override { mDelegateSpecial.invoke(); }

private:
    sead::Delegate<T> mDelegate;
    sead::Delegate<T> mDelegateSpecial;
};

}  // namespace ksys::act