33 template<
typename T,
unsigned LSB,
unsigned MSB>
37 static_assert(MSB >= LSB,
"boundary mismatch in bit-field definition");
38 static_assert(MSB <
sizeof(T) * 8,
"MSB outside of bit-field type");
39 static_assert(LSB <
sizeof(T) * 8,
"LSB outside of bit-field type");
44 template<
unsigned BITS>
struct Best_type
46 template<
typename TY >
struct Cmp {
enum { value = (BITS <=
sizeof(TY)*8) }; };
47 typedef cxx::type_list<
54 typedef typename cxx::find_type<Unsigned_types, Cmp>::type Type;
89 static_assert(
sizeof(Bits_type)*8 >=
Bits,
"error finding the type to store the bits");
90 static_assert(
sizeof(Shift_type)*8 >=
Bits +
Lsb,
"error finding the type to keep the shifted bits");
91 static_assert(
sizeof(Bits_type) <=
sizeof(T),
"size mismatch for Bits_type");
92 static_assert(
sizeof(Shift_type) <=
sizeof(T),
"size mismatch for Shift_type");
93 static_assert(
sizeof(Bits_type) <=
sizeof(Shift_type),
"size mismacht for Shift_type and Bits_type");
100 static Bits_type
get(Shift_type
val)
111 {
return val &
Mask; }
123 return (dest & ~
Mask) | (val <<
Lsb);
146 static T
set(T dest, Bits_type
val)
180 template<
typename TT >
198 template<
typename TT >
203 operator Bits_type ()
const {
return this->
get(); }
204 Value &operator = (Bits_type
val) { this->
set(
val);
return *
this; }
208 template<
typename TT >
228 #define CXX_BITFIELD_MEMBER(LSB, MSB, name, data_member) \ 231 typedef cxx::Bitfield<decltype(data_member), LSB, MSB> name ## _bfm_t; \ 233 typename name ## _bfm_t::Val name() const { return data_member; } \ 235 typename name ## _bfm_t::Ref name() { return data_member; } \ 238 #define CXX_BITFIELD_MEMBER_RO(LSB, MSB, name, data_member) \ 241 typedef cxx::Bitfield<decltype(data_member), LSB, MSB> name ## _bfm_t; \ 243 typename name ## _bfm_t::Val name() const { return data_member; } \ 246 #define CXX_BITFIELD_MEMBER_UNSHIFTED(LSB, MSB, name, data_member) \ 249 typedef cxx::Bitfield<decltype(data_member), LSB, MSB> name ## _bfm_t; \ 251 typename name ## _bfm_t::Val_unshifted name() const { return data_member; } \ 253 typename name ## _bfm_t::Ref_unshifted name() { return data_member; } \ 256 #define CXX_BITFIELD_MEMBER_UNSHIFTED_RO(LSB, MSB, name, data_member) \ 259 typedef cxx::Bitfield<decltype(data_member), LSB, MSB> name ## _bfm_t; \ 261 typename name ## _bfm_t::Val_unshifted name() const { return data_member; } \
Mask value to get Bits bits.
static T set_unshifted(T dest, Shift_type val)
Set the bits corresponding to val.
static T val_dirty(Shift_type val)
Get the shifted bits for val.
static T set_dirty(T dest, Shift_type val)
Set the bits corresponding to val.
Value< T const > Val
Value type to access the bits inside a raw bit field.
static T val_unshifted(Shift_type val)
Get the shifted bits for val.
Best_type< Bits+Lsb >::Type Shift_type
Type to hold at least Bits + Lsb bits.
Value_unshifted< T & > Ref_unshifted
Reference type to access the bits inside a raw bit field (in place).
static T set_unshifted_dirty(T dest, Shift_type val)
Set the bits corresponding to val.
static T set(T dest, Bits_type val)
Set the bits corresponding to val.
Value< T & > Ref
Reference type to access the bits inside a raw bit field.
Mask value to the bits out of a T.
static Bits_type get(Shift_type val)
Get the bits out of val.
static T get_unshifted(Shift_type val)
Get the bits in place out of val.
Value_unshifted< T const > Val_unshifted
Value type to access the bits inside a raw bit field (in place).
static T val(Bits_type val)
Get the shifted bits for val.
Definition for a member (part) of a bit field.
Best_type< Bits >::Type Bits_type
Type to hold at least Bits bits.