diff options
Diffstat (limited to 'lib/rawDataReader.cpp')
-rw-r--r-- | lib/rawDataReader.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/rawDataReader.cpp b/lib/rawDataReader.cpp new file mode 100644 index 0000000..2dd87a9 --- /dev/null +++ b/lib/rawDataReader.cpp @@ -0,0 +1,47 @@ +#include "rawDataReader.h" +#include "helpers.h" +#include "streamSupport.h" +#include <cstring> +#include <iomanip> +#include <iostream> + +namespace MyGrate { + RawDataReader::RawDataReader(const void * const d, std::size_t l) : + rawdata {static_cast<const std::byte *>(d)}, len {l} + { + } + + RawDataReader::RawDataReader(const MARIADB_STRING & str) : RawDataReader {str.str, str.length} { } + + void + RawDataReader::offsetSizeCheck(size_t l) const + { + if (offset + l > len) { + throw std::range_error("Read beyond end of data"); + } + } + + void + RawDataReader::discard(size_t d) + { + offset += d; + } + + template<> + uint64_t + RawDataReader::readValue<PackedInteger>() + { + switch (const auto byte1 {readValue<uint8_t>()}) { + case 0 ... 250: // The value as-is + return byte1; + case 252: // 2 bytes + return readValue<uint16_t, 2>(); + case 253: // 3 bytes + return readValue<uint32_t, 3>(); + case 254: // 8 bytes + return readValue<uint64_t, 8>(); + default:; + } + throw std::domain_error("Invalid first byte of packed integer"); + } +} |