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 chunk* c =
static_cast<chunk*
>(::malloc(
sizeof(chunk) + sz));
298 if (!c)
throw std::bad_alloc();
300 char* ptr =
reinterpret_cast<char*
>(c) +
sizeof(chunk);
302 c->m_next = cl->m_head;
312 m_finalizer_array.push(func, data);
318 m_finalizer_array.push(&zone::object_delete<T>, obj.release());
323 m_finalizer_array.clear();
324 m_chunk_list.clear(m_chunk_size);
330 swap(m_chunk_size, o.m_chunk_size);
331 swap(m_chunk_list, o.m_chunk_list);
332 swap(m_finalizer_array, o.m_finalizer_array);
336void zone::object_destruct(
void* obj)
338 static_cast<T*
>(obj)->~T();
342void zone::object_delete(
void* obj)
344 delete static_cast<T*
>(obj);
347inline void zone::undo_allocate(
size_t size)
349 m_chunk_list.m_ptr -=
size;
350 m_chunk_list.m_free +=
size;
356 return (size + align - 1) / align * align;
366 m_finalizer_array.push(&zone::object_destruct<T>, x);
368 undo_allocate(
sizeof(T));
374 --m_finalizer_array.m_tail;
375 undo_allocate(
sizeof(T));
380template <
typename T,
typename A1>
385 m_finalizer_array.push(&zone::object_destruct<T>, x);
387 undo_allocate(
sizeof(T));
391 return new (x) T(a1);
393 --m_finalizer_array.m_tail;
394 undo_allocate(
sizeof(T));
399template <
typename T,
typename A1,
typename A2>
404 m_finalizer_array.push(&zone::object_destruct<T>, x);
406 undo_allocate(
sizeof(T));
410 return new (x) T(a1, a2);
412 --m_finalizer_array.m_tail;
413 undo_allocate(
sizeof(T));
418template <
typename T,
typename A1,
typename A2,
typename A3>
423 m_finalizer_array.push(&zone::object_destruct<T>, x);
425 undo_allocate(
sizeof(T));
429 return new (x) T(a1, a2, a3);
431 --m_finalizer_array.m_tail;
432 undo_allocate(
sizeof(T));
437template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4>
442 m_finalizer_array.push(&zone::object_destruct<T>, x);
444 undo_allocate(
sizeof(T));
448 return new (x) T(a1, a2, a3, a4);
450 --m_finalizer_array.m_tail;
451 undo_allocate(
sizeof(T));
456template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5>
461 m_finalizer_array.push(&zone::object_destruct<T>, x);
463 undo_allocate(
sizeof(T));
467 return new (x) T(a1, a2, a3, a4, a5);
469 --m_finalizer_array.m_tail;
470 undo_allocate(
sizeof(T));
475template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6>
480 m_finalizer_array.push(&zone::object_destruct<T>, x);
482 undo_allocate(
sizeof(T));
486 return new (x) T(a1, a2, a3, a4, a5, a6);
488 --m_finalizer_array.m_tail;
489 undo_allocate(
sizeof(T));
494template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7>
499 m_finalizer_array.push(&zone::object_destruct<T>, x);
501 undo_allocate(
sizeof(T));
505 return new (x) T(a1, a2, a3, a4, a5, a6, a7);
507 --m_finalizer_array.m_tail;
508 undo_allocate(
sizeof(T));
513template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8>
514T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
518 m_finalizer_array.push(&zone::object_destruct<T>, x);
520 undo_allocate(
sizeof(T));
524 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8);
526 --m_finalizer_array.m_tail;
527 undo_allocate(
sizeof(T));
532template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9>
533T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
537 m_finalizer_array.push(&zone::object_destruct<T>, x);
539 undo_allocate(
sizeof(T));
543 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
545 --m_finalizer_array.m_tail;
546 undo_allocate(
sizeof(T));
551template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10>
552T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10)
556 m_finalizer_array.push(&zone::object_destruct<T>, x);
558 undo_allocate(
sizeof(T));
562 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
564 --m_finalizer_array.m_tail;
565 undo_allocate(
sizeof(T));
570template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10,
typename A11>
571T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11)
575 m_finalizer_array.push(&zone::object_destruct<T>, x);
577 undo_allocate(
sizeof(T));
581 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
583 --m_finalizer_array.m_tail;
584 undo_allocate(
sizeof(T));
589template <
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>
590T*
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)
594 m_finalizer_array.push(&zone::object_destruct<T>, x);
596 undo_allocate(
sizeof(T));
600 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
602 --m_finalizer_array.m_tail;
603 undo_allocate(
sizeof(T));
608template <
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>
609T*
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)
613 m_finalizer_array.push(&zone::object_destruct<T>, x);
615 undo_allocate(
sizeof(T));
619 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
621 --m_finalizer_array.m_tail;
622 undo_allocate(
sizeof(T));
627template <
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>
628T*
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)
632 m_finalizer_array.push(&zone::object_destruct<T>, x);
634 undo_allocate(
sizeof(T));
638 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
640 --m_finalizer_array.m_tail;
641 undo_allocate(
sizeof(T));
646template <
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>
647T*
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)
651 m_finalizer_array.push(&zone::object_destruct<T>, x);
653 undo_allocate(
sizeof(T));
657 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);
659 --m_finalizer_array.m_tail;
660 undo_allocate(
sizeof(T));
#define MSGPACK_ASSERT
Definition assert.hpp:22
Definition cpp03_zone.hpp:30
void swap(zone &o)
Definition cpp03_zone.hpp:327
T * allocate(Args... args)
Definition cpp11_zone.hpp:339
void * allocate_no_align(size_t size)
Definition cpp03_zone.hpp:270
void clear()
Definition cpp03_zone.hpp:321
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:310
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:353
#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