346 __attribute__((__nonnull__))
347 : _M_upstream(__upstream)
348 { _GLIBCXX_DEBUG_ASSERT(__upstream !=
nullptr); }
352 __attribute__((__nonnull__))
353 : _M_next_bufsiz(__initial_size),
354 _M_upstream(__upstream)
356 _GLIBCXX_DEBUG_ASSERT(__upstream !=
nullptr);
357 _GLIBCXX_DEBUG_ASSERT(__initial_size > 0);
362 __attribute__((__nonnull__(4)))
363 : _M_current_buf(__buffer), _M_avail(__buffer_size),
364 _M_next_bufsiz(_S_next_bufsize(__buffer_size)),
365 _M_upstream(__upstream),
366 _M_orig_buf(__buffer), _M_orig_size(__buffer_size)
368 _GLIBCXX_DEBUG_ASSERT(__upstream !=
nullptr);
369 _GLIBCXX_DEBUG_ASSERT(__buffer !=
nullptr || __buffer_size == 0);
396 _M_release_buffers();
399 if ((_M_current_buf = _M_orig_buf))
401 _M_avail = _M_orig_size;
402 _M_next_bufsiz = _S_next_bufsize(_M_orig_size);
407 _M_next_bufsiz = _M_orig_size;
412 upstream_resource()
const noexcept
413 __attribute__((__returns_nonnull__))
414 {
return _M_upstream; }
418 do_allocate(
size_t __bytes,
size_t __alignment)
override
420 if (__builtin_expect(__bytes == 0,
false))
423 void* __p =
std::align(__alignment, __bytes, _M_current_buf, _M_avail);
424 if (__builtin_expect(__p ==
nullptr,
false))
426 _M_new_buffer(__bytes, __alignment);
427 __p = _M_current_buf;
429 _M_current_buf = (
char*)_M_current_buf + __bytes;
435 do_deallocate(
void*,
size_t,
size_t)
override
440 {
return this == &__other; }
446 _M_new_buffer(
size_t __bytes,
size_t __alignment);
450 _M_release_buffers()
noexcept;
453 _S_next_bufsize(
size_t __buffer_size)
noexcept
455 if (__builtin_expect(__buffer_size == 0,
false))
457 return __buffer_size * _S_growth_factor;
460 static constexpr size_t _S_init_bufsize = 128 *
sizeof(
void*);
461 static constexpr float _S_growth_factor = 1.5;
463 void* _M_current_buf =
nullptr;
465 size_t _M_next_bufsiz = _S_init_bufsize;
469 void*
const _M_orig_buf =
nullptr;
470 size_t const _M_orig_size = _M_next_bufsiz;
473 _Chunk* _M_head =
nullptr;
void * align(size_t __align, size_t __size, void *&__ptr, size_t &__space) noexcept
Fit aligned storage in buffer.