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