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_