10 #ifndef MSGPACK_V1_CPP03_ZONE_HPP 11 #define MSGPACK_V1_CPP03_ZONE_HPP 24 finalizer(
void (*func)(
void*),
void* data):m_func(func), m_data(data) {}
25 void operator()() { m_func(m_data); }
26 void (*m_func)(
void*);
29 struct finalizer_array {
32 finalizer* fin = m_tail;
33 for(; fin != m_array; --fin) (*(fin-1))();
43 void push(
void (*func)(
void* data),
void* data)
45 finalizer* fin = m_tail;
48 push_expand(func, data);
57 void push_expand(
void (*func)(
void*),
void* data) {
58 const size_t nused = m_end - m_array;
61 nnext = (
sizeof(finalizer) < 72/2) ?
62 72 /
sizeof(finalizer) : 8;
67 static_cast<finalizer*
>(::realloc(m_array,
sizeof(finalizer) * nnext));
69 throw std::bad_alloc();
74 new (m_tail) finalizer(func, data);
86 chunk_list(
size_t chunk_size)
88 chunk* c =
static_cast<chunk*
>(::malloc(
sizeof(chunk) + chunk_size));
90 throw std::bad_alloc();
95 m_ptr =
reinterpret_cast<char*
>(c) +
sizeof(chunk);
102 chunk* n = c->m_next;
107 void clear(
size_t chunk_size)
111 chunk* n = c->m_next;
122 m_ptr =
reinterpret_cast<char*
>(m_head) +
sizeof(chunk);
129 chunk_list m_chunk_list;
130 finalizer_array m_finalizer_array;
141 template <
typename T>
147 static void*
operator new(std::size_t
size)
149 void* p = ::malloc(size);
150 if (!p)
throw std::bad_alloc();
153 static void operator delete(
void *p)
157 static void*
operator new(std::size_t
size,
void* place)
159 return ::operator
new(
size, place);
161 static void operator delete(
void* p,
void* place)
163 ::operator
delete(p, place);
167 template <
typename T>
170 template <
typename T,
typename A1>
173 template <
typename T,
typename A1,
typename A2>
176 template <
typename T,
typename A1,
typename A2,
typename A3>
179 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4>
180 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4);
182 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5>
183 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5);
185 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6>
186 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6);
188 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7>
189 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7);
191 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8>
192 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8);
194 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9>
195 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9);
197 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10>
198 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10);
200 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>
201 T*
allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11);
203 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>
204 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);
206 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>
207 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);
209 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>
210 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);
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,
typename A12,
typename A13,
typename A14,
typename A15>
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, A12 a12, A13 a13, A14 a14, A15 a15);
218 void undo_allocate(
size_t size);
220 template <
typename T>
221 static void object_destruct(
void* obj);
223 template <
typename T>
224 static void object_delete(
void* obj);
226 void* allocate_expand(
size_t size);
232 inline zone::zone(
size_t chunk_size) :m_chunk_size(chunk_size), m_chunk_list(m_chunk_size)
239 reinterpret_cast<char*
>(
240 reinterpret_cast<size_t>(
241 (m_chunk_list.m_ptr + (align - 1))) / align * align);
242 size_t adjusted_size = size + (aligned - m_chunk_list.m_ptr);
243 if(m_chunk_list.m_free >= adjusted_size) {
244 m_chunk_list.m_free -= adjusted_size;
245 m_chunk_list.m_ptr += adjusted_size;
248 return reinterpret_cast<char*
>(
249 reinterpret_cast<size_t>(
250 allocate_expand(size + (align - 1))) / align * align);
255 if(m_chunk_list.m_free < size) {
256 return allocate_expand(size);
259 char* ptr = m_chunk_list.m_ptr;
260 m_chunk_list.m_free -=
size;
261 m_chunk_list.m_ptr +=
size;
266 inline void* zone::allocate_expand(
size_t size)
268 chunk_list*
const cl = &m_chunk_list;
270 size_t sz = m_chunk_size;
273 size_t tmp_sz = sz * 2;
281 chunk* c =
static_cast<chunk*
>(::malloc(
sizeof(chunk) + sz));
282 if (!c)
throw std::bad_alloc();
284 char* ptr =
reinterpret_cast<char*
>(c) +
sizeof(chunk);
286 c->m_next = cl->m_head;
288 cl->m_free = sz -
size;
289 cl->m_ptr = ptr +
size;
296 m_finalizer_array.push(func, data);
299 template <
typename T>
302 m_finalizer_array.push(&zone::object_delete<T>, obj.release());
307 m_finalizer_array.clear();
308 m_chunk_list.clear(m_chunk_size);
314 swap(m_chunk_size, o.m_chunk_size);
315 swap(m_chunk_list, o.m_chunk_list);
316 swap(m_finalizer_array, o.m_finalizer_array);
319 template <
typename T>
320 void zone::object_destruct(
void* obj)
322 static_cast<T*
>(obj)->~T();
325 template <
typename T>
326 void zone::object_delete(
void* obj)
328 delete static_cast<T*
>(obj);
331 inline void zone::undo_allocate(
size_t size)
333 m_chunk_list.m_ptr -=
size;
334 m_chunk_list.m_free +=
size;
340 return (size + align - 1) / align * align;
345 template <
typename T>
350 m_finalizer_array.push(&zone::object_destruct<T>, x);
352 undo_allocate(
sizeof(T));
358 --m_finalizer_array.m_tail;
359 undo_allocate(
sizeof(T));
364 template <
typename T,
typename A1>
369 m_finalizer_array.push(&zone::object_destruct<T>, x);
371 undo_allocate(
sizeof(T));
375 return new (x) T(a1);
377 --m_finalizer_array.m_tail;
378 undo_allocate(
sizeof(T));
383 template <
typename T,
typename A1,
typename A2>
388 m_finalizer_array.push(&zone::object_destruct<T>, x);
390 undo_allocate(
sizeof(T));
394 return new (x) T(a1, a2);
396 --m_finalizer_array.m_tail;
397 undo_allocate(
sizeof(T));
402 template <
typename T,
typename A1,
typename A2,
typename A3>
407 m_finalizer_array.push(&zone::object_destruct<T>, x);
409 undo_allocate(
sizeof(T));
413 return new (x) T(a1, a2, a3);
415 --m_finalizer_array.m_tail;
416 undo_allocate(
sizeof(T));
421 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4>
426 m_finalizer_array.push(&zone::object_destruct<T>, x);
428 undo_allocate(
sizeof(T));
432 return new (x) T(a1, a2, a3, a4);
434 --m_finalizer_array.m_tail;
435 undo_allocate(
sizeof(T));
440 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5>
445 m_finalizer_array.push(&zone::object_destruct<T>, x);
447 undo_allocate(
sizeof(T));
451 return new (x) T(a1, a2, a3, a4, a5);
453 --m_finalizer_array.m_tail;
454 undo_allocate(
sizeof(T));
459 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6>
464 m_finalizer_array.push(&zone::object_destruct<T>, x);
466 undo_allocate(
sizeof(T));
470 return new (x) T(a1, a2, a3, a4, a5, a6);
472 --m_finalizer_array.m_tail;
473 undo_allocate(
sizeof(T));
478 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7>
479 T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
483 m_finalizer_array.push(&zone::object_destruct<T>, x);
485 undo_allocate(
sizeof(T));
489 return new (x) T(a1, a2, a3, a4, a5, a6, a7);
491 --m_finalizer_array.m_tail;
492 undo_allocate(
sizeof(T));
497 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8>
498 T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
502 m_finalizer_array.push(&zone::object_destruct<T>, x);
504 undo_allocate(
sizeof(T));
508 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8);
510 --m_finalizer_array.m_tail;
511 undo_allocate(
sizeof(T));
516 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9>
517 T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
521 m_finalizer_array.push(&zone::object_destruct<T>, x);
523 undo_allocate(
sizeof(T));
527 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
529 --m_finalizer_array.m_tail;
530 undo_allocate(
sizeof(T));
535 template <
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5,
typename A6,
typename A7,
typename A8,
typename A9,
typename A10>
536 T*
zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10)
540 m_finalizer_array.push(&zone::object_destruct<T>, x);
542 undo_allocate(
sizeof(T));
546 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
548 --m_finalizer_array.m_tail;
549 undo_allocate(
sizeof(T));
554 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>
555 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)
559 m_finalizer_array.push(&zone::object_destruct<T>, x);
561 undo_allocate(
sizeof(T));
565 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
567 --m_finalizer_array.m_tail;
568 undo_allocate(
sizeof(T));
573 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>
574 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)
578 m_finalizer_array.push(&zone::object_destruct<T>, x);
580 undo_allocate(
sizeof(T));
584 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
586 --m_finalizer_array.m_tail;
587 undo_allocate(
sizeof(T));
592 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>
593 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)
597 m_finalizer_array.push(&zone::object_destruct<T>, x);
599 undo_allocate(
sizeof(T));
603 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
605 --m_finalizer_array.m_tail;
606 undo_allocate(
sizeof(T));
611 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>
612 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)
616 m_finalizer_array.push(&zone::object_destruct<T>, x);
618 undo_allocate(
sizeof(T));
622 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
624 --m_finalizer_array.m_tail;
625 undo_allocate(
sizeof(T));
630 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>
631 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)
635 m_finalizer_array.push(&zone::object_destruct<T>, x);
637 undo_allocate(
sizeof(T));
641 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);
643 --m_finalizer_array.m_tail;
644 undo_allocate(
sizeof(T));
657 #endif // MSGPACK_V1_CPP03_ZONE_HPP void * allocate_align(size_t size, size_t align=MSGPACK_ZONE_ALIGN)
Definition: cpp03_zone.hpp:236
void * allocate_no_align(size_t size)
Definition: cpp03_zone.hpp:253
Definition: adaptor_base.hpp:15
std::size_t aligned_size(std::size_t size, std::size_t align)
Definition: cpp03_zone.hpp:337
Definition: cpp03_zone.hpp:22
Definition: cpp_config_decl.hpp:47
void push_finalizer(void(*func)(void *), void *data)
Definition: cpp03_zone.hpp:294
#define MSGPACK_ZONE_ALIGN
Definition: cpp03_zone_decl.hpp:24
std::size_t size(T const &t)
Definition: size_equal_only.hpp:24
void clear()
Definition: cpp03_zone.hpp:305
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition: versioning.hpp:58
#define MSGPACK_ZONE_CHUNK_SIZE
Definition: cpp03_zone_decl.hpp:20
void swap(zone &o)
Definition: cpp03_zone.hpp:311
T * allocate(Args... args)
Definition: cpp11_zone.hpp:330
zone(size_t chunk_size=MSGPACK_ZONE_CHUNK_SIZE)
Definition: cpp03_zone.hpp:232
#define MSGPACK_NULLPTR
Definition: cpp_config_decl.hpp:35