1#pragma once
2
3#include "basis/seadTypes.h"
4#include "prim/seadEndian.h"
5#include "prim/seadSafeString.h"
6
7namespace sead
8{
9class StreamFormat;
10class StreamSrc;
11
12class Stream
13{
14public:
15 enum class Modes
16 {
17 Binary = 0,
18 Text = 1,
19 };
20
21 Stream();
22 Stream(StreamSrc* src, Modes mode);
23 Stream(StreamSrc* src, StreamFormat* format);
24 virtual ~Stream() = default;
25
26 void skip(u32);
27 void skip(u32, u32);
28 void rewind();
29 bool isEOF();
30
31 void setBinaryEndian(Endian::Types endian);
32 void setMode(Modes mode);
33 void setUserFormat(StreamFormat* format);
34
35protected:
36 StreamFormat* mFormat;
37 StreamSrc* mSrc;
38 Endian::Types mEndian;
39};
40
41class ReadStream : public Stream
42{
43public:
44 u8 readU8();
45 void readU8(u8&);
46 u16 readU16();
47 void readU16(u16&);
48 u32 readU32();
49 void readU32(u32&);
50 u64 readU64();
51 void readU64(u64&);
52 s8 readS8();
53 void readS8(s8&);
54 s16 readS16();
55 void readS16(s16&);
56 s32 readS32();
57 void readS32(s32&);
58 s64 readS64();
59 void readS64(s64&);
60 f32 readF32();
61 void readF32(f32&);
62 void readBit(void*, u32);
63 void readString(BufferedSafeString*, u32);
64 u32 readMemBlock(void*, u32);
65
66private:
67 f32 readF32BitImpl_(u32, u32);
68 f64 readF64BitImpl_(u32, u32);
69};
70
71class WriteStream : public ReadStream
72{
73public:
74 ~WriteStream() override = default;
75
76 void writeU8(u8);
77 void writeU16(u16);
78 void writeU32(u32);
79 void writeU64(u64);
80 void writeS8(s8);
81 void writeS16(s16);
82 void writeS32(s32);
83 void writeS64(s64);
84 void writeF32(f32);
85 void writeBit(const void*, u32);
86 void writeString(const SafeString&, u32);
87 void writeMemBlock(const void*, u32);
88 void writeComment(const SafeString&);
89 void writeLineComment(const SafeString&);
90 void writeDecorationText(const SafeString&);
91 void writeNullChar();
92 void flush();
93
94private:
95 void writeF32BitImpl_(f32, u32, u32);
96 void writeF64BitImpl_(f64, u32, u32);
97};
98} // namespace sead
99