23 #ifndef BM_BM_SIM_PACKET_BUFFER_H_
24 #define BM_BM_SIM_PACKET_BUFFER_H_
61 buffer(std::unique_ptr<
char[]>(
new char[size])),
62 head(buffer.get() + size) {}
80 buffer(std::unique_ptr<char[]>(new char[size])),
81 head(buffer.get() + size) {
82 std::copy(data, data + data_size, push(data_size));
85 char *start()
const {
return head; }
87 char *end()
const {
return buffer.get() + size; }
89 char *push(
size_t bytes) {
90 assert(data_size + bytes <= size);
96 char *pop(
size_t bytes) {
97 assert(bytes <= data_size);
103 const state_t save_state()
const {
104 return {head, data_size};
107 void restore_state(
const state_t &state) {
109 data_size = state.data_size;
112 size_t get_data_size()
const {
return data_size; }
114 PacketBuffer clone(
size_t end_bytes)
const {
115 assert(end_bytes <= data_size);
116 PacketBuffer pb(size);
117 std::copy(end() - end_bytes, end(), pb.push(end_bytes));
121 PacketBuffer(
const PacketBuffer &other) =
delete;
122 PacketBuffer &operator=(
const PacketBuffer &other) =
delete;
124 PacketBuffer(PacketBuffer &&other) =
default;
125 PacketBuffer &operator=(PacketBuffer &&other) =
default;
130 std::unique_ptr<char[]> buffer{
nullptr};
136 #endif // BM_BM_SIM_PACKET_BUFFER_H_