dfir_rs/scheduled/handoff/
mod.rs1pub mod handoff_list;
4mod tee;
5mod vector;
6
7use std::any::Any;
8use std::cell::{RefCell, RefMut};
9use std::rc::Rc;
10
11pub use tee::TeeingHandoff;
12pub use vector::VecHandoff;
13
14pub trait TryCanReceive<T> {
16 fn try_give(&self, item: T) -> Result<T, T>;
19}
20
21pub trait CanReceive<T> {
23 fn give(&self, item: T) -> T;
26}
27
28pub trait HandoffMeta: Any {
30 fn is_empty(&self) -> bool {
32 0 == self.len()
33 }
34
35 fn len(&self) -> usize;
37}
38
39impl<H> HandoffMeta for Rc<RefCell<H>>
40where
41 H: HandoffMeta,
42{
43 fn len(&self) -> usize {
44 self.borrow().len()
45 }
46}
47
48pub trait Handoff: Default + HandoffMeta {
50 type Inner;
52
53 fn take_inner(&self) -> Self::Inner;
55
56 fn borrow_mut_swap(&self) -> RefMut<'_, Self::Inner>;
60
61 fn borrow_mut_give(&self) -> RefMut<'_, Self::Inner>;
63
64 fn give<T>(&self, item: T) -> T
66 where
67 Self: CanReceive<T>,
68 {
69 <Self as CanReceive<T>>::give(self, item)
70 }
71
72 fn try_give<T>(&self, item: T) -> Result<T, T>
74 where
75 Self: TryCanReceive<T>,
76 {
77 <Self as TryCanReceive<T>>::try_give(self, item)
78 }
79}
80
81#[repr(transparent)]
83#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
84pub struct Iter<I>(pub I)
85where
86 I: IntoIterator;
87impl<I> IntoIterator for Iter<I>
88where
89 I: IntoIterator,
90{
91 type Item = I::Item;
92 type IntoIter = I::IntoIter;
93
94 fn into_iter(self) -> Self::IntoIter {
95 self.0.into_iter()
96 }
97}