1#pragma once
2
3#include <basis/seadTypes.h>
4#include <container/seadTList.h>
5
6namespace sead {
7class WriteStream;
8}
9
10namespace al {
11
12class ByamlWriterData {
13public:
14 virtual ~ByamlWriterData() = default;
15
16 virtual void makeIndex() {}
17
18 virtual u32 calcPackSize() const { return 4; }
19
20 virtual u8 getTypeCode() const { return 0; }
21
22 virtual bool isContainer() const { return false; }
23
24 virtual void write(sead::WriteStream*) const;
25
26 virtual void print(s32) const {}
27
28 void printIndent(s32) const;
29};
30
31class ByamlWriterBool : public ByamlWriterData {
32public:
33 ByamlWriterBool(bool);
34 u8 getTypeCode() const override;
35 void write(sead::WriteStream*) const override;
36 void print(s32) const override;
37
38private:
39 bool mValue;
40};
41
42class ByamlWriterInt : public ByamlWriterData {
43public:
44 ByamlWriterInt(s32);
45 u8 getTypeCode() const override;
46 void write(sead::WriteStream*) const override;
47 void print(s32) const override;
48
49private:
50 s32 mValue;
51};
52
53class ByamlWriterFloat : public ByamlWriterData {
54public:
55 ByamlWriterFloat(f32);
56 u8 getTypeCode() const override;
57 void write(sead::WriteStream*) const override;
58 void print(s32) const override;
59
60private:
61 f32 mValue;
62};
63
64class ByamlWriterUInt : public ByamlWriterData {
65public:
66 ByamlWriterUInt(u32);
67 u8 getTypeCode() const override;
68 void write(sead::WriteStream*) const override;
69 void print(s32) const override;
70
71private:
72 u32 mValue;
73};
74
75class ByamlWriterNull : public ByamlWriterData {
76public:
77 ByamlWriterNull();
78 u8 getTypeCode() const override;
79 void write(sead::WriteStream*) const override;
80 void print(s32) const override;
81};
82
83class ByamlWriterStringTable;
84
85class ByamlWriterString : public ByamlWriterData {
86public:
87 ByamlWriterString(const char*, ByamlWriterStringTable*);
88 u8 getTypeCode() const override;
89 void write(sead::WriteStream*) const override;
90 void print(s32) const override;
91
92private:
93 const char* mString;
94 ByamlWriterStringTable* mStringTable;
95};
96
97class ByamlWriterBigDataList;
98
99class ByamlWriterBigData : public ByamlWriterData {
100public:
101 ByamlWriterBigData(ByamlWriterBigDataList*);
102 ~ByamlWriterBigData() = default;
103 void write(sead::WriteStream*) const override;
104
105 virtual u32 calcBigDataSize() const { return 8; }
106
107 virtual void writeBigData(sead::WriteStream*) const {}
108
109 void setOffset(s32 offset) { mOffset = offset; }
110
111private:
112 ByamlWriterBigDataList* mList;
113 s32 mOffset = 0;
114};
115
116class ByamlWriterInt64 : public ByamlWriterBigData {
117public:
118 ByamlWriterInt64(s64, ByamlWriterBigDataList*);
119 ~ByamlWriterInt64() = default;
120 u8 getTypeCode() const override;
121 void writeBigData(sead::WriteStream*) const override;
122 void print(s32) const override;
123
124private:
125 s64 mValue;
126};
127
128class ByamlWriterUInt64 : public ByamlWriterBigData {
129public:
130 ByamlWriterUInt64(u64, ByamlWriterBigDataList*);
131 ~ByamlWriterUInt64() = default;
132 u8 getTypeCode() const override;
133 void writeBigData(sead::WriteStream*) const override;
134 void print(s32) const override;
135
136private:
137 u64 mValue;
138};
139
140class ByamlWriterDouble : public ByamlWriterBigData {
141public:
142 ByamlWriterDouble(f64, ByamlWriterBigDataList*);
143 ~ByamlWriterDouble() = default;
144 u8 getTypeCode() const override;
145 void writeBigData(sead::WriteStream*) const override;
146 void print(s32) const override;
147
148private:
149 f64 mValue;
150};
151
152class ByamlWriterHash;
153class ByamlWriterArray;
154class ByamlWriterStringTable;
155
156class ByamlWriterContainer : public ByamlWriterData {
157public:
158 bool isContainer() const override { return true; }
159
160 virtual void addBool(const char*, bool) {}
161
162 virtual void addInt(const char*, s32) {}
163
164 virtual void addUInt(const char*, u32) {}
165
166 virtual void addFloat(const char*, f32) {}
167
168 virtual void addInt64(const char*, s64, ByamlWriterBigDataList*) {}
169
170 virtual void addUInt64(const char*, u64, ByamlWriterBigDataList*) {}
171
172 virtual void addDouble(const char*, f64, ByamlWriterBigDataList*) {}
173
174 virtual void addString(const char*, const char*) {}
175
176 virtual void addHash(const char*, ByamlWriterHash*) {}
177
178 virtual void addArray(const char*, ByamlWriterArray*) {}
179
180 virtual void addNull(const char*) {}
181
182 virtual void addBool(bool) {}
183
184 virtual void addInt(s32) {}
185
186 virtual void addUInt(u32) {}
187
188 virtual void addFloat(f32) {}
189
190 virtual void addInt64(s64, ByamlWriterBigDataList*) {}
191
192 virtual void addUInt64(u64, ByamlWriterBigDataList*) {}
193
194 virtual void addDouble(f64, ByamlWriterBigDataList*) {}
195
196 virtual void addString(const char*) {}
197
198 virtual void addHash(ByamlWriterHash*) {}
199
200 virtual void addArray(ByamlWriterArray*) {}
201
202 virtual void addNull() {}
203
204 virtual void writeContainer(sead::WriteStream*) const {}
205
206 virtual bool isHash() const { return false; }
207
208 virtual bool isArray() const { return false; }
209
210 virtual void deleteData() {}
211
212 s32 getOffset() const { return mOffset; }
213
214 void setOffset(s32 offset) { mOffset = offset; }
215
216private:
217 s32 mOffset = 0;
218};
219
220class ByamlWriterArray : public ByamlWriterContainer {
221public:
222 ByamlWriterArray(ByamlWriterStringTable*);
223 ~ByamlWriterArray();
224
225 void deleteData() override;
226 u32 calcPackSize() const override;
227
228 void addData(ByamlWriterData*);
229 void addBool(bool) override;
230 void addInt(s32) override;
231 void addUInt(u32) override;
232 void addFloat(f32) override;
233 void addInt64(s64, ByamlWriterBigDataList*) override;
234 void addUInt64(u64, ByamlWriterBigDataList*) override;
235 void addDouble(f64, ByamlWriterBigDataList*) override;
236 void addString(const char*) override;
237 void addHash(ByamlWriterHash*) override;
238 void addArray(ByamlWriterArray*) override;
239 void addNull() override;
240
241 u8 getTypeCode() const override;
242 void writeContainer(sead::WriteStream*) const override;
243 void write(sead::WriteStream*) const override;
244 void print(s32) const override;
245
246 bool isArray() const override { return true; }
247
248private:
249 sead::TList<ByamlWriterData*> mList;
250 ByamlWriterStringTable* mStringTable;
251};
252
253static_assert(sizeof(ByamlWriterArray) == 0x30);
254
255class ByamlWriterHashPair : public sead::ListNode {
256public:
257 ByamlWriterHashPair(const char*, ByamlWriterData*);
258
259 const char* getKey() { return mKey; }
260
261 ByamlWriterData* getValue() { return mValue; }
262
263private:
264 void* mSelfReference = this;
265 void* unk = nullptr;
266 const char* mKey;
267 ByamlWriterData* mValue;
268};
269
270static_assert(sizeof(ByamlWriterHashPair) == 0x30);
271
272class ByamlWriterHash : public ByamlWriterContainer {
273public:
274 ByamlWriterHash(ByamlWriterStringTable*, ByamlWriterStringTable*);
275 ~ByamlWriterHash();
276
277 void deleteData() override; // TODO implementation missing
278 u32 calcPackSize() const override;
279
280 void addData(const char*, ByamlWriterData*); // TODO implementation missing
281 void addBool(const char*, bool) override;
282 void addInt(const char*, s32) override;
283 void addUInt(const char*, u32) override;
284 void addFloat(const char*, f32) override;
285 void addInt64(const char*, s64, ByamlWriterBigDataList*) override;
286 void addUInt64(const char*, u64, ByamlWriterBigDataList*) override;
287 void addDouble(const char*, f64, ByamlWriterBigDataList*) override;
288 void addString(const char*, const char*) override;
289 void addHash(const char*, ByamlWriterHash*) override;
290 void addArray(const char*, ByamlWriterArray*) override;
291 void addNull(const char*) override;
292
293 u8 getTypeCode() const override;
294 void writeContainer(sead::WriteStream*) const override; // TODO implementation missing
295 void write(sead::WriteStream*) const override;
296 void print(s32) const override; // TODO implementation missing
297
298 bool isHash() const override { return true; }
299
300private:
301 sead::TList<ByamlWriterHashPair> mList; // TODO not really... it's something different here.
302 ByamlWriterStringTable* mStringTable1;
303 ByamlWriterStringTable* mStringTable2;
304};
305
306static_assert(sizeof(ByamlWriterHash) == 0x38);
307
308} // namespace al
309