A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
Stream.cc
1#include "Stream.hh"
2
3#include <cstring>
4
5namespace Kinoko::EGG {
6
7Stream::Stream() : m_endian(std::endian::big), m_index(0) {}
8
9Stream::~Stream() = default;
10
11void Stream::skip(u32 count) {
12 m_index += count;
13 ASSERT(!bad());
14}
15
16void Stream::jump(u32 index) {
17 m_index = index;
18 ASSERT(!bad());
19}
20
21u8 Stream::read_u8() {
22 return read<u8>();
23}
24
25u16 Stream::read_u16() {
26 return read<u16>();
27}
28
29u32 Stream::read_u32() {
30 return read<u32>();
31}
32
33u64 Stream::read_u64() {
34 return read<u64>();
35}
36
37s8 Stream::read_s8() {
38 return read<s8>();
39}
40
41s16 Stream::read_s16() {
42 return read<s16>();
43}
44
45s32 Stream::read_s32() {
46 return read<s32>();
47}
48
49s64 Stream::read_s64() {
50 return read<s64>();
51}
52
53f32 Stream::read_f32() {
54 return read<f32>();
55}
56
57f64 Stream::read_f64() {
58 return read<f64>();
59}
60
61void Stream::write_u8(u8 val) {
62 return write(val);
63}
64
65void Stream::write_u16(u16 val) {
66 return write(val);
67}
68
69void Stream::write_u32(u32 val) {
70 return write(val);
71}
72
73void Stream::write_u64(u64 val) {
74 return write(val);
75}
76
77void Stream::write_s8(s8 val) {
78 return write(val);
79}
80
81void Stream::write_s16(s16 val) {
82 return write(val);
83}
84
85void Stream::write_s32(s32 val) {
86 return write(val);
87}
88
89void Stream::write_s64(s64 val) {
90 return write(val);
91}
92
93void Stream::write_f32(f32 val) {
94 return write(val);
95}
96
97void Stream::write_f64(f64 val) {
98 return write(val);
99}
100
101RamStream::RamStream() : m_buffer(nullptr), m_size(0) {}
102
103RamStream::RamStream(const void *buffer, u32 size) {
104 setBufferAndSize(const_cast<void *>(buffer), size);
105}
106
107void RamStream::read(void *output, u32 size) {
108 u8 *buffer = reinterpret_cast<u8 *>(output);
109 for (size_t i = 0; i < size; ++i) {
110 buffer[i] = m_buffer[m_index + i];
111 }
112}
113
114void RamStream::write(void *input, u32 size) {
115 u8 *buffer = reinterpret_cast<u8 *>(input);
116 for (size_t i = 0; i < size; ++i) {
117 m_buffer[m_index + i] = buffer[i];
118 }
119}
120
121// Expects a null-terminated char array, and moves the index past the null terminator
122const char *RamStream::read_string() {
123 const char *ret = reinterpret_cast<char *>(m_buffer + m_index);
124 m_index += strlen(ret) + 1;
125 ASSERT(!bad());
126 return ret;
127}
128
129void RamStream::setBufferAndSize(void *buffer, u32 size) {
130 m_buffer = reinterpret_cast<u8 *>(buffer);
131 m_size = size;
132}
133
138RamStream RamStream::split(u32 size) {
139 RamStream stream = RamStream(m_buffer + m_index, size);
140 m_index += size;
141 ASSERT(!bad());
142
143 return stream;
144}
145
146} // namespace Kinoko::EGG
RamStream split(u32 size)
Splits the current stream into two.
Definition Stream.cc:138
EGG core library.
Definition Allocator.hh:5