summary refs log tree commit diff
path: root/bit_field
Commit message (Collapse)AuthorAge
* bitfield: Support BitFieldSpecifier for enumsDavid Tolnay2019-03-17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously, the getter and setter functions generated for a bitfield struct by #[bitfield] all operated on primitive types like bool, u8, u16 etc. This CL adds support for getters and setters defined in terms of user-defined enums. We make an enum bitfield-compatible by adding #[bitfield]. The number of variants must be a power of 2. #[bitfield] enum TwoBits { Zero = 0b00, One = 0b01, Two = 0b10, Three = 0b11, } And then it may be used to specify a field in a bitfield struct. #[bitfield] struct Struct { prefix: BitField1, two_bits: TwoBits, suffix: BitField5, } The generated getters and setters for this struct would have the following signatures: impl Struct { fn get_prefix(&self) -> u8; fn set_prefix(&mut self, val: u8); fn get_two_bits(&self) -> TwoBits; fn set_two_bits(&mut self, val: TwoBits); fn get_suffix(&self) -> u8; fn set_suffix(&mut self, val: u8); } TEST=`cargo test` the bit_field and bit_field_derive crates TEST=`cargo check` crosvm Change-Id: Ibc8923e2877fda6ae8da5767731edcb68721a434 Reviewed-on: https://chromium-review.googlesource.com/1519686 Commit-Ready: David Tolnay <dtolnay@chromium.org> Tested-by: David Tolnay <dtolnay@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: David Tolnay <dtolnay@chromium.org>
* Run `cargo fmt`Miriam Zimmerman2019-02-16
| | | | | | | | | | | | BUG=None TEST=None Change-Id: I6db08c2ccfc616e4e34ad0219580c084dda34675 Reviewed-on: https://chromium-review.googlesource.com/1475058 Commit-Ready: Miriam Zimmerman <mutexlox@chromium.org> Tested-by: Miriam Zimmerman <mutexlox@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Dylan Reid <dgreid@chromium.org>
* bitfield: Documentation and simplificationsDavid Tolnay2019-01-03
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Changes in this CL: - Crate-level documentation for bit_field crate! - Use absolute paths within generated code so that the caller is no longer required to have various implementation details from the bit_field crate in scope. - Check that the total number of bits is a multiple of 8. Previously, it would generate compilable code that panicked when invoking accessors. - Provide B0 .. B64 as shorthand for BitField0 .. BitField64. - Use `bool` as the bool specifier rather than BitFieldBool. - Disallow BitFieldSpecifier impls outside the bit_field crate. - Simplify declaration of the BitFieldN types by replacing the recursive macro_rules with a simpler procedural macro. TEST=`cargo test` in bit_field and in bit_field_derive Change-Id: Ica9347bc89901de85f74366edd038fb5d8042ee6 Reviewed-on: https://chromium-review.googlesource.com/1382578 Commit-Ready: David Tolnay <dtolnay@chromium.org> Tested-by: David Tolnay <dtolnay@chromium.org> Reviewed-by: Jingkui Wang <jkwang@google.com>
* bitfield: update bitfield structs and support boolJingkui Wang2018-12-19
| | | | | | | | | | | | | | | BitFieldSpecifiers are now generated by macros. Can use BitFieldBool to specify a bool field. BUG=chromium:831850 TEST=local cargo build/test Change-Id: Id6b4a773ab612cea39ba811c3ec1da212b618ba2 Reviewed-on: https://chromium-review.googlesource.com/1356912 Commit-Ready: David Tolnay <dtolnay@chromium.org> Tested-by: David Tolnay <dtolnay@chromium.org> Reviewed-by: David Tolnay <dtolnay@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org>
* bitfield: reformat with cargo fmtDaniel Verkamp2018-12-12
| | | | | | | | | | | BUG=None TEST=cargo fmt --all -- --check Change-Id: Ieccf6d77af27d299a08d22d9b3ee4b44bd90c5b8 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1370625 Reviewed-by: David Tolnay <dtolnay@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org>
* macros: Clean up bitfield macro by replacing the input itemDavid Tolnay2018-12-09
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Before: #[derive(BitField)] #[passthrough(derive(Clone, Copy, PartialEq))] pub struct TrbSchema { parameter: B64, status: B32, cycle: B1, flags: B9, trb_type: B6, control: B16, } After: #[bitfield] #[derive(Clone, Copy, PartialEq)] pub struct Trb { parameter: B64, status: B32, cycle: B1, flags: B9, trb_type: B6, control: B16, } This change eliminates the need for the `passthrough` attribute, and avoids the separate `FooSchema` struct continuing to float around and disrupt IDE autocomplete. TEST=`cargo test` the bit_field_derive crate TEST=`cargo check` the devices crate against a migrated CL:1144264 Change-Id: I950ce896607468c73852aa181827f1a5dc0f0227 Reviewed-on: https://chromium-review.googlesource.com/1366539 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: David Tolnay <dtolnay@chromium.org> Reviewed-by: Jingkui Wang <jkwang@google.com>
* macros: Format code inside of quote! invocationsDavid Tolnay2018-11-21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Rustfmt currently does not touch the content of macro invocations. Also it used to have a bug where if it changed indentation of a block of code containing a multi-line macro invocation then the macro input would not get correspondingly indented. That bug was visible across some of the code here. For example: // rustfmt decides to un-indent the surrounding block: let data_size_in_bytes = quote!( ( #( #field_types::FIELD_WIDTH as usize )+* ) / 8 ); // poorly formatted resulting code: let data_size_in_bytes = quote!( ( #( #field_types::FIELD_WIDTH as usize )+* ) / 8 ); // should have been: let data_size_in_bytes = quote!( ( #( #field_types::FIELD_WIDTH as usize )+* ) / 8 ); TEST=cargo check crosvm TEST=cargo test each of the three proc-macro crates CQ-DEPEND=CL:1338507 Change-Id: Id2d456a8d85d719fbc0a65624f153f0f9df6f500 Reviewed-on: https://chromium-review.googlesource.com/1338508 Commit-Ready: David Tolnay <dtolnay@chromium.org> Tested-by: David Tolnay <dtolnay@chromium.org> Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
* macros: Update syn to 0.15David Tolnay2018-11-21
| | | | | | | | | | | | | | | | | | | | | | | | | This brings us onto the stable API surface area for procedural macros that stabilized in Rust 1.30, rather than the string-based shim on older compilers. https://blog.rust-lang.org/2018/10/25/Rust-1.30.0.html Intervening release notes: - https://github.com/dtolnay/syn/releases/tag/0.13.0 - https://github.com/dtolnay/syn/releases/tag/0.14.0 - https://github.com/dtolnay/syn/releases/tag/0.15.0 TEST=cargo check crosvm TEST=cargo test each of the three proc-macro crates TEST=build_packages CQ-DEPEND=CL:1340766 Change-Id: Idcf14df0225ab41423b9a8639d0bba0a63513712 Reviewed-on: https://chromium-review.googlesource.com/1338507 Commit-Ready: David Tolnay <dtolnay@chromium.org> Tested-by: David Tolnay <dtolnay@chromium.org> Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
* bitfield: Add fmt::DebugJingkui Wang2018-08-07
| | | | | | | | | | | | | implements fmt::Debug for bitfield BUG=chromium:831850 TEST=cargo test Change-Id: I58c2211a50726aaea0ea45164ae07c7b38eddea7 Reviewed-on: https://chromium-review.googlesource.com/1147111 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: Jingkui Wang <jkwang@google.com> Reviewed-by: Zach Reizner <zachr@chromium.org>
* crosvm: Add bit_field_deriveJingkui Wang2018-08-03
Support macro derive(BitField) to make life easier. BUG=None. TEST=local build and run test. Change-Id: I582620de250017fb7c0b601f9ad4fbcbbc2fe02a Reviewed-on: https://chromium-review.googlesource.com/1069331 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: Jingkui Wang <jkwang@google.com> Reviewed-by: Zach Reizner <zachr@chromium.org>