12#include "detray/definitions/detail/qualifiers.hpp"
18namespace detray::detail {
27template <
typename value_t = std::u
int64_t>
30 bit_encoder() =
delete;
37 template <value_t... masks>
38 DETRAY_HOST_DEVICE
static constexpr bool is_invalid(value_t v)
noexcept {
40 return (((v & masks) == masks) || ...);
49 template <value_t mask>
50 requires(
mask !=
static_cast<value_t
>(0))
51 DETRAY_HOST_DEVICE
static constexpr value_t
get_bits(
52 const value_t v)
noexcept {
54 return (v &
mask) >> extract_shift(
mask);
61 template <value_t mask>
62 requires(
mask !=
static_cast<value_t
>(0))
63 DETRAY_HOST_DEVICE
static constexpr void set_bits(value_t& v,
64 const value_t
id)
noexcept {
71 assert(((
id == ~
static_cast<value_t
>(0)) ||
72 (
id ==
static_cast<value_t
>(~
static_cast<unsigned int>(0))) ||
74 "Not enough bits in mask to encode value");
82 static constexpr int extract_shift(value_t
mask)
noexcept {
83 return __builtin_ctzll(
mask);
static constexpr bool is_invalid(value_t v) noexcept
Check whether v sets every bit in any of the supplied invalid masks.
Definition bit_encoder.hpp:38
static constexpr void set_bits(value_t &v, const value_t id) noexcept
Set the masked bits to id in the encoded value.
Definition bit_encoder.hpp:63
static constexpr value_t get_bits(const value_t v) noexcept
Extract the field selected by mask from an encoded value.
Definition bit_encoder.hpp:51
Mask a region on a surface and link it to a volume.
Definition mask.hpp:46