annotate include/core/byte_stream.h @ 370:ea3a74ed2ef9

*: hm, last commit wasn't quite finished?
author Paper <paper@tflc.us>
date Fri, 25 Jul 2025 10:22:04 -0400
parents 47c9f8502269
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
1 #ifndef MINORI_CORE_BYTE_STREAM_H_
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
2 #define MINORI_CORE_BYTE_STREAM_H_
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
3
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
4 #include "core/endian.h"
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
5
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
6 #include <cstdint>
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
7 #include <cstdlib>
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
8 #include <string>
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
9 #include <type_traits>
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
10 #include <vector>
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
11
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
12 struct ByteStream {
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
13 public:
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
14 enum class ByteOrder {
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
15 Little,
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
16 Big,
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
17 };
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
18
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
19 ByteStream(std::uint8_t *bytes, std::size_t size);
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
20
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
21 void ResetOffset();
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
22 void SetEndianness(ByteOrder endian);
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
23
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
24 template<typename T>
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
25 bool ReadBinary(T &ret)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
26 {
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
27 if (offset_ + sizeof(T) >= size_)
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
28 return false;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
29
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
30 std::memcpy(&ret, bytes_ + offset_, sizeof(ret));
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
31 Advance(sizeof(T));
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
32 return true;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
33 }
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
34
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
35 template<typename T>
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
36 bool ReadInt(T &ret)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
37 {
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
38 static_assert(std::is_integral<T>::value);
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
39
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
40 if (!ReadBinary<T>(ret))
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
41 return false;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
42
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
43 switch (endian_) {
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
44 case ByteOrder::Little:
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
45 if constexpr (std::is_unsigned<T>::value) {
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
46 ret = Endian::byteswap_little_to_host(ret);
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
47 } else {
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
48 ret = Endian::signed_byteswap_little_to_host(ret);
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
49 }
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
50 break;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
51 case ByteOrder::Big:
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
52 if constexpr (std::is_unsigned<T>::value) {
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
53 ret = Endian::byteswap_big_to_host(ret);
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
54 } else {
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
55 ret = Endian::signed_byteswap_big_to_host(ret);
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
56 }
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
57 break;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
58 default:
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
59 /* can't know for sure. punt */
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
60 return false;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
61 }
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
62
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
63 return true;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
64 }
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
65
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
66 bool ReadString(std::string &str, std::size_t size);
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
67 bool Advance(std::size_t amount);
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
68
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
69 private:
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
70 /* raw data */
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
71 std::uint8_t *bytes_ = nullptr;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
72 std::size_t offset_ = 0;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
73 std::size_t size_ = 0;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
74
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
75 ByteOrder endian_ = ByteOrder::Little;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
76 };
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
77
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents:
diff changeset
78 #endif /* MINORI_CORE_BYTE_STREAM_H_ */