Belle II Software  release-08-01-10
MemoryPool.h
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #pragma once
10 
11 #include <vector>
12 #include <cstddef>
13 #include <cstdlib>
14 
15 namespace Belle2 {
33  template < class T, int chunkSize = 128 > class MemoryPool {
34 
35  public:
40  explicit MemoryPool(int n = 0): m_entries(0) { reserve(n); }
41 
44 
49  size_t size() const { return m_entries; }
50 
56  T* operator[](size_t i) { return m_chunks[i / chunkSize] + i % chunkSize; }
57 
63  T* at(size_t i) { return (i >= m_entries) ? 0 : (*this)[i]; }
64 
68  void clear() { m_entries = 0; }
69 
74  T* add()
75  {
76  if (m_entries / chunkSize >= m_chunks.size()) {
77  m_chunks.push_back(reinterpret_cast<T*>(malloc(chunkSize * sizeof(T))));
78  }
79  return (*this)[m_entries++];
80  }
81 
86  void reserve(size_t n)
87  {
88  size_t needed_chunks = n / chunkSize + 1;
89  m_chunks.reserve(needed_chunks);
90  while (m_chunks.size() < needed_chunks) {
91  m_chunks.push_back(reinterpret_cast<T*>(malloc(chunkSize * sizeof(T))));
92  }
93  }
94 
99  {
100  for (T* ptr : m_chunks) {
101  free(reinterpret_cast<void*>(ptr));
102  }
103  m_chunks.clear();
104  }
105 
106  protected:
107 
108  size_t m_entries;
109  std::vector<T*> m_chunks;
110  };
111 
113 } //end namespace Belle2
Class to provide a constant access time memory pool for one kind of objects.
Definition: MemoryPool.h:33
~MemoryPool()
Free allocated memory.
Definition: MemoryPool.h:43
MemoryPool(int n=0)
Constructor.
Definition: MemoryPool.h:40
size_t size() const
Return number of elements currently stored.
Definition: MemoryPool.h:49
T * operator[](size_t i)
Return pointer to memory segment for element i, no range check.
Definition: MemoryPool.h:56
T * add()
Returns an pointer to the next free memory segment, allocating additional memory if necessary.
Definition: MemoryPool.h:74
T * at(size_t i)
Return pointer to memory segment for element i, including range check.
Definition: MemoryPool.h:63
void release_memory()
Release all allocated memory, called automatically upon destruction.
Definition: MemoryPool.h:98
void clear()
Clear number of entries, does not free memory or call destructors.
Definition: MemoryPool.h:68
std::vector< T * > m_chunks
Pointers to all allocated memory chunks.
Definition: MemoryPool.h:109
void reserve(size_t n)
Make sure there is enough memory allocated for n elements.
Definition: MemoryPool.h:86
size_t m_entries
Number of occupied entries.
Definition: MemoryPool.h:108
Abstract base class for different kinds of events.