// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_
#define MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_

#include "mojo/public/cpp/bindings/lib/buffer.h"
#include "mojo/public/cpp/system/macros.h"

namespace mojo {
namespace internal {

// FixedBuffer provides a simple way to allocate objects within a fixed chunk
// of memory. Objects are allocated by calling the |Allocate| method, which
// extends the buffer accordingly. Objects allocated in this way are not freed
// explicitly. Instead, they remain valid so long as the FixedBuffer remains
// valid.  The Leak method may be used to steal the underlying memory from the
// FixedBuffer.
//
// Typical usage:
//
//   {
//     FixedBuffer buf(8 + 8);
//
//     int* a = static_cast<int*>(buf->Allocate(sizeof(int)));
//     *a = 2;
//
//     double* b = static_cast<double*>(buf->Allocate(sizeof(double)));
//     *b = 3.14f;
//
//     void* data = buf.Leak();
//     Process(data);
//
//     free(data);
//   }

class FixedBuffer : public Buffer {
 public:
  FixedBuffer();

  // |size| should be aligned using internal::Align.
  void Initialize(void* memory, size_t size);

  size_t size() const { return size_; }

  // Returns the number of bytes used so far.
  // TODO(vardhan): Introduce this method in |Buffer|? Doesn't seem necessary.
  size_t BytesUsed() const { return cursor_; }

  // Grows the buffer by |num_bytes| and returns a pointer to the start of the
  // addition. The resulting address is 8-byte aligned, and the content of the
  // memory is zero-filled.
  // TODO(vardhan): Allocate() should safely fail if we run out of buffer space.
  // This will allow us to, e.g, fail when trying to consume a buffer to
  // serialize into, and return an insufficient space error. Currently, there
  // are consumers of FixedBuffer that rely on it CHECK-failing.
  void* Allocate(size_t num_bytes) override;

 protected:
  char* ptr_;
  size_t cursor_;
  size_t size_;

  MOJO_DISALLOW_COPY_AND_ASSIGN(FixedBuffer);
};

class FixedBufferForTesting : public FixedBuffer {
 public:
  explicit FixedBufferForTesting(size_t size);
  ~FixedBufferForTesting() override;

  // Returns the internal memory owned by the Buffer to the caller. The Buffer
  // relinquishes its pointer, effectively resetting the state of the Buffer
  // and leaving the caller responsible for freeing the returned memory address
  // when no longer needed.
  void* Leak();

 private:
  MOJO_DISALLOW_COPY_AND_ASSIGN(FixedBufferForTesting);
};

}  // namespace internal
}  // namespace mojo

#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_
