Iros
 
Loading...
Searching...
No Matches
bit_field.h
Go to the documentation of this file.
1#pragma once
2
5
6namespace di::bit {
7template<size_t index, size_t bit_count>
8requires(bit_count <= 63)
9struct BitField {
10 using Value = math::SmallestUnsignedType<(1ULL << bit_count) - 1>;
11
12 template<size_t bit_size>
13 constexpr static void value_into_bits(BitSet<bit_size>& bit_set, Value value) {
14 for (size_t i = 0; i < bit_count; i++) {
15 bit_set[index + i] = !!(value & (1ULL << i));
16 }
17 }
18
19 template<size_t bit_size>
20 constexpr static auto bits_into_value(BitSet<bit_size> const& bit_set) -> Value {
21 auto result = Value { 0 };
22 for (size_t i = 0; i < bit_count; i++) {
23 result |= (bit_set[index + i] << i);
24 }
25 return result;
26 }
27
28 constexpr BitField(Value value) : m_value(value) {}
29 constexpr auto get() const -> Value { return m_value; }
30
31private:
32 Value m_value;
33};
34}
35
36namespace di {
37using bit::BitField;
38}
Definition bit_set.h:11
Definition bit_proxy_reference.h:5
decltype(detail::smallest_unsigned_type_helper(c_< size >)) SmallestUnsignedType
Definition smallest_unsigned_type.h:27
Definition zstring_parser.h:9
constexpr auto get() const -> Value
Definition bit_field.h:29
constexpr BitField(Value value)
Definition bit_field.h:28
static constexpr auto bits_into_value(BitSet< bit_size > const &bit_set) -> Value
Definition bit_field.h:20
math::SmallestUnsignedType<(1ULL<< bit_count) - 1 > Value
Definition bit_field.h:10
static constexpr void value_into_bits(BitSet< bit_size > &bit_set, Value value)
Definition bit_field.h:13