blob: 823d5aff201a18714e5d1690ab53fae237e67c5c [file] [log] [blame]
// 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_