#pragma once #include <vector> #include <map> #include <deque> #include <cstdint> #include <cstddef> struct RecvSequenceBuffer { struct RSBEntry { std::vector<uint8_t> data; }; // sequence_id -> entry std::map<uint16_t, RSBEntry> entries; uint16_t next_seq_id {0}; // list of seq_ids to ack, this is seperate bc rsbentries are deleted once processed std::deque<uint16_t> ack_seq_ids; void erase(uint16_t seq); // inflight chunks size_t size(void) const; void add(uint16_t seq_id, std::vector<uint8_t>&& data); bool canPop(void) const; std::vector<uint8_t> pop(void); // for acking, might be bad since its front std::vector<uint16_t> frontSeqIDs(size_t count = 5) const; };