1// Copyright (c) 2011 The LevelDB 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. See the AUTHORS file for names of contributors.
4
5#ifndef STORAGE_LEVELDB_UTIL_ARENA_H_
6#define STORAGE_LEVELDB_UTIL_ARENA_H_
7
8#include <vector>
9#include <assert.h>
10#include <stddef.h>
11#include <stdint.h>
12
13namespace leveldb {
14
15class Arena {
16 public:
17  Arena();
18  ~Arena();
19
20  // Return a pointer to a newly allocated memory block of "bytes" bytes.
21  char* Allocate(size_t bytes);
22
23  // Allocate memory with the normal alignment guarantees provided by malloc
24  char* AllocateAligned(size_t bytes);
25
26  // Returns an estimate of the total memory usage of data allocated
27  // by the arena (including space allocated but not yet used for user
28  // allocations).
29  size_t MemoryUsage() const {
30    return blocks_memory_ + blocks_.capacity() * sizeof(char*);
31  }
32
33 private:
34  char* AllocateFallback(size_t bytes);
35  char* AllocateNewBlock(size_t block_bytes);
36
37  // Allocation state
38  char* alloc_ptr_;
39  size_t alloc_bytes_remaining_;
40
41  // Array of new[] allocated memory blocks
42  std::vector<char*> blocks_;
43
44  // Bytes of memory in blocks allocated so far
45  size_t blocks_memory_;
46
47  // No copying allowed
48  Arena(const Arena&);
49  void operator=(const Arena&);
50};
51
52inline char* Arena::Allocate(size_t bytes) {
53  // The semantics of what to return are a bit messy if we allow
54  // 0-byte allocations, so we disallow them here (we don't need
55  // them for our internal use).
56  assert(bytes > 0);
57  if (bytes <= alloc_bytes_remaining_) {
58    char* result = alloc_ptr_;
59    alloc_ptr_ += bytes;
60    alloc_bytes_remaining_ -= bytes;
61    return result;
62  }
63  return AllocateFallback(bytes);
64}
65
66}  // namespace leveldb
67
68#endif  // STORAGE_LEVELDB_UTIL_ARENA_H_
69