Mercurial > minori
annotate include/core/byte_stream.h @ 393:963047512d34
*: clang-format
| author | Paper <paper@tflc.us> |
|---|---|
| date | Fri, 07 Nov 2025 07:16:15 -0500 |
| parents | 47c9f8502269 |
| children |
| 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 | 6 #include <cstdint> |
| 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 | 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 | 25 bool ReadBinary(T &ret) |
| 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 | 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 | 36 bool ReadInt(T &ret) |
| 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_) { |
| 393 | 44 case ByteOrder::Little: |
| 45 if constexpr (std::is_unsigned<T>::value) { | |
| 46 ret = Endian::byteswap_little_to_host(ret); | |
| 47 } else { | |
| 48 ret = Endian::signed_byteswap_little_to_host(ret); | |
| 49 } | |
| 50 break; | |
| 51 case ByteOrder::Big: | |
| 52 if constexpr (std::is_unsigned<T>::value) { | |
| 53 ret = Endian::byteswap_big_to_host(ret); | |
| 54 } else { | |
| 55 ret = Endian::signed_byteswap_big_to_host(ret); | |
| 56 } | |
| 57 break; | |
| 58 default: | |
| 59 /* can't know for sure. punt */ | |
| 60 return false; | |
|
364
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 | 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_ */ |
