Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
core: Relax lifetime constraint on
msgs
in I2CTransfer::transfer()
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.
- Loading branch information