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