1 #ifndef ALIGNEDBUFFER_HH
2 #define ALIGNEDBUFFER_HH
30 [[nodiscard]]
auto* p() {
return reinterpret_cast< uint8_t*
>(
this); }
31 [[nodiscard]]
auto* p()
const {
return reinterpret_cast<const uint8_t*
>(
this); }
34 static constexpr
auto ALIGNMENT =
alignof(std::max_align_t);
36 [[nodiscard]]
operator uint8_t*() {
return p(); }
37 [[nodiscard]]
operator const uint8_t*()
const {
return p(); }
39 [[nodiscard]]
auto*
operator+(ptrdiff_t i) {
return p() + i; }
40 [[nodiscard]]
auto*
operator+(ptrdiff_t i)
const {
return p() + i; }
42 [[nodiscard]]
auto&
operator[](
int i) {
return *(p() + i); }
43 [[nodiscard]]
auto&
operator[](
int i)
const {
return *(p() + i); }
44 [[nodiscard]]
auto&
operator[](
unsigned int i) {
return *(p() + i); }
45 [[nodiscard]]
auto&
operator[](
unsigned int i)
const {
return *(p() + i); }
46 [[nodiscard]]
auto&
operator[](
long i) {
return *(p() + i); }
47 [[nodiscard]]
auto&
operator[](
long i)
const {
return *(p() + i); }
48 [[nodiscard]]
auto&
operator[](
unsigned long i) {
return *(p() + i); }
49 [[nodiscard]]
auto&
operator[](
unsigned long i)
const {
return *(p() + i); }
59 [[nodiscard]]
size_t size()
const {
return N; }
60 [[nodiscard]]
auto*
data() {
return dat; }
61 [[nodiscard]]
auto*
data()
const {
return dat; }
69 static_assert(
sizeof(AlignedByteArray<32>) == 32,
70 "we rely on the empty-base optimization");
77 template<
typename T> [[nodiscard]]
static inline T aligned_cast(
void* p)
79 static_assert(std::is_pointer_v<T>,
80 "can only perform aligned_cast on pointers");
81 assert((
reinterpret_cast<uintptr_t
>(p) %
82 alignof(std::remove_pointer_t<T>)) == 0);
83 return reinterpret_cast<T
>(p);