Skip to content

Commit f6ba9de

Browse files
Add SplitBorrow trait to split borrow tuple_list elements (#1624)
* Add SplitBorrow trait to split borrow tuple_list elements * clippy
1 parent 4c17da0 commit f6ba9de

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

libafl_bolts/src/tuples.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,45 @@ where
209209
}
210210
}
211211

212+
/// Borrow each member of the tuple
213+
pub trait SplitBorrow<'a> {
214+
/// The Resulting [`TupleList`], of an [`SplitBorrow::split_borrow()`] call
215+
type SplitBorrowResult;
216+
/// The Resulting [`TupleList`], of an [`SplitBorrow::split_borrow_mut()`] call
217+
type SplitBorrowMutResult;
218+
219+
/// Return a tuple of borrowed references
220+
fn split_borrow(&'a self) -> Self::SplitBorrowResult;
221+
/// Return a tuple of borrowed mutable references
222+
fn split_borrow_mut(&'a mut self) -> Self::SplitBorrowMutResult;
223+
}
224+
225+
impl<'a> SplitBorrow<'a> for () {
226+
type SplitBorrowResult = ();
227+
type SplitBorrowMutResult = ();
228+
229+
fn split_borrow(&'a self) -> Self::SplitBorrowResult {}
230+
231+
fn split_borrow_mut(&'a mut self) -> Self::SplitBorrowMutResult {}
232+
}
233+
234+
impl<'a, Head, Tail> SplitBorrow<'a> for (Head, Tail)
235+
where
236+
Head: 'a,
237+
Tail: SplitBorrow<'a>,
238+
{
239+
type SplitBorrowResult = (&'a Head, Tail::SplitBorrowResult);
240+
type SplitBorrowMutResult = (&'a mut Head, Tail::SplitBorrowMutResult);
241+
242+
fn split_borrow(&'a self) -> Self::SplitBorrowResult {
243+
(&self.0, self.1.split_borrow())
244+
}
245+
246+
fn split_borrow_mut(&'a mut self) -> Self::SplitBorrowMutResult {
247+
(&mut self.0, self.1.split_borrow_mut())
248+
}
249+
}
250+
212251
/// A named tuple
213252
pub trait NamedTuple: HasConstLen {
214253
/// Gets the name of this tuple

0 commit comments

Comments
 (0)