1#ifndef ALIGNEDBUFFER_HH
2#define ALIGNEDBUFFER_HH
32 [[nodiscard]]
auto* p() {
return reinterpret_cast< uint8_t*
>(
this); }
33 [[nodiscard]]
auto* p()
const {
return reinterpret_cast<const uint8_t*
>(
this); }
36 static constexpr auto ALIGNMENT =
alignof(std::max_align_t);
38 [[nodiscard]]
operator uint8_t*() {
return p(); }
39 [[nodiscard]]
operator const uint8_t*()
const {
return p(); }
40 [[nodiscard]]
auto*
data() {
return p(); }
41 [[nodiscard]]
const auto*
data()
const {
return p(); }
43 template<std::
integral I>
44 [[nodiscard]]
auto*
operator+(I i) {
return p() + i; }
45 template<std::
integral I>
46 [[nodiscard]]
const auto*
operator+(I i)
const {
return p() + i; }
48 template<std::
integral I>
49 [[nodiscard]]
auto&
operator[](I i) {
return *(p() + i); }
50 template<std::
integral I>
51 [[nodiscard]]
const auto&
operator[](I i)
const {
return *(p() + i); }
61 [[nodiscard]]
auto size()
const {
return dat.size(); }
62 [[nodiscard]]
auto*
data() {
return dat.data(); }
63 [[nodiscard]]
auto*
data()
const {
return dat.data(); }
64 [[nodiscard]]
auto begin() {
return dat.begin(); }
65 [[nodiscard]]
auto begin()
const {
return dat.begin(); }
66 [[nodiscard]]
auto end() {
return dat.end(); }
67 [[nodiscard]]
auto end()
const {
return dat.end(); }
70 std::array<uint8_t, N> dat;
75static_assert(
sizeof(AlignedByteArray<32>) == 32,
76 "we rely on the empty-base optimization");
83template<
typename T> [[nodiscard]]
static inline T aligned_cast(
void* p)
85 static_assert(std::is_pointer_v<T>,
86 "can only perform aligned_cast on pointers");
87 assert((
reinterpret_cast<uintptr_t
>(p) %
88 alignof(std::remove_pointer_t<T>)) == 0);
89 return reinterpret_cast<T
>(p);
const auto & operator[](I i) const
static constexpr auto ALIGNMENT
const auto * operator+(I i) const
const auto * data() const
This file implemented 3 utility functions: