File tree Expand file tree Collapse file tree 2 files changed +46
-30
lines changed
Expand file tree Collapse file tree 2 files changed +46
-30
lines changed Original file line number Diff line number Diff line change @@ -26,16 +26,8 @@ pub fn expand_bitmap(input: BitmapInput) -> syn::Result<TokenStream2> {
2626 bit_index += ident. size ;
2727 let setter_name = Ident :: new ( & format ! ( "set_{}" , ident. name) , ident. name . span ( ) ) ;
2828 let name = ident. name . to_owned ( ) ;
29- let mask = match ident. size {
30- 1 => quote ! { 0b1 as #storage_ty } ,
31- 2 => quote ! { 0b11 as #storage_ty } ,
32- 3 => quote ! { 0b111 as #storage_ty } ,
33- 4 => quote ! { 0b1111 as #storage_ty } ,
34- 5 => quote ! { 0b11111 as #storage_ty } ,
35- 6 => quote ! { 0b111111 as #storage_ty } ,
36- 7 => quote ! { 0b1111111 as #storage_ty } ,
37- _ => unreachable ! ( ) ,
38- } ;
29+ let size = ident. size ;
30+ let mask = quote ! { ( ( 0b1 << #size) - 1 ) as #storage_ty } ;
3931 quote ! {
4032 pub fn #name( & self ) -> #storage_ty {
4133 ( self . 0 >> #index) & #mask
Original file line number Diff line number Diff line change @@ -5,45 +5,69 @@ use macros::bitmap;
55fn one_bit ( ) {
66 bitmap ! (
77 struct Bits {
8- field0 : u1,
8+ a : u1,
99 }
1010 ) ;
1111 let mut bits = Bits ( 0b0 ) ;
12- bits. set_field0 ( 0b1 ) ;
13- assert ! ( bits. field0 ( ) == 0b1 ) ;
12+ bits. set_a ( 0b1 ) ;
13+ assert_eq ! ( bits. a ( ) , 0b1 ) ;
1414}
1515
1616#[ test]
1717fn two_bits ( ) {
1818 bitmap ! (
1919 struct Bits {
20- field0 : u1,
21- field1 : u1,
20+ a : u1,
21+ b : u1,
2222 }
2323 ) ;
2424 let mut bits = Bits ( 0b10 ) ;
25- bits. set_field0 ( 0b1 ) ;
26- bits. set_field1 ( 0b0 ) ;
27- assert ! ( bits. 0 == 0b01 ) ;
25+ bits. set_a ( 0b1 ) ;
26+ bits. set_b ( 0b0 ) ;
27+ assert_eq ! ( bits. 0 , 0b01 ) ;
2828}
2929
3030#[ test]
3131fn sixty_four_bits ( ) {
3232 bitmap ! (
3333 struct Bits {
34- field0 : u1,
35- field1 : u7,
36- field2 : u7,
37- field3 : u7,
38- field4 : u7,
39- field5 : u7,
40- field6 : u7,
41- field7 : u7,
42- field8 : u7,
43- field9 : u7,
34+ a : u1,
35+ b : u7,
36+ c : u7,
37+ d : u7,
38+ e : u7,
39+ f : u7,
40+ g : u7,
41+ h : u7,
42+ i : u7,
43+ j : u7,
4444 }
4545 ) ;
4646 let mut bits = Bits ( 0xFF00FF00FF00FF00 ) ;
47- bits. set_field9 ( 0b0000000 ) ;
48- assert ! ( bits. 0 == 0x0100FF00FF00FF00 ) ;
47+ bits. set_j ( 0b0000000 ) ;
48+ assert_eq ! ( bits. 0 , 0x0100FF00FF00FF00 ) ;
4949}
50+
51+ macro_rules! test_width {
52+ ( $name: ident, $val: literal) => {
53+ #[ test]
54+ fn $name( ) {
55+ bitmap!(
56+ struct Bits {
57+ field: $name,
58+ }
59+ ) ;
60+ let mut bits = Bits ( 0 ) ;
61+ bits. set_field( $val) ;
62+ assert_eq!( bits. field( ) , $val) ;
63+ }
64+ } ;
65+ }
66+
67+ test_width ! ( u1, 1 ) ;
68+ test_width ! ( u2, 3 ) ;
69+ test_width ! ( u3, 7 ) ;
70+ test_width ! ( u4, 15 ) ;
71+ test_width ! ( u5, 31 ) ;
72+ test_width ! ( u6, 63 ) ;
73+ test_width ! ( u7, 127 ) ;
You can’t perform that action at this time.
0 commit comments