31#ifndef ETL_GENERIC_POOL_INCLUDED
32#define ETL_GENERIC_POOL_INCLUDED
37#include "static_assert.h"
40#define ETL_POOL_CPP03_CODE 0
54 template <
size_t VTypeSize,
size_t VAlignment,
size_t VSize>
59 static ETL_CONSTANT
size_t SIZE = VSize;
60 static ETL_CONSTANT
size_t ALIGNMENT = VAlignment;
61 static ETL_CONSTANT
size_t TYPE_SIZE = VTypeSize;
67 :
etl::
ipool(reinterpret_cast<char*>(&buffer[0]), Element_Size, VSize)
81 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
82 return ipool::allocate<U>();
85#if ETL_CPP11_NOT_SUPPORTED || ETL_POOL_CPP03_CODE || ETL_USING_STLPORT
95 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
96 return ipool::create<U>();
104 template <
typename U,
typename T1>
108 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
109 return ipool::create<U>(value1);
117 template <
typename U,
typename T1,
typename T2>
118 U*
create(
const T1& value1,
const T2& value2)
121 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
122 return ipool::create<U>(value1, value2);
130 template <
typename U,
typename T1,
typename T2,
typename T3>
131 U*
create(
const T1& value1,
const T2& value2,
const T3& value3)
134 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
135 return ipool::create<U>(value1, value2, value3);
143 template <
typename U,
typename T1,
typename T2,
typename T3,
typename T4>
144 U*
create(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
147 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
148 return ipool::create<U>(value1, value2, value3, value4);
154 template <
typename U,
typename... Args>
158 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
159 return ipool::create<U>(etl::forward<Args>(args)...);
168 template <
typename U>
172 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
183 char value[VTypeSize];
184 typename etl::type_with_alignment<VAlignment>::type dummy;
190 static ETL_CONSTANT uint32_t Element_Size =
sizeof(Element);
197 template <
size_t VTypeSize,
size_t VAlignment,
size_t VSize>
198 ETL_CONSTANT
size_t generic_pool<VTypeSize, VAlignment, VSize>::SIZE;
200 template <
size_t VTypeSize,
size_t VAlignment,
size_t VSize>
201 ETL_CONSTANT
size_t generic_pool<VTypeSize, VAlignment, VSize>::ALIGNMENT;
203 template <
size_t VTypeSize,
size_t VAlignment,
size_t VSize>
204 ETL_CONSTANT
size_t generic_pool<VTypeSize, VAlignment, VSize>::TYPE_SIZE;
211 template <
size_t VTypeSize,
size_t VAlignment>
216 union element_internal
219 char value[VTypeSize];
220 typename etl::type_with_alignment<VAlignment>::type dummy;
223 static const size_t ELEMENT_INTERNAL_SIZE =
sizeof(element_internal);
226 static ETL_CONSTANT
size_t ALIGNMENT = VAlignment;
227 static ETL_CONSTANT
size_t TYPE_SIZE = VTypeSize;
235 :
etl::
ipool(reinterpret_cast<char*>(&buffer[0]), ELEMENT_INTERNAL_SIZE,
size)
245 template <
typename U>
249 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
250 return ipool::allocate<U>();
253#if ETL_CPP11_NOT_SUPPORTED || ETL_POOL_CPP03_CODE || ETL_USING_STLPORT
259 template <
typename U>
263 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
264 return ipool::create<U>();
272 template <
typename U,
typename T1>
276 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
277 return ipool::create<U>(value1);
285 template <
typename U,
typename T1,
typename T2>
286 U*
create(
const T1& value1,
const T2& value2)
289 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
290 return ipool::create<U>(value1, value2);
298 template <
typename U,
typename T1,
typename T2,
typename T3>
299 U*
create(
const T1& value1,
const T2& value2,
const T3& value3)
302 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
303 return ipool::create<U>(value1, value2, value3);
311 template <
typename U,
typename T1,
typename T2,
typename T3,
typename T4>
312 U*
create(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
315 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
316 return ipool::create<U>(value1, value2, value3, value4);
322 template <
typename U,
typename... Args>
326 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
327 return ipool::create<U>(etl::forward<Args>(args)...);
336 template <
typename U>
340 ETL_STATIC_ASSERT(
sizeof(U) <= VTypeSize,
"Type too large for pool");
351 template <
size_t VTypeSize,
size_t VAlignment>
352 ETL_CONSTANT
size_t generic_pool_ext<VTypeSize, VAlignment>::ALIGNMENT;
354 template <
size_t VTypeSize,
size_t VAlignment>
355 ETL_CONSTANT
size_t generic_pool_ext<VTypeSize, VAlignment>::TYPE_SIZE;
Definition: alignment.h:221
size_t size() const
Returns the number of allocated items in the pool.
Definition: ipool.h:293
U * create(const T1 &value1)
Definition: generic_pool.h:105
U * create(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition: generic_pool.h:144
U * create(const T1 &value1)
Definition: generic_pool.h:273
U * create(const T1 &value1, const T2 &value2, const T3 &value3)
Definition: generic_pool.h:299
generic_pool_ext(element *buffer, size_t size)
Constructor.
Definition: generic_pool.h:234
U * create(const T1 &value1, const T2 &value2, const T3 &value3)
Definition: generic_pool.h:131
U * create(const T1 &value1, const T2 &value2)
Definition: generic_pool.h:118
U * create(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition: generic_pool.h:312
U * create()
Definition: generic_pool.h:260
void release(const void *const p_object)
Definition: ipool.h:239
U * allocate()
Definition: generic_pool.h:78
generic_pool()
Constructor.
Definition: generic_pool.h:66
U * create(const T1 &value1, const T2 &value2)
Definition: generic_pool.h:286
void destroy(const U *const p_object)
Definition: generic_pool.h:169
U * create()
Definition: generic_pool.h:92
U * allocate()
Definition: generic_pool.h:246
void destroy(const U *const p_object)
Definition: generic_pool.h:337
Definition: generic_pool.h:56
Definition: generic_pool.h:213
add_rvalue_reference
Definition: type_traits_generator.h:1327
bitset_ext
Definition: absolute.h:38
Definition: alignment.h:223