Home | History | Annotate | Download | only in lib
      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 <stddef.h>
      9 
     10 #include "base/macros.h"
     11 #include "mojo/public/cpp/bindings/lib/buffer.h"
     12 
     13 namespace mojo {
     14 namespace internal {
     15 
     16 // FixedBuffer provides a simple way to allocate objects within a fixed chunk
     17 // of memory. Objects are allocated by calling the |Allocate| method, which
     18 // extends the buffer accordingly. Objects allocated in this way are not freed
     19 // explicitly. Instead, they remain valid so long as the FixedBuffer remains
     20 // valid.  The Leak method may be used to steal the underlying memory from the
     21 // FixedBuffer.
     22 //
     23 // Typical usage:
     24 //
     25 //   {
     26 //     FixedBuffer buf(8 + 8);
     27 //
     28 //     int* a = static_cast<int*>(buf->Allocate(sizeof(int)));
     29 //     *a = 2;
     30 //
     31 //     double* b = static_cast<double*>(buf->Allocate(sizeof(double)));
     32 //     *b = 3.14f;
     33 //
     34 //     void* data = buf.Leak();
     35 //     Process(data);
     36 //
     37 //     free(data);
     38 //   }
     39 
     40 class FixedBuffer : public Buffer {
     41  public:
     42   FixedBuffer();
     43 
     44   // |size| should be aligned using internal::Align.
     45   void Initialize(void* memory, size_t size);
     46 
     47   size_t size() const { return size_; }
     48 
     49   // Grows the buffer by |num_bytes| and returns a pointer to the start of the
     50   // addition. The resulting address is 8-byte aligned, and the content of the
     51   // memory is zero-filled.
     52   void* Allocate(size_t num_bytes) override;
     53 
     54  protected:
     55   char* ptr_;
     56   size_t cursor_;
     57   size_t size_;
     58 
     59   DISALLOW_COPY_AND_ASSIGN(FixedBuffer);
     60 };
     61 
     62 class FixedBufferForTesting : public FixedBuffer {
     63  public:
     64   explicit FixedBufferForTesting(size_t size);
     65   ~FixedBufferForTesting() override;
     66 
     67   // Returns the internal memory owned by the Buffer to the caller. The Buffer
     68   // relinquishes its pointer, effectively resetting the state of the Buffer
     69   // and leaving the caller responsible for freeing the returned memory address
     70   // when no longer needed.
     71   void* Leak();
     72 
     73  private:
     74   DISALLOW_COPY_AND_ASSIGN(FixedBufferForTesting);
     75 };
     76 
     77 }  // namespace internal
     78 }  // namespace mojo
     79 
     80 #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_
     81