MessagePack for C++
Loading...
Searching...
No Matches
cpp03_zone.hpp
Go to the documentation of this file.
1//
2// MessagePack for C++ memory pool
3//
4// Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi
5//
6// Distributed under the Boost Software License, Version 1.0.
7// (See accompanying file LICENSE_1_0.txt or copy at
8// http://www.boost.org/LICENSE_1_0.txt)
9//
10#ifndef MSGPACK_V1_CPP03_ZONE_HPP
11#define MSGPACK_V1_CPP03_ZONE_HPP
12
15#include "msgpack/zone_decl.hpp"
16#include "msgpack/assert.hpp"
17
18#include <stdint.h>
19#include <cstdlib>
20#include <memory>
21#include <vector>
22
23
24namespace msgpack {
25
29
30class zone {
31 struct finalizer {
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*);
35 void* m_data;
36 };
37 struct finalizer_array {
38 finalizer_array():m_tail(MSGPACK_NULLPTR), m_end(MSGPACK_NULLPTR), m_array(MSGPACK_NULLPTR) {}
39 void call() {
40 finalizer* fin = m_tail;
41 for(; fin != m_array; --fin) (*(fin-1))();
42 }
43 ~finalizer_array() {
44 call();
45 ::free(m_array);
46 }
47 void clear() {
48 call();
49 m_tail = m_array;
50 }
51 void push(void (*func)(void* data), void* data)
52 {
53 finalizer* fin = m_tail;
54
55 if(fin == m_end) {
56 push_expand(func, data);
57 return;
58 }
59
60 fin->m_func = func;
61 fin->m_data = data;
62
63 ++m_tail;
64 }
65 void push_expand(void (*func)(void*), void* data) {
66 const size_t nused = static_cast<size_t>(m_end - m_array);
67 size_t nnext;
68 if(nused == 0) {
69 nnext = (sizeof(finalizer) < 72/2) ?
70 72 / sizeof(finalizer) : 8;
71 } else {
72 nnext = nused * 2;
73 }
74 finalizer* tmp =
75 static_cast<finalizer*>(::realloc(m_array, sizeof(finalizer) * nnext));
76 if(!tmp) {
77 throw std::bad_alloc();
78 }
79 m_array = tmp;
80 m_end = tmp + nnext;
81 m_tail = tmp + nused;
82 new (m_tail) finalizer(func, data);
83
84 ++m_tail;
85 }
86 finalizer* m_tail;
87 finalizer* m_end;
88 finalizer* m_array;
89 };
90 struct chunk {
91 chunk* m_next;
92 };
93 struct chunk_list {
94 chunk_list(size_t chunk_size)
95 {
96 chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + chunk_size));
97 if(!c) {
98 throw std::bad_alloc();
99 }
100
101 m_head = c;
102 m_free = chunk_size;
103 m_ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
104 c->m_next = MSGPACK_NULLPTR;
105 }
106 ~chunk_list()
107 {
108 chunk* c = m_head;
109 while(c) {
110 chunk* n = c->m_next;
111 ::free(c);
112 c = n;
113 }
114 }
115 void clear(size_t chunk_size)
116 {
117 chunk* c = m_head;
118 while(true) {
119 chunk* n = c->m_next;
120 if(n) {
121 ::free(c);
122 c = n;
123 } else {
124 m_head = c;
125 break;
126 }
127 }
128 m_head->m_next = MSGPACK_NULLPTR;
129 m_free = chunk_size;
130 m_ptr = reinterpret_cast<char*>(m_head) + sizeof(chunk);
131 }
132 size_t m_free;
133 char* m_ptr;
134 chunk* m_head;
135 };
136 size_t m_chunk_size;
137 chunk_list m_chunk_list;
138 finalizer_array m_finalizer_array;
139
140public:
141 zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE);
142
143public:
144 void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN);
145 void* allocate_no_align(size_t size);
146
147 void push_finalizer(void (*func)(void*), void* data);
148
149 template <typename T>
150 void push_finalizer(msgpack::unique_ptr<T> obj);
151
152 void clear();
153
154 void swap(zone& o);
155 static void* operator new(std::size_t size)
156 {
157 void* p = ::malloc(size);
158 if (!p) throw std::bad_alloc();
159 return p;
160 }
161 static void operator delete(void *p) /* throw() */
162 {
163 ::free(p);
164 }
165 static void* operator new(std::size_t size, void* place) /* throw() */
166 {
167 return ::operator new(size, place);
168 }
169 static void operator delete(void* p, void* place) /* throw() */
170 {
171 ::operator delete(p, place);
172 }
174
175 template <typename T>
176 T* allocate();
177
178 template <typename T, typename A1>
179 T* allocate(A1 a1);
180
181 template <typename T, typename A1, typename A2>
182 T* allocate(A1 a1, A2 a2);
183
184 template <typename T, typename A1, typename A2, typename A3>
185 T* allocate(A1 a1, A2 a2, A3 a3);
186
187 template <typename T, typename A1, typename A2, typename A3, typename A4>
188 T* allocate(A1 a1, A2 a2, A3 a3, A4 a4);
189
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);
192
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);
195
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);
198
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);
201
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);
204
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);
207
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);
210
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);
213
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);
216
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);
219
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);
222
224
225private:
226 void undo_allocate(size_t size);
227
228 template <typename T>
229 static void object_destruct(void* obj);
230
231 template <typename T>
232 static void object_delete(void* obj);
233
234 static char* get_aligned(char* ptr, size_t align);
235
236 char* allocate_expand(size_t size);
237private:
238 zone(const zone&);
239 zone& operator=(const zone&);
240};
241
242inline zone::zone(size_t chunk_size):m_chunk_size(chunk_size), m_chunk_list(m_chunk_size)
243{
244}
245
246inline char* zone::get_aligned(char* ptr, size_t align)
247{
248 MSGPACK_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0)
249 return
250 reinterpret_cast<char*>(
251 reinterpret_cast<uintptr_t>(ptr + (align - 1)) & ~static_cast<uintptr_t>(align - 1)
252 );
253}
254
255inline void* zone::allocate_align(size_t size, size_t align)
256{
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);
264 }
265 m_chunk_list.m_free -= adjusted_size;
266 m_chunk_list.m_ptr += adjusted_size;
267 return aligned;
268}
269
270inline void* zone::allocate_no_align(size_t size)
271{
272 char* ptr = m_chunk_list.m_ptr;
273 if(m_chunk_list.m_free < size) {
274 ptr = allocate_expand(size);
275 }
276 m_chunk_list.m_free -= size;
277 m_chunk_list.m_ptr += size;
278
279 return ptr;
280}
281
282inline char* zone::allocate_expand(size_t size)
283{
284 chunk_list* const cl = &m_chunk_list;
285
286 size_t sz = m_chunk_size;
287
288 while(sz < size) {
289 size_t tmp_sz = sz * 2;
290 if (tmp_sz <= sz) {
291 sz = size;
292 break;
293 }
294 sz = tmp_sz;
295 }
296
297 chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + sz));
298 if (!c) throw std::bad_alloc();
299
300 char* ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
301
302 c->m_next = cl->m_head;
303 cl->m_head = c;
304 cl->m_free = sz;
305 cl->m_ptr = ptr;
306
307 return ptr;
308}
309
310inline void zone::push_finalizer(void (*func)(void*), void* data)
311{
312 m_finalizer_array.push(func, data);
313}
314
315template <typename T>
316inline void zone::push_finalizer(msgpack::unique_ptr<T> obj)
317{
318 m_finalizer_array.push(&zone::object_delete<T>, obj.release());
319}
320
321inline void zone::clear()
322{
323 m_finalizer_array.clear();
324 m_chunk_list.clear(m_chunk_size);
325}
326
327inline void zone::swap(zone& o)
328{
329 using std::swap;
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);
333}
334
335template <typename T>
336void zone::object_destruct(void* obj)
337{
338 static_cast<T*>(obj)->~T();
339}
340
341template <typename T>
342void zone::object_delete(void* obj)
343{
344 delete static_cast<T*>(obj);
345}
346
347inline void zone::undo_allocate(size_t size)
348{
349 m_chunk_list.m_ptr -= size;
350 m_chunk_list.m_free += size;
351}
352
353inline std::size_t aligned_size(
354 std::size_t size,
355 std::size_t align) {
356 return (size + align - 1) / align * align;
357}
358
360
361template <typename T>
363{
364 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
365 try {
366 m_finalizer_array.push(&zone::object_destruct<T>, x);
367 } catch (...) {
368 undo_allocate(sizeof(T));
369 throw;
370 }
371 try {
372 return new (x) T();
373 } catch (...) {
374 --m_finalizer_array.m_tail;
375 undo_allocate(sizeof(T));
376 throw;
377 }
378}
379
380template <typename T, typename A1>
381T* zone::allocate(A1 a1)
382{
383 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
384 try {
385 m_finalizer_array.push(&zone::object_destruct<T>, x);
386 } catch (...) {
387 undo_allocate(sizeof(T));
388 throw;
389 }
390 try {
391 return new (x) T(a1);
392 } catch (...) {
393 --m_finalizer_array.m_tail;
394 undo_allocate(sizeof(T));
395 throw;
396 }
397}
398
399template <typename T, typename A1, typename A2>
400T* zone::allocate(A1 a1, A2 a2)
401{
402 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
403 try {
404 m_finalizer_array.push(&zone::object_destruct<T>, x);
405 } catch (...) {
406 undo_allocate(sizeof(T));
407 throw;
408 }
409 try {
410 return new (x) T(a1, a2);
411 } catch (...) {
412 --m_finalizer_array.m_tail;
413 undo_allocate(sizeof(T));
414 throw;
415 }
416}
417
418template <typename T, typename A1, typename A2, typename A3>
419T* zone::allocate(A1 a1, A2 a2, A3 a3)
420{
421 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
422 try {
423 m_finalizer_array.push(&zone::object_destruct<T>, x);
424 } catch (...) {
425 undo_allocate(sizeof(T));
426 throw;
427 }
428 try {
429 return new (x) T(a1, a2, a3);
430 } catch (...) {
431 --m_finalizer_array.m_tail;
432 undo_allocate(sizeof(T));
433 throw;
434 }
435}
436
437template <typename T, typename A1, typename A2, typename A3, typename A4>
438T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4)
439{
440 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
441 try {
442 m_finalizer_array.push(&zone::object_destruct<T>, x);
443 } catch (...) {
444 undo_allocate(sizeof(T));
445 throw;
446 }
447 try {
448 return new (x) T(a1, a2, a3, a4);
449 } catch (...) {
450 --m_finalizer_array.m_tail;
451 undo_allocate(sizeof(T));
452 throw;
453 }
454}
455
456template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5>
457T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
458{
459 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
460 try {
461 m_finalizer_array.push(&zone::object_destruct<T>, x);
462 } catch (...) {
463 undo_allocate(sizeof(T));
464 throw;
465 }
466 try {
467 return new (x) T(a1, a2, a3, a4, a5);
468 } catch (...) {
469 --m_finalizer_array.m_tail;
470 undo_allocate(sizeof(T));
471 throw;
472 }
473}
474
475template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
476T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
477{
478 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
479 try {
480 m_finalizer_array.push(&zone::object_destruct<T>, x);
481 } catch (...) {
482 undo_allocate(sizeof(T));
483 throw;
484 }
485 try {
486 return new (x) T(a1, a2, a3, a4, a5, a6);
487 } catch (...) {
488 --m_finalizer_array.m_tail;
489 undo_allocate(sizeof(T));
490 throw;
491 }
492}
493
494template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
495T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
496{
497 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
498 try {
499 m_finalizer_array.push(&zone::object_destruct<T>, x);
500 } catch (...) {
501 undo_allocate(sizeof(T));
502 throw;
503 }
504 try {
505 return new (x) T(a1, a2, a3, a4, a5, a6, a7);
506 } catch (...) {
507 --m_finalizer_array.m_tail;
508 undo_allocate(sizeof(T));
509 throw;
510 }
511}
512
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)
515{
516 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
517 try {
518 m_finalizer_array.push(&zone::object_destruct<T>, x);
519 } catch (...) {
520 undo_allocate(sizeof(T));
521 throw;
522 }
523 try {
524 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8);
525 } catch (...) {
526 --m_finalizer_array.m_tail;
527 undo_allocate(sizeof(T));
528 throw;
529 }
530}
531
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)
534{
535 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
536 try {
537 m_finalizer_array.push(&zone::object_destruct<T>, x);
538 } catch (...) {
539 undo_allocate(sizeof(T));
540 throw;
541 }
542 try {
543 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
544 } catch (...) {
545 --m_finalizer_array.m_tail;
546 undo_allocate(sizeof(T));
547 throw;
548 }
549}
550
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)
553{
554 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
555 try {
556 m_finalizer_array.push(&zone::object_destruct<T>, x);
557 } catch (...) {
558 undo_allocate(sizeof(T));
559 throw;
560 }
561 try {
562 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
563 } catch (...) {
564 --m_finalizer_array.m_tail;
565 undo_allocate(sizeof(T));
566 throw;
567 }
568}
569
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)
572{
573 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
574 try {
575 m_finalizer_array.push(&zone::object_destruct<T>, x);
576 } catch (...) {
577 undo_allocate(sizeof(T));
578 throw;
579 }
580 try {
581 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
582 } catch (...) {
583 --m_finalizer_array.m_tail;
584 undo_allocate(sizeof(T));
585 throw;
586 }
587}
588
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)
591{
592 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
593 try {
594 m_finalizer_array.push(&zone::object_destruct<T>, x);
595 } catch (...) {
596 undo_allocate(sizeof(T));
597 throw;
598 }
599 try {
600 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
601 } catch (...) {
602 --m_finalizer_array.m_tail;
603 undo_allocate(sizeof(T));
604 throw;
605 }
606}
607
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)
610{
611 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
612 try {
613 m_finalizer_array.push(&zone::object_destruct<T>, x);
614 } catch (...) {
615 undo_allocate(sizeof(T));
616 throw;
617 }
618 try {
619 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
620 } catch (...) {
621 --m_finalizer_array.m_tail;
622 undo_allocate(sizeof(T));
623 throw;
624 }
625}
626
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)
629{
630 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
631 try {
632 m_finalizer_array.push(&zone::object_destruct<T>, x);
633 } catch (...) {
634 undo_allocate(sizeof(T));
635 throw;
636 }
637 try {
638 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
639 } catch (...) {
640 --m_finalizer_array.m_tail;
641 undo_allocate(sizeof(T));
642 throw;
643 }
644}
645
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)
648{
649 void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T));
650 try {
651 m_finalizer_array.push(&zone::object_destruct<T>, x);
652 } catch (...) {
653 undo_allocate(sizeof(T));
654 throw;
655 }
656 try {
657 return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);
658 } catch (...) {
659 --m_finalizer_array.m_tail;
660 undo_allocate(sizeof(T));
661 throw;
662 }
663}
664
666
668} // MSGPACK_API_VERSION_NAMESPACE(v1)
670
671} // namespace msgpack
672
673#endif // MSGPACK_V1_CPP03_ZONE_HPP
#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