23 static_assert(align_traits<T>::ptr_alignment % (1 << N) == 0,
"Pointer alignment error");
25 static constexpr auto Bits = N;
27 static constexpr std::uintptr_t BIT_MASK = (1 << N) - 1;
28 static constexpr std::uintptr_t PTR_MASK = ~BIT_MASK;
32 aligned_ptr(std::uintptr_t value): value(value) {}
34 explicit aligned_ptr(T* ptr =
nullptr): value(
reinterpret_cast<std::uintptr_t
>(ptr)) {}
36 template <
typename... Args>
37 explicit aligned_ptr(T* ptr, Args... args): value(
reinterpret_cast<std::uintptr_t
>(ptr)) {
38 static_assert(
sizeof...(Args) == N,
"Arguments mismatch");
39 const bool bits[] = {
static_cast<bool>(args)... };
40 for (
unsigned int n = 0; n < N; ++n) {
47 T* get_ptr()
const {
return reinterpret_cast<T*
>(value & PTR_MASK); }
48 [[nodiscard]]
bool get_bit(
unsigned int n)
const {
return value & (1 << n); }
50 void set_ptr(T* ptr) { value =
reinterpret_cast<std::uintptr_t
>(ptr) | (value & BIT_MASK); }
51 void set_bit(
unsigned int n,
bool bit) {
52 const std::uintptr_t mask = 1 << n;
60 void set_bit(
unsigned int n) {
61 const std::uintptr_t mask = 1 << n;
64 void clear_bit(
unsigned int n) {
65 const std::uintptr_t mask = 1 << n;