mz_timely_util/containers/
stack.rs1use std::cell::Cell;
20
21use differential_dataflow::containers::{Columnation, TimelyStack};
22use timely::container::{ContainerBuilder, PushInto};
23
24#[derive(Default)]
26pub struct AccountedStackBuilder<CB> {
27 pub bytes: Cell<usize>,
28 pub builder: CB,
29}
30
31impl<T, CB> ContainerBuilder for AccountedStackBuilder<CB>
32where
33 T: Clone + Columnation + 'static,
34 CB: ContainerBuilder<Container = TimelyStack<T>>,
35{
36 type Container = TimelyStack<T>;
37
38 fn extract(&mut self) -> Option<&mut Self::Container> {
39 let container = self.builder.extract()?;
40 let mut new_bytes = 0;
41 container.heap_size(|_, cap| new_bytes += cap);
42 self.bytes.set(self.bytes.get() + new_bytes);
43 Some(container)
44 }
45
46 fn finish(&mut self) -> Option<&mut Self::Container> {
47 let container = self.builder.finish()?;
48 let mut new_bytes = 0;
49 container.heap_size(|_, cap| new_bytes += cap);
50 self.bytes.set(self.bytes.get() + new_bytes);
51 Some(container)
52 }
53}
54
55impl<T, CB: PushInto<T>> PushInto<T> for AccountedStackBuilder<CB> {
56 #[inline]
57 fn push_into(&mut self, item: T) {
58 self.builder.push_into(item);
59 }
60}