1 #ifndef IOUTILITIES_BINERYREADER_H
2 #define IOUTILITIES_BINERYREADER_H
4 #include "../conversion/binaryconversion.h"
14 BinaryReader(std::istream *stream,
bool giveOwnership =
false);
19 const std::istream *stream()
const;
20 std::istream *stream();
21 void setStream(std::istream *stream,
bool giveOwnership =
false);
22 bool hasOwnership()
const;
24 void detatchOwnership();
28 std::istream::pos_type readStreamsize();
29 void read(
char *buffer, std::streamsize length);
30 void read(std::uint8_t *buffer, std::streamsize length);
31 void read(std::vector<char> &buffer, std::streamsize length);
32 std::int16_t readInt16BE();
33 std::uint16_t readUInt16BE();
34 std::int32_t readInt24BE();
35 std::uint32_t readUInt24BE();
36 std::int32_t readInt32BE();
37 std::uint32_t readUInt32BE();
38 std::int64_t readInt40BE();
39 std::uint64_t readUInt40BE();
40 std::int64_t readInt56BE();
41 std::uint64_t readUInt56BE();
42 std::int64_t readInt64BE();
43 std::uint64_t readUInt64BE();
44 std::uint64_t readVariableLengthUIntBE();
45 float readFloat32BE();
46 double readFloat64BE();
47 std::int16_t readInt16LE();
48 std::uint16_t readUInt16LE();
49 std::int32_t readInt24LE();
50 std::uint32_t readUInt24LE();
51 std::int32_t readInt32LE();
52 std::uint32_t readUInt32LE();
53 std::int64_t readInt40LE();
54 std::uint64_t readUInt40LE();
55 std::int64_t readInt56LE();
56 std::uint64_t readUInt56LE();
57 std::int64_t readInt64LE();
58 std::uint64_t readUInt64LE();
59 std::uint64_t readVariableLengthUIntLE();
60 float readFloat32LE();
61 double readFloat64LE();
63 std::uint8_t readByte();
65 std::string readLengthPrefixedString();
66 std::string readString(std::size_t length);
67 std::string readTerminatedString(std::uint8_t termination = 0);
68 std::string readTerminatedString(std::size_t maxBytesToRead, std::uint8_t termination = 0);
69 std::uint32_t readSynchsafeUInt32BE();
71 float readFixed16BE();
72 std::uint32_t readSynchsafeUInt32LE();
74 float readFixed16LE();
75 std::uint32_t readCrc32(std::size_t length);
76 static std::uint32_t computeCrc32(
const char *buffer, std::size_t length);
77 static const std::uint32_t crc32Table[];
80 void read(
char &oneCharacter);
81 void read(std::uint8_t &oneByte);
82 void read(
bool &oneBool);
83 void read(std::string &lengthPrefixedString);
84 void read(std::int16_t &one16BitInt);
85 void read(std::uint16_t &one16BitUInt);
86 void read(std::int32_t &one32BitInt);
87 void read(std::uint32_t &one32BitUInt);
88 void read(std::int64_t &one64BitInt);
89 void read(std::uint64_t &one64BitUInt);
90 void read(
float &one32BitFloat);
91 void read(
double &one64BitFloat);
94 void bufferVariableLengthInteger();
96 std::istream *m_stream;
108 , m_ownership(giveOwnership)
117 : m_stream(other.m_stream)
195 return m_stream ? m_stream->fail() :
false;
203 return m_stream && m_stream->eof();
211 return m_stream && m_stream->good();
219 m_stream->read(buffer, length);
227 m_stream->read(reinterpret_cast<char *>(buffer), length);
235 buffer.resize(
static_cast<std::vector<char>::size_type
>(length));
236 m_stream->read(buffer.data(), length);
244 m_stream->read(m_buffer,
sizeof(std::int16_t));
245 return BE::toInt16(m_buffer);
253 m_stream->read(m_buffer,
sizeof(std::uint16_t));
254 return BE::toUInt16(m_buffer);
263 m_stream->read(m_buffer + 1, 3);
264 auto val = BE::toInt32(m_buffer);
265 if (val >= 0x800000) {
266 val = -(0x1000000 - val);
277 m_stream->read(m_buffer + 1, 3);
278 return BE::toUInt32(m_buffer);
286 m_stream->read(m_buffer,
sizeof(std::int32_t));
287 return BE::toInt32(m_buffer);
295 m_stream->read(m_buffer,
sizeof(std::uint32_t));
296 return BE::toUInt32(m_buffer);
304 *m_buffer = *(m_buffer + 1) = *(m_buffer + 2) = 0;
305 m_stream->read(m_buffer + 3, 5);
306 auto val = BE::toInt64(m_buffer);
307 if (val >= 0x8000000000) {
308 val = -(0x10000000000 - val);
318 *m_buffer = *(m_buffer + 1) = *(m_buffer + 2) = 0;
319 m_stream->read(m_buffer + 3, 5);
320 return BE::toUInt64(m_buffer);
329 m_stream->read(m_buffer + 1, 7);
330 auto val = BE::toInt64(m_buffer);
331 if (val >= 0x80000000000000) {
332 val = -(0x100000000000000 - val);
343 m_stream->read(m_buffer + 1, 7);
344 return BE::toUInt64(m_buffer);
352 m_stream->read(m_buffer,
sizeof(std::int64_t));
353 return BE::toInt64(m_buffer);
361 m_stream->read(m_buffer,
sizeof(std::uint64_t));
362 return BE::toUInt64(m_buffer);
371 bufferVariableLengthInteger();
372 return BE::toUInt64(m_buffer);
380 m_stream->read(m_buffer,
sizeof(
float));
389 m_stream->read(m_buffer,
sizeof(
double));
390 return BE::toFloat64(m_buffer);
398 m_stream->read(m_buffer,
sizeof(std::int16_t));
399 return LE::toInt16(m_buffer);
407 m_stream->read(m_buffer,
sizeof(std::uint16_t));
408 return LE::toUInt16(m_buffer);
417 m_stream->read(m_buffer, 3);
418 auto val = LE::toInt32(m_buffer);
419 if (val >= 0x800000) {
420 val = -(0x1000000 - val);
431 m_stream->read(m_buffer, 3);
432 return LE::toUInt32(m_buffer);
440 m_stream->read(m_buffer,
sizeof(std::int32_t));
441 return LE::toInt32(m_buffer);
449 m_stream->read(m_buffer,
sizeof(std::uint32_t));
450 return LE::toUInt32(m_buffer);
458 *(m_buffer + 5) = *(m_buffer + 6) = *(m_buffer + 7) = 0;
459 m_stream->read(m_buffer, 5);
460 auto val = LE::toInt64(m_buffer);
461 if (val >= 0x8000000000) {
462 val = -(0x10000000000 - val);
472 *(m_buffer + 5) = *(m_buffer + 6) = *(m_buffer + 7) = 0;
473 m_stream->read(m_buffer, 5);
474 return LE::toUInt64(m_buffer);
483 m_stream->read(m_buffer, 7);
484 auto val = LE::toInt64(m_buffer);
485 if (val >= 0x80000000000000) {
486 val = -(0x100000000000000 - val);
497 m_stream->read(m_buffer, 7);
498 return LE::toUInt64(m_buffer);
506 m_stream->read(m_buffer,
sizeof(std::int64_t));
507 return LE::toInt64(m_buffer);
515 m_stream->read(m_buffer,
sizeof(std::uint64_t));
516 return LE::toUInt64(m_buffer);
525 bufferVariableLengthInteger();
526 return LE::toUInt64(m_buffer);
534 m_stream->read(m_buffer,
sizeof(
float));
543 m_stream->read(m_buffer,
sizeof(
double));
544 return LE::toFloat64(m_buffer);
552 m_stream->read(m_buffer,
sizeof(
char));
561 m_stream->read(m_buffer,
sizeof(
char));
562 return static_cast<std::uint8_t>(m_buffer[0]);
737 #endif // IOUTILITIES_BINERYREADER_H