diff options
author | Zach Reizner <zachr@google.com> | 2018-02-27 22:22:35 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-03-07 16:54:46 -0800 |
commit | 25c6bc137ecfd1f608993a3d2f24c5736c5c186a (patch) | |
tree | 8fb7b1cfa49bddbadf4f059e7508c5a7ee5b730f /sys_util/src/poll.rs | |
parent | a5358e8ffd53d04750dc2c3376abc3fb5df92659 (diff) | |
download | crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.tar crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.tar.gz crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.tar.bz2 crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.tar.lz crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.tar.xz crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.tar.zst crosvm-25c6bc137ecfd1f608993a3d2f24c5736c5c186a.zip |
sys_util: custom derive for PollToken
Using an enum implementing PollToken is the recommended way to use PollContext, but writing the trait impls for each enum is mechanical yet error prone. This is a perfect candidate for a custom derive, which automates away the process using a simple derive attribute on an enum. BUG=chromium:816692 TEST=cargo test -p sys_util Change-Id: If21d0f94f9af4b4f6cef1f24c78fc36b50471053 Reviewed-on: https://chromium-review.googlesource.com/940865 Commit-Ready: Zach Reizner <zachr@chromium.org> Tested-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
Diffstat (limited to 'sys_util/src/poll.rs')
-rw-r--r-- | sys_util/src/poll.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/sys_util/src/poll.rs b/sys_util/src/poll.rs index 0a6da7b..762c5e4 100644 --- a/sys_util/src/poll.rs +++ b/sys_util/src/poll.rs @@ -150,6 +150,10 @@ impl Poller { } /// Trait for a token that can be associated with an `fd` in a `PollContext`. +/// +/// Simple enums that have no or primitive variant data data can use the `#[derive(PollToken)]` +/// custom derive to implement this trait. See +/// [poll_token_derive::poll_token](../poll_token_derive/fn.poll_token.html) for details. pub trait PollToken { /// Converts this token into a u64 that can be turned back into a token via `from_raw_token`. fn as_raw_token(&self) -> u64; @@ -670,4 +674,32 @@ mod tests { ctx.wait_timeout(dur).unwrap(); assert!(start_inst.elapsed() >= dur); } + + #[test] + #[allow(dead_code)] + fn poll_token_derive() { + #[derive(PollToken)] + enum EmptyToken {} + + #[derive(PartialEq, Debug, PollToken)] + enum Token { + Alpha, + Beta, + // comments + Gamma(u32), + Delta { index: usize }, + Omega, + } + + assert_eq!(Token::from_raw_token(Token::Alpha.as_raw_token()), + Token::Alpha); + assert_eq!(Token::from_raw_token(Token::Beta.as_raw_token()), + Token::Beta); + assert_eq!(Token::from_raw_token(Token::Gamma(55).as_raw_token()), + Token::Gamma(55)); + assert_eq!(Token::from_raw_token(Token::Delta { index: 100 }.as_raw_token()), + Token::Delta { index: 100 }); + assert_eq!(Token::from_raw_token(Token::Omega.as_raw_token()), + Token::Omega); + } } |