2 #ifndef _GEODESIC_MEMORY_20071231 3 #define _GEODESIC_MEMORY_20071231 13 class SimlpeMemoryAllocator
18 SimlpeMemoryAllocator(
unsigned block_size = 0,
19 unsigned max_number_of_blocks = 0)
22 max_number_of_blocks);
25 ~SimlpeMemoryAllocator(){};
27 void reset(
unsigned block_size,
28 unsigned max_number_of_blocks)
30 m_block_size = block_size;
31 m_max_number_of_blocks = max_number_of_blocks;
34 m_current_position = 0;
36 m_storage.reserve(max_number_of_blocks);
38 m_storage[0].resize(block_size);
41 pointer allocate(
unsigned const n)
43 FEASSERT(n < m_block_size);
45 if(m_current_position + n >= m_block_size)
47 m_storage.push_back( std::vector<T>() );
48 m_storage.back().resize(m_block_size);
49 m_current_position = 0;
51 pointer result = & m_storage.back()[m_current_position];
52 m_current_position += n;
57 std::vector<std::vector<T> > m_storage;
58 unsigned m_block_size;
59 unsigned m_max_number_of_blocks;
60 unsigned m_current_position;
70 MemoryAllocator(
unsigned block_size = 1024,
71 unsigned max_number_of_blocks = 1024)
74 max_number_of_blocks);
82 m_max_number_of_blocks);
85 void reset(
unsigned block_size,
86 unsigned max_number_of_blocks)
88 m_block_size = block_size;
89 m_max_number_of_blocks = max_number_of_blocks;
91 FEASSERT(m_block_size > 0);
92 FEASSERT(m_max_number_of_blocks > 0);
94 m_current_position = 0;
96 m_storage.reserve(max_number_of_blocks);
98 m_storage[0].resize(block_size);
101 m_deleted.reserve(2*block_size);
107 if(m_deleted.empty())
109 if(m_current_position + 1 >= m_block_size)
111 m_storage.push_back( std::vector<T>() );
112 m_storage.back().resize(m_block_size);
113 m_current_position = 0;
115 result = & m_storage.back()[m_current_position];
116 ++m_current_position;
120 result = m_deleted.back();
121 m_deleted.pop_back();
127 void deallocate(pointer p)
129 if(m_deleted.size() < m_deleted.capacity())
131 m_deleted.push_back(p);
136 std::vector<std::vector<T> > m_storage;
137 unsigned m_block_size;
138 unsigned m_max_number_of_blocks;
139 unsigned m_current_position;
141 std::vector<pointer> m_deleted;
155 #if __cplusplus >= 201103L 156 m_buffer = std::unique_ptr<double>();
158 m_buffer = std::auto_ptr<double>();
163 T* allocate(
unsigned n)
165 double wanted = n*
sizeof(T);
166 if(wanted > m_num_bytes)
168 unsigned new_size = (unsigned) ceil(wanted / (
double)
sizeof(double));
169 #if __cplusplus >= 201103L 170 m_buffer = std::unique_ptr<double>(
new double[new_size]);
172 m_buffer = std::auto_ptr<double>(
new double[new_size]);
174 m_num_bytes = new_size*
sizeof(double);
177 return (T*)m_buffer.get();
183 return (T*)m_buffer.get();
189 return (
unsigned)floor((
double)m_num_bytes/(
double)
sizeof(T));
194 #if __cplusplus >= 201103L 195 std::unique_ptr<double> m_buffer;
197 std::auto_ptr<double> m_buffer;
199 unsigned m_num_bytes;
205 #endif //_GEODESIC_MEMORY_20071231
Definition: geodesic_cpp_03_02_2008/geodesic_algorithm_base.h:11