1#pragma once
2
3#include <container/seadTList.h>
4
5namespace sead {
6class Heap;
7class WriteStream;
8} // namespace sead
9
10namespace al {
11
12class ByamlWriterStringTable;
13class ByamlWriterContainer;
14class ByamlWriterBigDataList;
15
16class ByamlWriterArray;
17class ByamlWriterHash;
18
19class ByamlIter;
20
21class ByamlWriter {
22public:
23 ByamlWriter(sead::Heap*, bool);
24 virtual ~ByamlWriter();
25
26 void addBool(bool);
27 void addInt(s32);
28 void addUInt(u32);
29 void addFloat(f32);
30 void addInt64(s64);
31 void addUInt64(u64);
32 void addDouble(f64);
33 void addString(const char*);
34 void addNull();
35 void addBool(const char*, bool);
36 void addInt(const char*, s32);
37 void addUInt(const char*, u32);
38 void addFloat(const char*, f32);
39 void addInt64(const char*, s64);
40 void addUInt64(const char*, u64);
41 void addDouble(const char*, f64);
42 void addString(const char*, const char*);
43 void addNull(const char*);
44
45 ByamlWriterArray* getArrayCurrentContainer();
46 ByamlWriterHash* getHashCurrentContainer();
47 ByamlWriterContainer* getCurrentContainer();
48 void pushHash();
49 void pushContainer(ByamlWriterContainer*);
50 void pushArray();
51 void pushArray(const char*);
52 void pushHash(const char*);
53 void pushIter(const ByamlIter&);
54 void pushIter(const char*, const ByamlIter&);
55 void pushLocalIter(const ByamlIter&, const char*);
56 void pop();
57 u32 calcHeaderSize() const;
58 u32 calcPackSize() const;
59 void write(sead::WriteStream*);
60 void print() const;
61
62private:
63 sead::Heap* mHeap;
64 ByamlWriterStringTable* mStringTable1 = nullptr;
65 ByamlWriterStringTable* mStringTable2 = nullptr;
66 sead::TList<ByamlWriterContainer*> mContainerList;
67 ByamlWriterBigDataList* mBigDataList = nullptr;
68 ByamlWriterContainer** mContainerStack = nullptr;
69 s32 mContainerStackSize = 64;
70 s32 mCurrentContainerIndex = -1;
71 bool mAlwaysFalse;
72};
73
74} // namespace al
75