17#include <dispenso/detail/math.h>
31DISPENSO_DLL_ACCESS
char* allocSmallBufferImpl(
size_t ordinal);
32DISPENSO_DLL_ACCESS
void deallocSmallBufferImpl(
size_t ordinal,
void* buf);
34DISPENSO_DLL_ACCESS
size_t approxBytesAllocatedSmallBufferImpl(
size_t ordinal);
42constexpr size_t getOrdinal(
size_t blockSize) {
43 return std::max<ssize_t>(0,
log2const(blockSize) - 2);
46template <
size_t kBlockSize>
47inline std::enable_if_t<(kBlockSize <= kMaxSmallBufferSize), char*> allocSmallOrLarge() {
48#if defined(DISPENSO_NO_SMALL_BUFFER_ALLOCATOR)
49 return reinterpret_cast<char*
>(alignedMalloc(kBlockSize, kBlockSize));
51 return allocSmallBufferImpl(getOrdinal(kBlockSize));
55template <
size_t kBlockSize>
57 return reinterpret_cast<char*
>(alignedMalloc(kBlockSize, kBlockSize));
60template <
size_t kBlockSize>
61inline std::enable_if_t<(kBlockSize <= kMaxSmallBufferSize), void> deallocSmallOrLarge(
void* buf) {
62#if defined(DISPENSO_NO_SMALL_BUFFER_ALLOCATOR)
65 deallocSmallBufferImpl(getOrdinal(kBlockSize), buf);
69template <
size_t kBlockSize>
70inline std::enable_if_t<(kBlockSize >
kMaxSmallBufferSize),
void> deallocSmallOrLarge(
void* buf) {
87template <
size_t kBlockSize>
89 return detail::allocSmallOrLarge<kBlockSize>();
100template <
size_t kBlockSize>
102 detail::deallocSmallOrLarge<kBlockSize>(buf);
112template <
size_t kBlockSize>
114 return detail::approxBytesAllocatedSmallBufferImpl(detail::getOrdinal(kBlockSize));
void deallocSmallBuffer(void *buf)
constexpr size_t kMaxSmallBufferSize
char * allocSmallBuffer()
size_t approxBytesAllocatedSmallBuffer()
constexpr uint32_t log2const(uint64_t v)
Compute log base 2 of a value (compile-time).