10 #ifndef MSGPACK_CPP03_ZONE_HPP 11 #define MSGPACK_CPP03_ZONE_HPP 19 #ifndef MSGPACK_ZONE_CHUNK_SIZE 20 #define MSGPACK_ZONE_CHUNK_SIZE 8192 23 #ifndef MSGPACK_ZONE_ALIGN 24 #define MSGPACK_ZONE_ALIGN sizeof(void*) 36 finalizer(
void (*func)(
void*),
void* data):m_func(func), m_data(data) {}
37 void operator()() { m_func(m_data); }
38 void (*m_func)(
void*);
41 struct finalizer_array {
42 finalizer_array():m_tail(
nullptr), m_end(
nullptr), m_array(
nullptr) {}
44 finalizer* fin = m_tail;
45 for(; fin != m_array; --fin) (*(fin-1))();
55 void push(
void (*func)(
void* data),
void* data)
57 finalizer* fin = m_tail;
60 push_expand(func, data);
69 void push_expand(
void (*func)(
void*),
void* data) {
70 const size_t nused = m_end - m_array;
73 nnext = (
sizeof(finalizer) < 72/2) ?
74 72 /
sizeof(finalizer) : 8;
79 static_cast<finalizer*
>(::realloc(m_array,
sizeof(finalizer) * nnext));
81 throw std::bad_alloc();
86 new (m_tail) finalizer(func, data);
98 chunk_list(
size_t chunk_size)
100 chunk* c =
static_cast<chunk*
>(::malloc(
sizeof(chunk) + chunk_size));
102 throw std::bad_alloc();
107 m_ptr =
reinterpret_cast<char*
>(c) +
sizeof(chunk);
114 chunk* n = c->m_next;
119 void clear(
size_t chunk_size)
123 chunk* n = c->m_next;
132 m_head->m_next =
nullptr;
134 m_ptr =
reinterpret_cast<char*
>(m_head) +
sizeof(chunk);
141 chunk_list m_chunk_list;
142 finalizer_array m_finalizer_array;
153 template <
typename T>
159 static void*
operator new(std::size_t size)
161 void* p = ::malloc(size);
162 if (!p)
throw std::bad_alloc();
165 static void operator delete(
void *p)
169 static void*
operator new(std::size_t size,
void* place)
171 return ::operator
new(size, place);
173 static void operator delete(
void* p,
void* place)
175 ::operator
delete(p, place);
179 template <
typename T>
182 template <
typename T,
typename A1>
185 template <
typename T,
typename A1,
typename A2>
188 template <
typename T,
typename A1,
typename A2,
typename A3>
191 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4>
192 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4);
194 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5>
195 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5);
197 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6>
198 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6);
200 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7>
201 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7);
203 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8>
204 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8);
206 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9>
207 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9);
209 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10>
210 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10);
212 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>
213 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11);
215 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>
216 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);
218 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>
219 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);
221 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>
222 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);
224 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>
225 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);
230 void undo_allocate(
size_t size);
232 template <
typename T>
233 static void object_destruct(
void* obj);
235 template <
typename T>
236 static void object_delete(
void* obj);
238 void* allocate_expand(
size_t size);
244 inline zone::zone(
size_t chunk_size) :m_chunk_size(chunk_size), m_chunk_list(m_chunk_size)
251 reinterpret_cast<char*
>(
252 reinterpret_cast<size_t>(
253 (m_chunk_list.m_ptr + (align - 1))) / align * align);
254 size_t adjusted_size = size + (aligned - m_chunk_list.m_ptr);
255 if(m_chunk_list.m_free >= adjusted_size) {
256 m_chunk_list.m_free -= adjusted_size;
257 m_chunk_list.m_ptr += adjusted_size;
260 return reinterpret_cast<char*
>(
261 reinterpret_cast<size_t>(
262 allocate_expand(size + (align - 1))) / align * align);
267 if(m_chunk_list.m_free < size) {
268 return allocate_expand(size);
271 char* ptr = m_chunk_list.m_ptr;
272 m_chunk_list.m_free -= size;
273 m_chunk_list.m_ptr += size;
278 inline void* zone::allocate_expand(
size_t size)
280 chunk_list*
const cl = &m_chunk_list;
282 size_t sz = m_chunk_size;
285 size_t tmp_sz = sz * 2;
293 chunk* c =
static_cast<chunk*
>(::malloc(
sizeof(chunk) + sz));
294 if (!c)
throw std::bad_alloc();
296 char* ptr =
reinterpret_cast<char*
>(c) +
sizeof(chunk);
298 c->m_next = cl->m_head;
300 cl->m_free = sz - size;
301 cl->m_ptr = ptr + size;
308 m_finalizer_array.push(func, data);
311 template <
typename T>
314 m_finalizer_array.push(&zone::object_delete<T>, obj.release());
319 m_finalizer_array.clear();
320 m_chunk_list.clear(m_chunk_size);
326 swap(m_chunk_size, o.m_chunk_size);
327 swap(m_chunk_list, o.m_chunk_list);
328 swap(m_finalizer_array, o.m_finalizer_array);
331 template <
typename T>
332 void zone::object_destruct(
void* obj)
334 static_cast<T*
>(obj)->~T();
337 template <
typename T>
338 void zone::object_delete(
void* obj)
340 delete static_cast<T*
>(obj);
343 inline void zone::undo_allocate(
size_t size)
345 m_chunk_list.m_ptr -= size;
346 m_chunk_list.m_free += size;
352 return (size + align - 1) / align * align;
357 template <
typename T>
362 m_finalizer_array.push(&zone::object_destruct<T>, x);
364 undo_allocate(
sizeof(T));
370 --m_finalizer_array.m_tail;
371 undo_allocate(
sizeof(T));
376 template <
typename T,
typename A1>
381 m_finalizer_array.push(&zone::object_destruct<T>, x);
383 undo_allocate(
sizeof(T));
387 return new (x) T(a1);
389 --m_finalizer_array.m_tail;
390 undo_allocate(
sizeof(T));
395 template <
typename T,
typename A1,
typename A2>
400 m_finalizer_array.push(&zone::object_destruct<T>, x);
402 undo_allocate(
sizeof(T));
406 return new (x) T(a1, a2);
408 --m_finalizer_array.m_tail;
409 undo_allocate(
sizeof(T));
414 template <
typename T,
typename A1,
typename A2,
typename A3>
419 m_finalizer_array.push(&zone::object_destruct<T>, x);
421 undo_allocate(
sizeof(T));
425 return new (x) T(a1, a2, a3);
427 --m_finalizer_array.m_tail;
428 undo_allocate(
sizeof(T));
433 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4>
438 m_finalizer_array.push(&zone::object_destruct<T>, x);
440 undo_allocate(
sizeof(T));
444 return new (x) T(a1, a2, a3, a4);
446 --m_finalizer_array.m_tail;
447 undo_allocate(
sizeof(T));
452 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5>
457 m_finalizer_array.push(&zone::object_destruct<T>, x);
459 undo_allocate(
sizeof(T));
463 return new (x) T(a1, a2, a3, a4, a5);
465 --m_finalizer_array.m_tail;
466 undo_allocate(
sizeof(T));
471 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6>
476 m_finalizer_array.push(&zone::object_destruct<T>, x);
478 undo_allocate(
sizeof(T));
482 return new (x) T(a1, a2, a3, a4, a5, a6);
484 --m_finalizer_array.m_tail;
485 undo_allocate(
sizeof(T));
490 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7>
491 T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
495 m_finalizer_array.push(&zone::object_destruct<T>, x);
497 undo_allocate(
sizeof(T));
501 return new (x) T(a1, a2, a3, a4, a5, a6, a7);
503 --m_finalizer_array.m_tail;
504 undo_allocate(
sizeof(T));
509 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8>
510 T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
514 m_finalizer_array.push(&zone::object_destruct<T>, x);
516 undo_allocate(
sizeof(T));
520 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8);
522 --m_finalizer_array.m_tail;
523 undo_allocate(
sizeof(T));
528 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9>
529 T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
533 m_finalizer_array.push(&zone::object_destruct<T>, x);
535 undo_allocate(
sizeof(T));
539 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
541 --m_finalizer_array.m_tail;
542 undo_allocate(
sizeof(T));
547 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10>
548 T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10)
552 m_finalizer_array.push(&zone::object_destruct<T>, x);
554 undo_allocate(
sizeof(T));
558 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
560 --m_finalizer_array.m_tail;
561 undo_allocate(
sizeof(T));
566 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>
567 T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11)
571 m_finalizer_array.push(&zone::object_destruct<T>, x);
573 undo_allocate(
sizeof(T));
577 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
579 --m_finalizer_array.m_tail;
580 undo_allocate(
sizeof(T));
585 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>
586 T*
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)
590 m_finalizer_array.push(&zone::object_destruct<T>, x);
592 undo_allocate(
sizeof(T));
596 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
598 --m_finalizer_array.m_tail;
599 undo_allocate(
sizeof(T));
604 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>
605 T*
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)
609 m_finalizer_array.push(&zone::object_destruct<T>, x);
611 undo_allocate(
sizeof(T));
615 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
617 --m_finalizer_array.m_tail;
618 undo_allocate(
sizeof(T));
623 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>
624 T*
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)
628 m_finalizer_array.push(&zone::object_destruct<T>, x);
630 undo_allocate(
sizeof(T));
634 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
636 --m_finalizer_array.m_tail;
637 undo_allocate(
sizeof(T));
642 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>
643 T*
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)
647 m_finalizer_array.push(&zone::object_destruct<T>, x);
649 undo_allocate(
sizeof(T));
653 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);
655 --m_finalizer_array.m_tail;
656 undo_allocate(
sizeof(T));
669 #endif // MSGPACK_CPP03_ZONE_HPP #define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition: versioning.hpp:58
void * allocate_align(size_t size, size_t align=MSGPACK_ZONE_ALIGN)
Definition: cpp03_zone.hpp:248
#define MSGPACK_ZONE_CHUNK_SIZE
Definition: cpp03_zone.hpp:20
void * allocate_no_align(size_t size)
Definition: cpp03_zone.hpp:265
#define MSGPACK_ZONE_ALIGN
Definition: cpp03_zone.hpp:24
Definition: adaptor_base.hpp:15
Definition: cpp03_zone.hpp:34
Definition: cpp_config.hpp:44
void push_finalizer(void(*func)(void *), void *data)
Definition: cpp03_zone.hpp:306
void clear()
Definition: cpp03_zone.hpp:317
void swap(zone &o)
Definition: cpp03_zone.hpp:323
T * allocate(Args... args)
Definition: cpp11_zone.hpp:338
zone(size_t chunk_size=MSGPACK_ZONE_CHUNK_SIZE)
Definition: cpp03_zone.hpp:244
std::size_t aligned_size(std::size_t size, std::size_t align=MSGPACK_ZONE_ALIGN)
Definition: cpp03_zone.hpp:349