Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.43 KB | None | 0 0
  1. struct TurboBuffer
  2. {
  3.     void*  buffer;
  4.     size_t size;
  5.     size_t capacity;
  6.    
  7.     TurboBuffer()
  8.     {
  9.         buffer = new uint8_t[16];
  10.         size = 0;
  11.         capacity = 16;
  12.     }
  13.    
  14.     void extend_buffer(size_t new_capacity)
  15.     {
  16.         uint8_t* old_buffer = (uint8_t*)buffer;
  17.        
  18.         buffer = new uint8_t[new_capacity];
  19.         memcpy(buffer, old_buffer, size);
  20.        
  21.         delete[] old_buffer;
  22.        
  23.         capacity = new_capacity;
  24.     }
  25.    
  26.     void add_something(const void* data, size_t data_size)
  27.     {
  28.         if (capacity - size <= data_size)
  29.             extend_buffer(capacity + data_size);
  30.            
  31.         memcpy((uint8_t*)buffer + size, data, data_size);
  32.         size += data_size;
  33.     }
  34.    
  35.     template <typename T>
  36.     void add_entry(const T& value)
  37.     {
  38.         uint32_t next_offset = size + sizeof(value) + 4;
  39.        
  40.         add_something(&next_offset, 4);
  41.         add_something(&value, sizeof(T));
  42.     }
  43.    
  44.     template <typename T>
  45.     T* get_first()
  46.     {
  47.         if (size == 0)
  48.             return nullptr;
  49.        
  50.         return (T*)((uint8_t*)buffer + 4);
  51.     }
  52.    
  53.     template <typename T>
  54.     T* get_next(void* current)
  55.     {
  56.         uint32_t next_offset = *(uint32_t*)((uint8_t*)current - 4) + 4;
  57.         if (next_offset >= size)
  58.             return nullptr;
  59.        
  60.         return (T*)((uint8_t*)buffer + next_offset);
  61.     }
  62. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement