SuperMarioOdysseyOnline/include/al/byaml/writer/ByamlWriterData.h
2022-06-16 14:33:18 -07:00

268 lines
7.7 KiB
C++

#pragma once
#include <basis/seadTypes.h>
#include <container/seadTList.h>
namespace sead {
class WriteStream;
}
namespace al {
class ByamlWriterData {
public:
virtual ~ByamlWriterData();
virtual void makeIndex();
virtual u32 calcPackSize() const;
virtual u8 getTypeCode() const;
virtual bool isContainer() const;
virtual void write(sead::WriteStream*) const;
virtual void print(int) const;
void printIndent(int) const;
};
class ByamlWriterBool : public ByamlWriterData {
public:
ByamlWriterBool(bool);
u8 getTypeCode() const override;
void write(sead::WriteStream*) const override;
void print(int) const override;
private:
bool mValue;
};
class ByamlWriterInt : public ByamlWriterData {
public:
ByamlWriterInt(int);
u8 getTypeCode() const override;
void write(sead::WriteStream*) const override;
void print(int) const override;
private:
int mValue;
};
class ByamlWriterFloat : public ByamlWriterData {
public:
ByamlWriterFloat(float);
u8 getTypeCode() const override;
void write(sead::WriteStream*) const override;
void print(int) const override;
private:
float mValue;
};
class ByamlWriterUInt : public ByamlWriterData {
public:
ByamlWriterUInt(u32);
u8 getTypeCode() const override;
void write(sead::WriteStream*) const override;
void print(int) const override;
private:
u32 mValue;
};
class ByamlWriterNull : public ByamlWriterData {
public:
ByamlWriterNull();
u8 getTypeCode() const override;
void write(sead::WriteStream*) const override;
void print(int) const override;
};
class ByamlWriterStringTable;
class ByamlWriterString : public ByamlWriterData {
public:
ByamlWriterString(const char*, ByamlWriterStringTable*);
u8 getTypeCode() const override;
void write(sead::WriteStream*) const override;
void print(int) const override;
private:
const char* mString;
ByamlWriterStringTable* mStringTable;
};
class ByamlWriterBigDataList;
class ByamlWriterBigData : public ByamlWriterData {
public:
ByamlWriterBigData(al::ByamlWriterBigDataList*);
~ByamlWriterBigData();
void write(sead::WriteStream*) const override;
virtual u32 calcBigDataSize() const;
virtual void writeBigData(sead::WriteStream*) const;
void setOffset(int offset) { mOffset = offset; }
private:
al::ByamlWriterBigDataList* mList;
int mOffset = 0;
};
class ByamlWriterInt64 : public ByamlWriterBigData {
public:
ByamlWriterInt64(long, ByamlWriterBigDataList*);
~ByamlWriterInt64();
u8 getTypeCode() const override;
void writeBigData(sead::WriteStream*) const override;
void print(int) const override;
private:
long mValue;
};
class ByamlWriterUInt64 : public ByamlWriterBigData {
public:
ByamlWriterUInt64(u64, ByamlWriterBigDataList*);
~ByamlWriterUInt64();
u8 getTypeCode() const override;
void writeBigData(sead::WriteStream*) const override;
void print(int) const override;
private:
u64 mValue;
};
class ByamlWriterDouble : public ByamlWriterBigData {
public:
ByamlWriterDouble(double, ByamlWriterBigDataList*);
~ByamlWriterDouble();
u8 getTypeCode() const override;
void writeBigData(sead::WriteStream*) const override;
void print(int) const override;
private:
double mValue;
};
class ByamlWriterHash;
class ByamlWriterArray;
class ByamlWriterStringTable;
class ByamlWriterContainer : public ByamlWriterData {
public:
bool isContainer() const override;
virtual void addBool(const char*, bool);
virtual void addInt(const char*, s32);
virtual void addUInt(const char*, u32);
virtual void addFloat(const char*, float);
virtual void addInt64(const char*, s64, ByamlWriterBigDataList*);
virtual void addUInt64(const char*, u64, ByamlWriterBigDataList*);
virtual void addDouble(const char*, double, ByamlWriterBigDataList*);
virtual void addString(const char*, const char*);
virtual void addHash(const char*, ByamlWriterHash*);
virtual void addArray(const char*, ByamlWriterArray*);
virtual void addNull(const char*);
virtual void addBool(bool);
virtual void addInt(s32);
virtual void addUInt(u32);
virtual void addFloat(float);
virtual void addInt64(s64, ByamlWriterBigDataList*);
virtual void addUInt64(u64, ByamlWriterBigDataList*);
virtual void addDouble(double, ByamlWriterBigDataList*);
virtual void addString(const char*);
virtual void addHash(ByamlWriterHash*);
virtual void addArray(ByamlWriterArray*);
virtual void addNull();
virtual void writeContainer(sead::WriteStream*) const;
virtual bool isHash() const;
virtual bool isArray() const;
virtual void deleteData();
int getOffset() const { return mOffset; }
void setOffset(int offset) { mOffset = offset; }
private:
int mOffset = 0; // FIXME shouldn't be public
};
class ByamlWriterArray : public ByamlWriterContainer {
public:
ByamlWriterArray(ByamlWriterStringTable*);
~ByamlWriterArray();
void deleteData() override;
u32 calcPackSize() const override;
void addData(al::ByamlWriterData*);
void addBool(bool) override;
void addInt(s32) override;
void addUInt(u32) override;
void addFloat(float) override;
void addInt64(s64, ByamlWriterBigDataList*) override;
void addUInt64(u64, ByamlWriterBigDataList*) override;
void addDouble(double, ByamlWriterBigDataList*) override;
void addString(const char*) override;
void addHash(ByamlWriterHash*) override;
void addArray(ByamlWriterArray*) override;
void addNull() override;
u8 getTypeCode() const override;
void writeContainer(sead::WriteStream*) const override;
void write(sead::WriteStream*) const override;
void print(int) const override;
bool isArray() const override;
private:
sead::TList<ByamlWriterData*> mList;
al::ByamlWriterStringTable* mStringTable;
};
static_assert(sizeof(ByamlWriterArray) == 0x30);
class ByamlWriterHashPair : public sead::ListNode {
public:
ByamlWriterHashPair(const char*, ByamlWriterData*);
const char* getKey() { return mKey; }
al::ByamlWriterData* getValue() { return mValue; }
private:
void* selfReference = this;
void* test2 = nullptr;
const char* mKey;
al::ByamlWriterData* mValue;
};
static_assert(sizeof(ByamlWriterHashPair) == 0x30);
class ByamlWriterHash : public ByamlWriterContainer {
public:
ByamlWriterHash(ByamlWriterStringTable*, ByamlWriterStringTable*);
~ByamlWriterHash();
void deleteData() override; // TODO implementation missing
u32 calcPackSize() const override;
void addData(const char*, al::ByamlWriterData*); // TODO implementation missing
void addBool(const char*, bool) override;
void addInt(const char*, s32) override;
void addUInt(const char*, u32) override;
void addFloat(const char*, float) override;
void addInt64(const char*, s64, ByamlWriterBigDataList*) override;
void addUInt64(const char*, u64, ByamlWriterBigDataList*) override;
void addDouble(const char*, double, ByamlWriterBigDataList*) override;
void addString(const char*, const char*) override;
void addHash(const char*, ByamlWriterHash*) override;
void addArray(const char*, ByamlWriterArray*) override;
void addNull(const char*) override;
u8 getTypeCode() const override;
void writeContainer(sead::WriteStream*) const override; // TODO implementation missing
void write(sead::WriteStream*) const override;
void print(int) const override; // TODO implementation missing
bool isHash() const override;
private:
sead::TList<ByamlWriterHashPair> mList; // TODO not really... it's something different here.
al::ByamlWriterStringTable* mStringTable1;
al::ByamlWriterStringTable* mStringTable2;
};
static_assert(sizeof(ByamlWriterHash) == 0x38);
} // namespace al