#pragma once #include #include #include // Bounds-checked sequential reader for byte streams. consume() returns a // typed pointer into the underlying buffer or nullptr on underflow. Used to // walk packet headers in order without UB and without copies. class parse_buffer { const uint8_t* m_data; size_t m_remaining; public: parse_buffer(std::span data) : m_data(data.data()), m_remaining(data.size()) {} template const T* consume() { if (m_remaining < sizeof(T)) return nullptr; auto* p = reinterpret_cast(m_data); m_data += sizeof(T); m_remaining -= sizeof(T); return p; } bool skip(size_t len) { if (m_remaining < len) return false; m_data += len; m_remaining -= len; return true; } std::span remaining() const { return {m_data, m_remaining}; } size_t remaining_size() const { return m_remaining; } };