// Copyright 2016 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 QUICHE_SPDY_CORE_SPDY_SIMPLE_ARENA_H_
#define QUICHE_SPDY_CORE_SPDY_SIMPLE_ARENA_H_

#include <memory>
#include <vector>

#include "common/platform/api/quiche_export.h"

namespace spdy {

// Allocates large blocks of memory, and doles them out in smaller chunks.
// Not thread-safe.
class QUICHE_EXPORT_PRIVATE SpdySimpleArena {
 public:
  class Status {
   private:
    friend class SpdySimpleArena;
    size_t bytes_allocated_;

   public:
    Status() : bytes_allocated_(0) {}
    size_t bytes_allocated() const { return bytes_allocated_; }
  };

  // Blocks allocated by this arena will be at least |block_size| bytes.
  explicit SpdySimpleArena(size_t block_size);
  ~SpdySimpleArena();

  // Copy and assign are not allowed.
  SpdySimpleArena() = delete;
  SpdySimpleArena(const SpdySimpleArena&) = delete;
  SpdySimpleArena& operator=(const SpdySimpleArena&) = delete;

  // Move is allowed.
  SpdySimpleArena(SpdySimpleArena&& other);
  SpdySimpleArena& operator=(SpdySimpleArena&& other);

  char* Alloc(size_t size);
  char* Realloc(char* original, size_t oldsize, size_t newsize);
  char* Memdup(const char* data, size_t size);

  // If |data| and |size| describe the most recent allocation made from this
  // arena, the memory is reclaimed. Otherwise, this method is a no-op.
  void Free(char* data, size_t size);

  void Reset();

  Status status() const { return status_; }

 private:
  struct Block {
    std::unique_ptr<char[]> data;
    size_t size = 0;
    size_t used = 0;

    explicit Block(size_t s);
    ~Block();

    Block(Block&& other);
    Block& operator=(Block&& other);
  };

  void Reserve(size_t additional_space);
  void AllocBlock(size_t size);

  size_t block_size_;
  std::vector<Block> blocks_;
  Status status_;
};

}  // namespace spdy

#endif  // QUICHE_SPDY_CORE_SPDY_SIMPLE_ARENA_H_
