dfir_rs/scheduled/handoff/
tee.rs1use std::cell::RefCell;
4use std::collections::VecDeque;
5use std::rc::Rc;
6
7use super::{CanReceive, Handoff, HandoffMeta};
8
9struct ReaderHandoff<T> {
10 contents: VecDeque<Vec<T>>,
11}
12
13impl<T> Default for ReaderHandoff<T> {
14 fn default() -> Self {
15 Self {
16 contents: Default::default(),
17 }
18 }
19}
20
21struct TeeingHandoffInternal<T> {
22 readers: Vec<(bool, ReaderHandoff<T>)>,
24}
25
26#[derive(Clone)]
29pub struct TeeingHandoff<T>
30where
31 T: 'static,
32{
33 read_from: usize,
34 internal: Rc<RefCell<TeeingHandoffInternal<T>>>,
35}
36
37impl<T> Default for TeeingHandoff<T> {
38 fn default() -> Self {
39 TeeingHandoff {
40 read_from: 0,
41 internal: Rc::new(RefCell::new(TeeingHandoffInternal {
42 readers: vec![(true, ReaderHandoff::<T>::default())],
43 })),
44 }
45 }
46}
47
48impl<T> TeeingHandoff<T>
49where
50 T: Clone,
51{
52 #[must_use]
54 pub(crate) fn tee(&self) -> Self {
55 let id = (*self.internal).borrow().readers.len();
56 (*self.internal)
57 .borrow_mut()
58 .readers
59 .push((true, ReaderHandoff::default()));
60 Self {
61 read_from: id,
62 internal: self.internal.clone(),
63 }
64 }
65
66 pub(crate) fn drop(&self) {
68 self.internal.borrow_mut().readers[self.read_from].0 = false;
69 }
70}
71
72impl<T> HandoffMeta for TeeingHandoff<T> {
73 fn is_empty(&self) -> bool {
74 self.internal.borrow().readers[self.read_from]
75 .1
76 .contents
77 .iter()
78 .all(Vec::is_empty)
79 }
80
81 fn len(&self) -> usize {
82 self.internal.borrow().readers[self.read_from]
83 .1
84 .contents
85 .iter()
86 .map(Vec::len)
87 .sum()
88 }
89}
90
91impl<T> Handoff for TeeingHandoff<T> {
92 type Inner = VecDeque<Vec<T>>;
93
94 fn take_inner(&self) -> Self::Inner {
95 std::mem::take(
96 &mut (*self.internal).borrow_mut().readers[self.read_from]
97 .1
98 .contents,
99 )
100 }
101
102 fn borrow_mut_swap(&self) -> std::cell::RefMut<'_, Self::Inner> {
103 todo!()
104 }
105}
106
107impl<T> CanReceive<Vec<T>> for TeeingHandoff<T>
108where
109 T: Clone,
110{
111 fn give(&self, vec: Vec<T>) -> Vec<T> {
112 let readers = &mut (*self.internal).borrow_mut().readers;
113 if let Some((last, rest)) = readers.split_last_mut() {
114 for reader in rest {
115 if reader.0 {
116 reader.1.contents.push_back(vec.clone());
117 }
118 }
119 if last.0 {
120 last.1.contents.push_back(vec);
121 }
122 }
123 Vec::new()
124 }
125}