summaryrefslogtreecommitdiff
path: root/lib/rawDataReader.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2021-05-18 00:06:37 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2021-05-18 00:06:37 +0100
commitfcdca58617caf6a8c034a91588d6abb399be6b57 (patch)
treead77f8e954a2ed05cd26237a7c665f3adc82b9fe /lib/rawDataReader.cpp
downloadmygrate-fcdca58617caf6a8c034a91588d6abb399be6b57.tar.bz2
mygrate-fcdca58617caf6a8c034a91588d6abb399be6b57.tar.xz
mygrate-fcdca58617caf6a8c034a91588d6abb399be6b57.zip
Initial commit, still lots to do!
Diffstat (limited to 'lib/rawDataReader.cpp')
-rw-r--r--lib/rawDataReader.cpp47
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");
+ }
+}