-
Notifications
You must be signed in to change notification settings - Fork 55
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
core: Relax lifetime constraint on msgs
in I2CTransfer::transfer()
#89
base: master
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good point. Sounds good to me, thank you!
Could you add an entry to the changelog?
This change enables users of `i2cdev` to create generic functions on `T: I2CTransfer` that have output buffers constructed separately from the `I2CMessage` array, like the following: ```rust fn smbus_read_post_box<T>(i2c: &mut T, offset: u16, out: &mut [u8]) where for<'a> T: I2CTransfer<'a>, { let addr = offset.to_be_bytes(); let mut messages = [ T::Message::write(addr), T::Message::read(out), ]; i2c.transfer(&mut messages).expect("uh oh"); } ``` Before this, `messages` would not satisfy the constraints of `.transfer()`, because `messages` does not live as long as one of the output buffers `out`: ``` error[E0597]: `messages` does not live long enough --> src/smbpbisensor.rs:69:19 | 63 | let mut messages = [ | ------------ binding `messages` declared here ... 69 | .transfer(&mut messages) | ^^^^^^^^^^^^^ borrowed value does not live long enough ... 78 | } | - | | | `messages` dropped here while still borrowed | borrow might be used here, when `messages` is dropped and runs the destructor for type `[<T as I2CTransfer<'_>>::Message; 2]` ``` The error message is a little confusing, but basically `&'a mut [Self::Message]` is forcing the array of `I2CMessage`s to match the lifetime of the buffers in the messages, which is not strictly necessary: the array of messages can have a different lifetime than the buffers. After this change, the above example compiles successfully.
7b7cac7
to
a38d4e2
Compare
Yes absolutely! Sorry, got caught up with other stuff today. Revised it just now. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you.
Could you move your changelog entry to the unreleased section?
Oh argh, I misread the changelog section headers yeah I’ll do that |
This change enables users of
i2cdev
to create generic functions onT: I2CTransfer
that have output buffers constructed separately from theI2CMessage
array, like the following:Before this,
messages
would not satisfy the constraints of.transfer()
, becausemessages
does not live as long as one of the output buffersout
:The error message is a little confusing, but basically
&'a mut [Self::Message]
is forcing the array ofI2CMessage
s to match the lifetime of the buffers in the messages, which is not strictly necessary: the array of messages can have a different lifetime than the buffers. After this change, the above example compiles successfully.