diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-02-01 04:14:42 +0100 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-02-01 04:14:42 +0100 |
commit | 8a8a41a800dfe9bdcab934d6b53d9c6defd4a457 (patch) | |
tree | f9d40b96ee3413cbe7a402a4b4abad607b2a1c7c /src/Buffer.hpp | |
parent | fc1fc8fbbc9dd9534f40de348210ea66b6defe42 (diff) | |
download | MinedMap-8a8a41a800dfe9bdcab934d6b53d9c6defd4a457.tar MinedMap-8a8a41a800dfe9bdcab934d6b53d9c6defd4a457.zip |
Parse chunk data on demand
Diffstat (limited to 'src/Buffer.hpp')
-rw-r--r-- | src/Buffer.hpp | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/src/Buffer.hpp b/src/Buffer.hpp index c7fa9c7..3bf1ef0 100644 --- a/src/Buffer.hpp +++ b/src/Buffer.hpp @@ -40,34 +40,47 @@ private: size_t len; public: - Buffer(const uint8_t *data0, size_t len0) : data(data0), len(len0) {} + static uint16_t parse16(const uint8_t *buf) { + return (buf[0] << 8) | buf[1]; + } - uint8_t get() { - if (!len) - throw std::runtime_error("Buffer::get(): buffer underrun"); + static uint32_t parse32(const uint8_t *buf) { + return (uint32_t(buf[0]) << 24) | (uint32_t(buf[1]) << 16) | (uint32_t(buf[2]) << 8) | uint32_t(buf[3]); + } - data++; - len--; - return data[-1]; + static uint64_t parse64(const uint8_t *buf) { + return (uint64_t(buf[0]) << 56) | (uint64_t(buf[1]) << 48) | (uint64_t(buf[2]) << 40) | (uint64_t(buf[3]) << 32) + | (uint64_t(buf[4]) << 24) | (uint64_t(buf[5]) << 16) | (uint64_t(buf[6]) << 8) | uint64_t(buf[7]); } - std::string getString(size_t n) { + + Buffer(const uint8_t *data0, size_t len0) : data(data0), len(len0) {} + + const uint8_t * get(size_t n) { if (n > len) throw std::runtime_error("Buffer::get(): buffer underrun"); data += n; len -= n; - return std::string(reinterpret_cast<const char *>(data - n), n); + return (data - n); } - void getData(void *buf, size_t n) { - if (n > len) - throw std::runtime_error("Buffer::get(): buffer underrun"); + uint8_t get8() { + return *get(1); + } - data += n; - len -= n; - std::memcpy(buf, data - n, n); + uint16_t get16() { + return parse16(get(2)); + } + + uint32_t get32() { + return parse32(get(4)); + } + + uint64_t get64() { + return parse64(get(8)); } + }; } |