ndtree
nd-octree data-structure and algorithms
ndtree::v1::bit Namespace Reference

Bit manipulation utilities. More...

Functions

template<typename Int , CONCEPT_REQUIRES_(Integral< Int >{}) >
constexpr bool has_bit (uint_t b) noexcept
 Does the type Int have the bit b? note: used to assert if bit is within bounds.
 
template<typename Int , CONCEPT_REQUIRES_(Integral< Int >{}) >
constexpr bool get (Int x, uint_t b)
 Gets the value of the i-th bit of the integer x.
 
template<typename Int , CONCEPT_REQUIRES_(Integral< Int >{}) >
constexpr void set (Int &x, uint_t b, bool value)
 Sets the i-th bit of x to value.
 
template<typename Int , Int max = width<Int>, CONCEPT_REQUIRES_(Integral< Int >{}) >
constexpr auto to_int (Int x, Int from=0, Int to=max) -> Int
 Integer representation of the bit range [from, to) of x.
 
template<typename Int , Int max = width<Int>, CONCEPT_REQUIRES_(Integral< Int >{}) >
constexpr auto to_int_r (Int x, Int from=0, Int to=max) -> Int
 Reverse integer representation of the bit range [from, to) of x TODO: clean this up.
 
template<typename Int , CONCEPT_REQUIRES_(Integral< Int >{}) >
constexpr void swap (Int &x, uint_t b0, uint_t b1)
 Swaps the bits a and b in x.
 
template<typename Int , CONCEPT_REQUIRES_(Integral< Int >{}) >
auto bits () noexcept
 Range of bit positions for type. More...
 
constexpr uint64_t max_value (uint64_t no_bits)
 Maximum representable unsigned integer value in no_bits. More...
 
template<typename UInt , typename SInt , CONCEPT_REQUIRES_(UnsignedIntegral< UInt >{}and SignedIntegral< SInt >{}) and bit::width< UInt > = = bit::width<SInt>>
constexpr bool overflows_on_add (UInt value, SInt offset, UInt no_bits=width< UInt >)
 Does adding offset to the first no_bits of value overflows?
 
template<typename UInt , CONCEPT_REQUIRES_(UnsignedIntegral< UInt >{}) >
constexpr bool overflows_on_add (UInt value, UInt offset, UInt no_bits=width< UInt >)
 Does adding offset to the first no_bits of value overflows?
 
template<typename Integral >
constexpr Integral deposit_bits (Integral x, Integral mask)
 Parallel Bits Deposit.
 
template<typename Integral >
constexpr Integral extract_bits (Integral x, Integral mask)
 Parallel Bits Extract.
 

Variables

template<typename Int >
constexpr auto width = static_cast<Int>(CHAR_BIT * sizeof(Int{}))
 Bit width of type Int.
 

Detailed Description

Bit manipulation utilities.

Function Documentation

template<typename Int , CONCEPT_REQUIRES_(Integral< Int >{}) >
auto ndtree::v1::bit::bits ( )
noexcept

Range of bit positions for type.

Template Parameters
IntTODO: make this constexpr
constexpr uint64_t ndtree::v1::bit::max_value ( uint64_t  no_bits)

Maximum representable unsigned integer value in no_bits.

Formula: 2^{n} - 1

Since 2^{n} might not fit in the integer type it uses the following relation: 2^{n} - 1 = 2^{n - 1} * 2 - 1 = 2^{n - 1} + (2^{n - 1} - 1)

References ndtree::v1::math::ipow().

Referenced by overflows_on_add().