Add Google's LevelDB support
[novacoin.git] / src / leveldb / util / arena.h
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 <cstddef>
9 #include <vector>
10 #include <assert.h>
11 #include <stdint.h>
12
13 namespace leveldb {
14
15 class 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
52 inline 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_