1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_ 6#define MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_ 7 8#include "mojo/public/cpp/bindings/lib/buffer.h" 9#include "mojo/public/cpp/system/macros.h" 10 11namespace mojo { 12namespace internal { 13 14// FixedBuffer provides a simple way to allocate objects within a fixed chunk 15// of memory. Objects are allocated by calling the |Allocate| method, which 16// extends the buffer accordingly. Objects allocated in this way are not freed 17// explicitly. Instead, they remain valid so long as the FixedBuffer remains 18// valid. The Leak method may be used to steal the underlying memory from the 19// FixedBuffer. 20// 21// Typical usage: 22// 23// { 24// FixedBuffer buf(8 + 8); 25// 26// int* a = static_cast<int*>(buf->Allocate(sizeof(int))); 27// *a = 2; 28// 29// double* b = static_cast<double*>(buf->Allocate(sizeof(double))); 30// *b = 3.14f; 31// 32// void* data = buf.Leak(); 33// Process(data); 34// 35// free(data); 36// } 37// 38class FixedBuffer : public Buffer { 39 public: 40 explicit FixedBuffer(size_t size); 41 virtual ~FixedBuffer(); 42 43 // Grows the buffer by |num_bytes| and returns a pointer to the start of the 44 // addition. The resulting address is 8-byte aligned, and the content of the 45 // memory is zero-filled. 46 virtual void* Allocate(size_t num_bytes) MOJO_OVERRIDE; 47 48 size_t size() const { return size_; } 49 50 // Returns the internal memory owned by the Buffer to the caller. The Buffer 51 // relinquishes its pointer, effectively resetting the state of the Buffer 52 // and leaving the caller responsible for freeing the returned memory address 53 // when no longer needed. 54 void* Leak(); 55 56 private: 57 char* ptr_; 58 size_t cursor_; 59 size_t size_; 60 61 MOJO_DISALLOW_COPY_AND_ASSIGN(FixedBuffer); 62}; 63 64} // namespace internal 65} // namespace mojo 66 67#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_ 68