VisuTwin Canvas
C++ 3D Engine — Metal Backend
Loading...
Searching...
No Matches
readStream.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2025-2026 Arnis Lektauers
3#pragma once
4
5#include <cstdint>
6#include <stdexcept>
7#include <string>
8#include <vector>
9
10namespace visutwin::canvas
11{
13 {
14 public:
15 explicit ReadStream(std::vector<uint8_t> data) : _data(std::move(data)) {}
16
17 [[nodiscard]] size_t remainingBytes() const
18 {
19 return _data.size() - _offset;
20 }
21
22 void reset(const size_t offset = 0)
23 {
24 _offset = offset;
25 }
26
27 void skip(const size_t bytes)
28 {
29 _offset += bytes;
30 }
31
32 void align(const size_t bytes)
33 {
34 _offset = (_offset + bytes - 1) & (~(bytes - 1));
35 }
36
37 char readChar()
38 {
39 return static_cast<char>(readU8());
40 }
41
42 std::string readChars(const size_t numChars)
43 {
44 std::string result;
45 result.reserve(numChars);
46 for (size_t i = 0; i < numChars; ++i) {
47 result += readChar();
48 }
49 return result;
50 }
51
52 uint8_t readU8()
53 {
54 ensure(1);
55 return _data[_offset++];
56 }
57
58 uint16_t readU16()
59 {
60 const auto index = increment(2);
61 return static_cast<uint16_t>(_data[index] | (_data[index + 1] << 8));
62 }
63
64 uint32_t readU32()
65 {
66 const auto index = increment(4);
67 return static_cast<uint32_t>(_data[index] |
68 (_data[index + 1] << 8) |
69 (_data[index + 2] << 16) |
70 (_data[index + 3] << 24));
71 }
72
73 uint64_t readU64()
74 {
75 const uint64_t low = readU32();
76 const uint64_t high = readU32();
77 return low + (high << 32);
78 }
79
80 uint32_t readU32be()
81 {
82 const auto index = increment(4);
83 return static_cast<uint32_t>((_data[index] << 24) |
84 (_data[index + 1] << 16) |
85 (_data[index + 2] << 8) |
86 _data[index + 3]);
87 }
88
89 void readArray(std::vector<uint8_t>& result)
90 {
91 for (auto& value : result) {
92 value = readU8();
93 }
94 }
95
96 std::string readLine()
97 {
98 std::string result;
99 while (_offset < _data.size()) {
100 const char c = readChar();
101 if (c == '\n') {
102 break;
103 }
104 result += c;
105 }
106 return result;
107 }
108
109 private:
110 void ensure(const size_t amount) const
111 {
112 if (_offset + amount > _data.size()) {
113 throw std::out_of_range("ReadStream overflow");
114 }
115 }
116
117 size_t increment(const size_t amount)
118 {
119 ensure(amount);
120 _offset += amount;
121 return _offset - amount;
122 }
123
124 std::vector<uint8_t> _data;
125 size_t _offset = 0;
126 };
127}
void readArray(std::vector< uint8_t > &result)
Definition readStream.h:89
ReadStream(std::vector< uint8_t > data)
Definition readStream.h:15
std::string readChars(const size_t numChars)
Definition readStream.h:42
size_t remainingBytes() const
Definition readStream.h:17
void align(const size_t bytes)
Definition readStream.h:32
void reset(const size_t offset=0)
Definition readStream.h:22
void skip(const size_t bytes)
Definition readStream.h:27