From 8a8a41a800dfe9bdcab934d6b53d9c6defd4a457 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 1 Feb 2015 04:14:42 +0100 Subject: Parse chunk data on demand --- src/Buffer.hpp | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) (limited to 'src/Buffer.hpp') 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(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)); } + }; } -- cgit v1.2.3