23 template<
typename T >
24 constexpr T
mask(
unsigned bits_to_extract )
26 return bits_to_extract <= 1u ? T{1} :
27 static_cast<T
>((mask<T>(bits_to_extract-1) << 1) | T{1});
30 template<
typename T >
34 struct bits_count<std::uint8_t> {
static constexpr
unsigned count = 8u; };
37 struct bits_count<std::int8_t> {
static constexpr
unsigned count = 8u; };
40 struct bits_count<char> {
static constexpr
unsigned count = 8u; };
43 struct bits_count<std::uint16_t> {
static constexpr
unsigned count = 16u; };
46 struct bits_count<std::int16_t> {
static constexpr
unsigned count = 16u; };
49 struct bits_count<std::uint32_t> {
static constexpr
unsigned count = 32u; };
52 struct bits_count<std::int32_t> {
static constexpr
unsigned count = 32u; };
55 struct bits_count<std::uint64_t> {
static constexpr
unsigned count = 64u; };
58 struct bits_count<std::int64_t> {
static constexpr
unsigned count = 64u; };
84 typename F =
unsigned int >
88 return static_cast<T
>(value >> Shift) & details::mask<T>(Bits_To_Extract);