mirror of
https://github.com/zeldaret/botw
synced 2026-05-26 23:47:16 -04:00
106 lines
2.9 KiB
C++
106 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include <basis/seadTypes.h>
|
|
#include <tuple>
|
|
#include "KingSystem/Utils/Thread/MessageTransceiverId.h"
|
|
|
|
namespace ksys {
|
|
|
|
struct MessageType {
|
|
MessageType() = default;
|
|
MessageType(u32 v) : value(v) {} // NOLINT(google-explicit-constructor)
|
|
|
|
u32 value;
|
|
};
|
|
|
|
class MessageDelayer {
|
|
public:
|
|
MessageDelayer() = default;
|
|
virtual ~MessageDelayer() = default;
|
|
virtual bool shouldProcessMessage() = 0;
|
|
};
|
|
|
|
class Message {
|
|
public:
|
|
struct DelayParams {
|
|
DelayParams() : delay_ticks(), delayer() {}
|
|
DelayParams(const DelayParams& other) { *this = other; }
|
|
// Yes, this operator is quite pointless, but we need it to match.
|
|
DelayParams& operator=(const DelayParams& other) {
|
|
delay_ticks = other.delay_ticks;
|
|
delayer = other.delayer;
|
|
return *this;
|
|
}
|
|
|
|
int delay_ticks;
|
|
MessageDelayer* delayer;
|
|
};
|
|
|
|
Message();
|
|
Message(const Message& message) { *this = message; }
|
|
Message(const MesTransceiverId& source, const MesTransceiverId& destination,
|
|
const MessageType& type, void* user_data, const DelayParams& delay_params, bool ack);
|
|
Message(const MesTransceiverId& source, const MessageType& type, void* user_data,
|
|
const DelayParams& delay_params, bool ack);
|
|
|
|
virtual ~Message();
|
|
|
|
Message& operator=(const Message& other) {
|
|
mSource = other.getSource();
|
|
mDestination = other.getDestination();
|
|
mType = other.getType();
|
|
mUserData = other.getUserData();
|
|
mBrokerId = other.getBrokerId();
|
|
mDelayParams = other.mDelayParams;
|
|
mShouldAck = other.shouldAck();
|
|
return *this;
|
|
}
|
|
|
|
virtual const MesTransceiverId& getSource() const;
|
|
virtual const MesTransceiverId& getDestination() const;
|
|
virtual const MessageType& getType() const;
|
|
virtual void* getUserData() const;
|
|
virtual u32 getBrokerId() const;
|
|
virtual bool shouldAck() const;
|
|
virtual void setDestination(const MesTransceiverId& dest);
|
|
virtual void setBrokerId(const u32& v);
|
|
virtual bool shouldBeProcessed() const;
|
|
|
|
bool hasDelayer() const { return mDelayParams.delayer != nullptr; }
|
|
|
|
void decrementDelay() {
|
|
if (mDelayParams.delay_ticks != 0)
|
|
--mDelayParams.delay_ticks;
|
|
}
|
|
|
|
void reset() {
|
|
mType = {};
|
|
mUserData = {};
|
|
mBrokerId = 0xffffffff;
|
|
mDelayParams = {};
|
|
mShouldAck = {};
|
|
mSource.reset();
|
|
mDestination.reset();
|
|
}
|
|
|
|
void resetIfValid() {
|
|
if (isValid())
|
|
reset();
|
|
}
|
|
|
|
bool isValid() const { return mDestination.isRegistered(); }
|
|
|
|
void setBrokerId_(u32 id) { mBrokerId = id; }
|
|
|
|
private:
|
|
MesTransceiverId mSource{};
|
|
MesTransceiverId mDestination{};
|
|
MessageType mType{};
|
|
void* mUserData{};
|
|
u32 mBrokerId = 0xffffffff;
|
|
DelayParams mDelayParams{};
|
|
bool mShouldAck = true;
|
|
};
|
|
|
|
} // namespace ksys
|