24 #ifndef PXR_BASE_TF_POINTER_AND_BITS_H
25 #define PXR_BASE_TF_POINTER_AND_BITS_H
31 #include <type_traits>
38 return val && !(val & (val - 1));
58 template <
typename U,
bool = false>
63 struct _AlignOf<U, true> {
70 static constexpr
uintptr_t _GetAlign() noexcept {
74 static constexpr
bool _SupportsAtLeastOneBit() noexcept {
75 return _GetAlign() > 1 &&
Tf_IsPow2(_GetAlign());
82 static_assert(_SupportsAtLeastOneBit(),
83 "T's alignment does not support any bits");
88 : _ptrAndBits(_Combine(p, bits))
90 static_assert(_SupportsAtLeastOneBit(),
91 "T's alignment does not support any bits");
95 return _GetAlign() - 1;
119 template <
class Integral>
120 constexpr Integral
BitsAs() const noexcept {
125 return static_cast<Integral
>(_GetBits());
130 template <
class Integral>
132 _SetBits(static_cast<uintptr_t>(
val));
141 template <
class Integral>
143 _ptrAndBits = _Combine(
ptr,
val);
147 constexpr
T *
Get() const noexcept {
157 return _AsInt(_ptrAndBits);
166 constexpr
uintptr_t _GetBitMask() const noexcept {
171 constexpr
T *_Combine(
T *p,
uintptr_t bits)
const noexcept {
172 return _AsPtr(_AsInt(p) | (bits & _GetBitMask()));
177 constexpr
uintptr_t _AsInt(
T *p)
const noexcept {
183 constexpr
T *_AsPtr(
uintptr_t i)
const noexcept {
188 constexpr
T *_GetPtr() const noexcept {
189 return _AsPtr(_AsInt(_ptrAndBits) & ~_GetBitMask());
193 void _SetPtr(
T *p) noexcept {
194 _ptrAndBits = _Combine(p, _GetBits());
198 constexpr
uintptr_t _GetBits() const noexcept {
199 return _AsInt(_ptrAndBits) & _GetBitMask();
204 _ptrAndBits = _Combine(_GetPtr(), bits);
213 #endif // PXR_BASE_TF_POINTER_AND_BITS_H
#define ARCH_PRAGMA_FORCING_TO_BOOL
TfPointerAndBits & operator=(T *ptr) noexcept
Assignment. Leaves bits unmodified.
PXR_NAMESPACE_OPEN_SCOPE constexpr bool Tf_IsPow2(uintptr_t val)
void SetBits(Integral val) noexcept
Set the stored bits. No static range checking is performed.
GLsizei const GLfloat * value
void Set(T *ptr, Integral val) noexcept
Set the pointer value to ptr and the bits to val.
void swap(T &lhs, T &rhs)
fallback_uintptr uintptr_t
constexpr T * Get() const noexcept
Retrieve the pointer.
constexpr TfPointerAndBits() noexcept
constexpr T & operator*() const noexcept
Dereference.
constexpr uintptr_t GetLiteral() const noexcept
constexpr uintptr_t GetMaxValue() const
constexpr Integral BitsAs() const noexcept
Retrieve the stored bits as the integral type Integral.
void Set(T *ptr) noexcept
Set the pointer value to ptr.
void Swap(TfPointerAndBits &other) noexcept
Swap this PointerAndBits with other.
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
#define ARCH_PRAGMA_MAYBE_UNINITIALIZED
constexpr uintptr_t GetNumBitsValues() const
#define PXR_NAMESPACE_CLOSE_SCOPE
constexpr TfPointerAndBits(T *p, uintptr_t bits=0) noexcept
Constructor. Set the pointer to p, and the bits to bits.
constexpr T * operator->() const noexcept
Indirection.