MessagePack for C++
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 
13 #include "msgpack/versioning.hpp"
14 #include "msgpack/cpp_config.hpp"
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 
24 namespace msgpack {
25 
29 
30 class 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 
140 public:
141  zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE);
142 
143 public:
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 
225 private:
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);
237 private:
238  zone(const zone&);
239  zone& operator=(const zone&);
240 };
241 
242 inline zone::zone(size_t chunk_size):m_chunk_size(chunk_size), m_chunk_list(m_chunk_size)
243 {
244 }
245 
246 inline 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 
255 inline 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 
270 inline 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 
282 inline 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 
310 inline void zone::push_finalizer(void (*func)(void*), void* data)
311 {
312  m_finalizer_array.push(func, data);
313 }
314 
315 template <typename T>
316 inline void zone::push_finalizer(msgpack::unique_ptr<T> obj)
317 {
318  m_finalizer_array.push(&zone::object_delete<T>, obj.release());
319 }
320 
321 inline void zone::clear()
322 {
323  m_finalizer_array.clear();
324  m_chunk_list.clear(m_chunk_size);
325 }
326 
327 inline 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 
335 template <typename T>
336 void zone::object_destruct(void* obj)
337 {
338  static_cast<T*>(obj)->~T();
339 }
340 
341 template <typename T>
342 void zone::object_delete(void* obj)
343 {
344  delete static_cast<T*>(obj);
345 }
346 
347 inline void zone::undo_allocate(size_t size)
348 {
349  m_chunk_list.m_ptr -= size;
350  m_chunk_list.m_free += size;
351 }
352 
353 inline 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 
361 template <typename T>
362 T* zone::allocate()
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 
380 template <typename T, typename A1>
381 T* 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 
399 template <typename T, typename A1, typename A2>
400 T* 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 
418 template <typename T, typename A1, typename A2, typename A3>
419 T* 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 
437 template <typename T, typename A1, typename A2, typename A3, typename A4>
438 T* 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 
456 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5>
457 T* 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 
475 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
476 T* 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 
494 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
495 T* 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 
513 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
514 T* 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 
532 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
533 T* 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 
551 template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
552 T* 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 
570 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>
571 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)
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 
589 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>
590 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)
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 
608 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>
609 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)
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 
627 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>
628 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)
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 
646 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>
647 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)
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