10#ifndef MSGPACK_V1_CPP03_ZONE_HPP
11#define MSGPACK_V1_CPP03_ZONE_HPP
32 finalizer(
void (*func)(
void*),
void* data):m_func(func), m_data(data) {}
33 void operator()() { m_func(m_data); }
34 void (*m_func)(
void*);
37 struct finalizer_array {
40 finalizer* fin = m_tail;
41 for(; fin != m_array; --fin) (*(fin-1))();
51 void push(
void (*func)(
void* data),
void* data)
53 finalizer* fin = m_tail;
56 push_expand(func, data);
65 void push_expand(
void (*func)(
void*),
void* data) {
66 const size_t nused =
static_cast<size_t>(m_end - m_array);
69 nnext = (
sizeof(finalizer) < 72/2) ?
70 72 /
sizeof(finalizer) : 8;
75 static_cast<finalizer*
>(::realloc(m_array,
sizeof(finalizer) * nnext));
77 throw std::bad_alloc();
82 new (m_tail) finalizer(func, data);
94 chunk_list(
size_t chunk_size)
96 chunk* c =
static_cast<chunk*
>(::malloc(
sizeof(chunk) + chunk_size));
98 throw std::bad_alloc();
103 m_ptr =
reinterpret_cast<char*
>(c) +
sizeof(chunk);
110 chunk* n = c->m_next;
115 void clear(
size_t chunk_size)
119 chunk* n = c->m_next;
130 m_ptr =
reinterpret_cast<char*
>(m_head) +
sizeof(chunk);
137 chunk_list m_chunk_list;
138 finalizer_array m_finalizer_array;
149 template <
typename T>
155 static void*
operator new(std::size_t size)
157 void* p = ::malloc(size);
158 if (!p)
throw std::bad_alloc();
161 static void operator delete(
void *p)
165 static void*
operator new(std::size_t size,
void* place)
167 return ::operator
new(size, place);
169 static void operator delete(
void* p,
void* place)
171 ::operator
delete(p, place);
175 template <
typename T>
178 template <
typename T,
typename A1>
181 template <
typename T,
typename A1,
typename A2>
184 template <
typename T,
typename A1,
typename A2,
typename A3>
187 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4>
188 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4);
190 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5>
191 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5);
193 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6>
194 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6);
196 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7>
197 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7);
199 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8>
200 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8);
202 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9>
203 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9);
205 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10>
206 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10);
208 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10,
typename A11>
209 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11);
211 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10,
typename A11,
typename A12>
212 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12);
214 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10,
typename A11,
typename A12,
typename A13>
215 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13);
217 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10,
typename A11,
typename A12,
typename A13,
typename A14>
218 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14);
220 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10,
typename A11,
typename A12,
typename A13,
typename A14,
typename A15>
221 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14, A15 a15);
226 void undo_allocate(
size_t size);
228 template <
typename T>
229 static void object_destruct(
void* obj);
231 template <
typename T>
232 static void object_delete(
void* obj);
234 static char* get_aligned(
char* ptr,
size_t align);
236 char* allocate_expand(
size_t size);
242inline zone::zone(
size_t chunk_size):m_chunk_size(chunk_size), m_chunk_list(m_chunk_size)
246inline char* zone::get_aligned(
char* ptr,
size_t align)
250 reinterpret_cast<char*
>(
251 reinterpret_cast<uintptr_t
>(ptr + (align - 1)) & ~static_cast<uintptr_t>(align - 1)
257 char* aligned = get_aligned(m_chunk_list.m_ptr, align);
258 size_t adjusted_size = size +
static_cast<size_t>(aligned - m_chunk_list.m_ptr);
259 if (m_chunk_list.m_free < adjusted_size) {
260 size_t enough_size = size + align - 1;
261 char* ptr = allocate_expand(enough_size);
262 aligned = get_aligned(ptr, align);
263 adjusted_size = size +
static_cast<size_t>(aligned - m_chunk_list.m_ptr);
265 m_chunk_list.m_free -= adjusted_size;
266 m_chunk_list.m_ptr += adjusted_size;
272 char* ptr = m_chunk_list.m_ptr;
273 if(m_chunk_list.m_free < size) {
274 ptr = allocate_expand(size);
276 m_chunk_list.m_free -= size;
277 m_chunk_list.m_ptr += size;
282inline char* zone::allocate_expand(
size_t size)
284 chunk_list*
const cl = &m_chunk_list;
286 size_t sz = m_chunk_size;
289 size_t tmp_sz = sz * 2;
297 if((
sizeof(chunk) + sz) < sz) {
298 throw std::bad_alloc();
301 chunk* c =
static_cast<chunk*
>(::malloc(
sizeof(chunk) + sz));
302 if (!c)
throw std::bad_alloc();
304 char* ptr =
reinterpret_cast<char*
>(c) +
sizeof(chunk);
306 c->m_next = cl->m_head;
316 m_finalizer_array.push(func, data);
322 m_finalizer_array.push(&zone::object_delete<T>, obj.release());
327 m_finalizer_array.clear();
328 m_chunk_list.clear(m_chunk_size);
334 swap(m_chunk_size, o.m_chunk_size);
339 swap(m_chunk_list.m_free, o.m_chunk_list.m_free);
340 swap(m_chunk_list.m_ptr, o.m_chunk_list.m_ptr);
341 swap(m_chunk_list.m_head, o.m_chunk_list.m_head);
342 swap(m_finalizer_array.m_tail, o.m_finalizer_array.m_tail);
343 swap(m_finalizer_array.m_end, o.m_finalizer_array.m_end);
344 swap(m_finalizer_array.m_array, o.m_finalizer_array.m_array);
348void zone::object_destruct(
void* obj)
350 static_cast<T*
>(obj)->~T();
354void zone::object_delete(
void* obj)
356 delete static_cast<T*
>(obj);
359inline void zone::undo_allocate(
size_t size)
361 m_chunk_list.m_ptr -=
size;
362 m_chunk_list.m_free +=
size;
368 return (size + align - 1) / align * align;
378 m_finalizer_array.push(&zone::object_destruct<T>, x);
380 undo_allocate(
sizeof(T));
386 --m_finalizer_array.m_tail;
387 undo_allocate(
sizeof(T));
392template <
typename T,
typename A1>
397 m_finalizer_array.push(&zone::object_destruct<T>, x);
399 undo_allocate(
sizeof(T));
403 return new (x) T(a1);
405 --m_finalizer_array.m_tail;
406 undo_allocate(
sizeof(T));
411template <
typename T,
typename A1,
typename A2>
416 m_finalizer_array.push(&zone::object_destruct<T>, x);
418 undo_allocate(
sizeof(T));
422 return new (x) T(a1, a2);
424 --m_finalizer_array.m_tail;
425 undo_allocate(
sizeof(T));
430template <
typename T,
typename A1,
typename A2,
typename A3>
435 m_finalizer_array.push(&zone::object_destruct<T>, x);
437 undo_allocate(
sizeof(T));
441 return new (x) T(a1, a2, a3);
443 --m_finalizer_array.m_tail;
444 undo_allocate(
sizeof(T));
449template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4>
454 m_finalizer_array.push(&zone::object_destruct<T>, x);
456 undo_allocate(
sizeof(T));
460 return new (x) T(a1, a2, a3, a4);
462 --m_finalizer_array.m_tail;
463 undo_allocate(
sizeof(T));
468template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5>
473 m_finalizer_array.push(&zone::object_destruct<T>, x);
475 undo_allocate(
sizeof(T));
479 return new (x) T(a1, a2, a3, a4, a5);
481 --m_finalizer_array.m_tail;
482 undo_allocate(
sizeof(T));
487template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6>
492 m_finalizer_array.push(&zone::object_destruct<T>, x);
494 undo_allocate(
sizeof(T));
498 return new (x) T(a1, a2, a3, a4, a5, a6);
500 --m_finalizer_array.m_tail;
501 undo_allocate(
sizeof(T));
506template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7>
511 m_finalizer_array.push(&zone::object_destruct<T>, x);
513 undo_allocate(
sizeof(T));
517 return new (x) T(a1, a2, a3, a4, a5, a6, a7);
519 --m_finalizer_array.m_tail;
520 undo_allocate(
sizeof(T));
525template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8>
526T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
530 m_finalizer_array.push(&zone::object_destruct<T>, x);
532 undo_allocate(
sizeof(T));
536 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8);
538 --m_finalizer_array.m_tail;
539 undo_allocate(
sizeof(T));
544template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9>
545T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
549 m_finalizer_array.push(&zone::object_destruct<T>, x);
551 undo_allocate(
sizeof(T));
555 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
557 --m_finalizer_array.m_tail;
558 undo_allocate(
sizeof(T));
563template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10>
564T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10)
568 m_finalizer_array.push(&zone::object_destruct<T>, x);
570 undo_allocate(
sizeof(T));
574 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
576 --m_finalizer_array.m_tail;
577 undo_allocate(
sizeof(T));
582template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10,
typename A11>
583T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11)
587 m_finalizer_array.push(&zone::object_destruct<T>, x);
589 undo_allocate(
sizeof(T));
593 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
595 --m_finalizer_array.m_tail;
596 undo_allocate(
sizeof(T));
601template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10,
typename A11,
typename A12>
602T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12)
606 m_finalizer_array.push(&zone::object_destruct<T>, x);
608 undo_allocate(
sizeof(T));
612 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
614 --m_finalizer_array.m_tail;
615 undo_allocate(
sizeof(T));
620template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10,
typename A11,
typename A12,
typename A13>
621T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13)
625 m_finalizer_array.push(&zone::object_destruct<T>, x);
627 undo_allocate(
sizeof(T));
631 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
633 --m_finalizer_array.m_tail;
634 undo_allocate(
sizeof(T));
639template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10,
typename A11,
typename A12,
typename A13,
typename A14>
640T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14)
644 m_finalizer_array.push(&zone::object_destruct<T>, x);
646 undo_allocate(
sizeof(T));
650 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
652 --m_finalizer_array.m_tail;
653 undo_allocate(
sizeof(T));
658template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10,
typename A11,
typename A12,
typename A13,
typename A14,
typename A15>
659T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14, A15 a15)
663 m_finalizer_array.push(&zone::object_destruct<T>, x);
665 undo_allocate(
sizeof(T));
669 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);
671 --m_finalizer_array.m_tail;
672 undo_allocate(
sizeof(T));
#define MSGPACK_ASSERT
Definition assert.hpp:22
Definition cpp03_zone.hpp:30
void swap(zone &o)
Definition cpp03_zone.hpp:331
T * allocate(Args... args)
Definition cpp11_zone.hpp:356
void * allocate_no_align(size_t size)
Definition cpp03_zone.hpp:270
void clear()
Definition cpp03_zone.hpp:325
void * allocate_align(size_t size, size_t align=MSGPACK_ZONE_ALIGN)
Definition cpp03_zone.hpp:255
void push_finalizer(void(*func)(void *), void *data)
Definition cpp03_zone.hpp:314
zone(size_t chunk_size=MSGPACK_ZONE_CHUNK_SIZE)
Definition cpp03_zone.hpp:242
std::size_t size(T const &t)
Definition size_equal_only.hpp:24
Definition adaptor_base.hpp:15
std::size_t aligned_size(std::size_t size, std::size_t align)
Definition cpp03_zone.hpp:365
#define MSGPACK_NULLPTR
Definition cpp_config_decl.hpp:85
#define MSGPACK_ZONE_ALIGNOF(type)
Definition cpp03_zone_decl.hpp:30
#define MSGPACK_ZONE_ALIGN
Definition cpp03_zone_decl.hpp:24
#define MSGPACK_ZONE_CHUNK_SIZE
Definition cpp03_zone_decl.hpp:20
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition versioning.hpp:66