@@ -34,7 +34,7 @@ namespace udb {
3434 if constexpr (size == bits_len) {
3535 return value;
3636 } else {
37- constexpr Bits<bits_len> mask = (static_cast <Bits<bits_len>>(1 ).template const_sll <size>()) - 1 ;
37+ constexpr Bits<bits_len> mask = (static_cast <Bits<bits_len>>(1 ).template sll <size>()) - 1 ;
3838 return (value >> start) & mask;
3939 }
4040 }
@@ -48,12 +48,13 @@ namespace udb {
4848 if constexpr (size == BitfieldMemberSize) {
4949 return value;
5050 } else {
51- constexpr Bits<BitfieldMemberSize> mask = (static_cast <Bits<BitfieldMemberSize>>(1 ).template const_sll <size>()) - 1 ;
51+ constexpr Bits<BitfieldMemberSize> mask = (static_cast <Bits<BitfieldMemberSize>>(1 ).template sll <size>()) - 1 ;
5252 return (value >> start) & mask;
5353 }
5454 }
5555 // extract bits, where the extraction is not known at compile time
5656 template <typename T>
57+ requires (std::integral<T>)
5758 T extract (T value, unsigned start, unsigned size)
5859 {
5960 udb_assert ((start + size) <= sizeof (T)*8 , " extraction out of bound" );
@@ -66,6 +67,24 @@ namespace udb {
6667 }
6768 }
6869
70+ template <unsigned P, unsigned N, unsigned M, typename StartType, typename SizeType>
71+ Bits<BitfieldMember<P, N, M>::Width> extract (const BitfieldMember<P, N, M>& value, const StartType& start, const SizeType& size)
72+ {
73+ udb_assert ((start + size) <= (BitfieldMember<P, N, M>::Width), " extraction out of bound" );
74+
75+ if (size == BitfieldMember<P, N, M>::Width) {
76+ return static_cast <const Bits<BitfieldMember<P, N, M>::Width>>(value);
77+ } else {
78+ if constexpr (BitfieldMember<P, N, M>::Width < 64 ) {
79+ uint64_t mask = (1ull << size) - 1 ;
80+ return (value >> start) & mask;
81+ } else {
82+ Bits<BitfieldMember<P, N, M>::Width> mask = (static_cast <Bits<BitfieldMember<P, N, M>::Width>>(1 ) << size) - 1 ;
83+ return (value >> start) & mask;
84+ }
85+ }
86+ }
87+
6988 template <unsigned MSB, unsigned LSB, unsigned T>
7089 constexpr Bits<T> bit_insert (const Bits<T>& target, const Bits<MSB - LSB + 1 >& value)
7190 {
0 commit comments