summaryrefslogtreecommitdiff
path: root/src/KingSystem/Utils/Thread/MessageTransceiverId.h
blob: 63a731842f07701c8e03b8035f2557542853ac82 (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 <basis/seadTypes.h>
#include <tuple>

#include "KingSystem/Utils/Types.h"

namespace ksys {

class MessageReceiver;

struct MesTransceiverId {
    MesTransceiverId() : receiver(), self_ref() { reset(); }
    MesTransceiverId(const MesTransceiverId& other) { *this = other; }
    MesTransceiverId(u32& id, MessageReceiver* receiver)
        : id(++id), receiver(receiver), self_ref() {}
    ~MesTransceiverId() { reset(); }

    void reset() {
        queue_id = 0xffffffff;
        id = 0xffffffff;
        receiver = nullptr;
        self_ref = nullptr;
    }

    MesTransceiverId& operator=(const MesTransceiverId& other) {
        queue_id = other.queue_id;
        id = other.id;
        receiver = other.receiver;
        self_ref = other.self_ref;
        return *this;
    }

    bool isRegistered() const {
        if (!self_ref || !*self_ref)
            return false;

        const auto fields = [](const MesTransceiverId& i) { return std::tie(i.queue_id, i.id); };
        return fields(*this) == fields(**self_ref);
    }

    u32 queue_id = 0xffffffff;
    u32 id = 0xffffffff;
    MessageReceiver* receiver;
    /// If registered, this points to a pointer that points to this object.
    /// Otherwise, this value is nullptr.
    MesTransceiverId** self_ref;
};
KSYS_CHECK_SIZE_NX150(MesTransceiverId, 0x18);

}  // namespace ksys