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