6 namespace bnb::player_api
10 void validate_not_null(
const T& ptr)
13 throw std::runtime_error(
"Pointer cannot be `nullptr`.");
17 template<std::
size_t value>
18 constexpr
bool is_pow_of_two()
20 return (value != 0) && !(value & (value - 1));
23 template<std::
size_t align,
class T>
26 static_assert(is_pow_of_two<align>(),
"Alignment must be a power of two.");
27 constexpr
auto align_bits = align - 1;
28 return (x + align_bits) & ~align_bits;
34 return align_by<8>(x);
40 return align_by<16>(x);
46 return align_by<32>(x);
52 return align_by<64>(x);
55 template<std::
size_t mem_align>
56 inline uint8_t* aligned_alloc(std::size_t size)
62 static_assert(is_pow_of_two<mem_align>() && mem_align >= 8,
"Alignment must be a power of two and more than 8.");
63 auto full_size = size + mem_align + 8;
64 auto* real_ptr = std::malloc(full_size);
65 constexpr
auto align_bits = mem_align - 1;
66 auto* aligned_ptr =
reinterpret_cast<uint8_t*
>(((
reinterpret_cast<std::size_t
>(real_ptr) + 8) + align_bits) & ~align_bits);
67 auto* shift_to_real_ptr =
reinterpret_cast<std::size_t*
>(aligned_ptr - 8);
68 *shift_to_real_ptr =
static_cast<std::size_t
>(aligned_ptr -
reinterpret_cast<uint8_t*
>(real_ptr));
72 inline void aligned_dealloc(uint8_t* p)
74 auto shift = *
reinterpret_cast<std::size_t*
>(p - 8);
75 auto* real_ptr = p - shift;