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 11 namespace mojo { 12 namespace 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 // 38 class 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 size()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