15 virtual void read(
void *output,
u32 size) = 0;
16 virtual void write(
void *input,
u32 size) = 0;
17 virtual bool eof()
const = 0;
18 virtual bool safe(
u32 size)
const = 0;
19 virtual bool bad()
const = 0;
24 void setEndian(std::endian endian) {
28 [[nodiscard]]
u32 index()
const {
32 [[nodiscard]] u8 read_u8();
33 [[nodiscard]]
u16 read_u16();
34 [[nodiscard]]
u32 read_u32();
35 [[nodiscard]] u64 read_u64();
36 [[nodiscard]] s8 read_s8();
37 [[nodiscard]] s16 read_s16();
38 [[nodiscard]]
s32 read_s32();
39 [[nodiscard]] s64 read_s64();
40 [[nodiscard]] f32 read_f32();
41 [[nodiscard]] f64 read_f64();
43 void write_u8(u8 val);
44 void write_u16(
u16 val);
45 void write_u32(
u32 val);
46 void write_u64(u64 val);
47 void write_s8(s8 val);
48 void write_s16(s16 val);
49 void write_s32(
s32 val);
50 void write_s64(s64 val);
51 void write_f32(f32 val);
52 void write_f64(f64 val);
59 template <ParseableType T>
60 [[nodiscard]] T read() {
61 ASSERT(safe(
sizeof(T)));
63 read(&val,
sizeof(val));
64 m_index +=
sizeof(val);
66 return parse<T>(val, m_endian);
69 template <ParseableType T>
71 ASSERT(safe(
sizeof(T)));
72 T parsedVal = parse<T>(val, m_endian);
73 write(&parsedVal,
sizeof(parsedVal));
74 m_index +=
sizeof(parsedVal);