#include "rawDataReader.h" #include "helpers.h" #include "streamSupport.h" #include #include #include namespace MyGrate { RawDataReader::RawDataReader(const void * const d, std::size_t l) : rawdata {static_cast(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() { switch (const auto byte1 {readValue()}) { case 0 ... 250: // The value as-is return byte1; case 252: // 2 bytes return readValue(); case 253: // 3 bytes return readValue(); case 254: // 8 bytes return readValue(); default:; } throw std::domain_error("Invalid first byte of packed integer"); } }