s2_common/record/
metering.rs

1pub trait MeteredSize {
2    /// Return the metered size of a record or batch of records.
3    fn metered_size(&self) -> usize;
4}
5
6impl<T> MeteredSize for &T
7where
8    T: MeteredSize,
9{
10    fn metered_size(&self) -> usize {
11        (**self).metered_size()
12    }
13}
14
15impl<T: MeteredSize> MeteredSize for &[T] {
16    fn metered_size(&self) -> usize {
17        self.iter().fold(0, |acc, item| acc + item.metered_size())
18    }
19}
20
21impl<T: MeteredSize> MeteredSize for Vec<T> {
22    fn metered_size(&self) -> usize {
23        self.as_slice().metered_size()
24    }
25}
26
27pub struct Metered<T> {
28    pub(super) size: usize,
29    pub(super) inner: T,
30}
31
32impl<T> Metered<T> {
33    pub fn into_inner(self) -> T {
34        self.inner
35    }
36
37    pub const fn as_ref(&self) -> Metered<&T> {
38        Metered {
39            size: self.size,
40            inner: &self.inner,
41        }
42    }
43}
44
45impl<T> std::fmt::Debug for Metered<T>
46where
47    T: std::fmt::Debug,
48{
49    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
50        f.debug_struct("Metered")
51            .field("size", &self.size)
52            .field("inner", &self.inner)
53            .finish()
54    }
55}
56
57impl<T> PartialEq for Metered<T>
58where
59    T: PartialEq,
60{
61    fn eq(&self, other: &Metered<T>) -> bool {
62        self.size == other.size && self.inner == other.inner
63    }
64}
65
66impl<T> Eq for Metered<T> where T: Eq {}
67
68impl<T> std::ops::Deref for Metered<T> {
69    type Target = T;
70
71    fn deref(&self) -> &Self::Target {
72        &self.inner
73    }
74}
75
76impl<T> From<T> for Metered<T>
77where
78    T: MeteredSize,
79{
80    fn from(inner: T) -> Self {
81        Self {
82            size: inner.metered_size(),
83            inner,
84        }
85    }
86}
87
88impl<T> Default for Metered<T>
89where
90    T: Default + MeteredSize,
91{
92    fn default() -> Self {
93        T::default().into()
94    }
95}
96
97impl<T> Clone for Metered<T>
98where
99    T: Clone,
100{
101    fn clone(&self) -> Self {
102        Self {
103            size: self.size,
104            inner: self.inner.clone(),
105        }
106    }
107}
108
109impl<T> MeteredSize for Metered<T> {
110    fn metered_size(&self) -> usize {
111        self.size
112    }
113}
114
115impl<T> Metered<Vec<T>>
116where
117    T: MeteredSize,
118{
119    pub fn with_capacity(capacity: usize) -> Self {
120        Self {
121            size: 0,
122            inner: Vec::with_capacity(capacity),
123        }
124    }
125
126    pub fn reserve(&mut self, additional: usize) {
127        self.inner.reserve(additional);
128    }
129
130    pub fn push(&mut self, item: Metered<T>) {
131        self.inner.push(item.inner);
132        self.size += item.size;
133    }
134
135    pub fn append(&mut self, other: Self) {
136        self.inner.extend(other.inner);
137        self.size += other.size;
138    }
139}
140
141impl<T> FromIterator<Metered<T>> for Metered<Vec<T>>
142where
143    T: MeteredSize,
144{
145    fn from_iter<I: IntoIterator<Item = Metered<T>>>(iterable: I) -> Self {
146        let it = iterable.into_iter();
147        let (cap_lower, cap_upper) = it.size_hint();
148        let mut buf = Self::with_capacity(cap_upper.unwrap_or(cap_lower));
149        for item in it {
150            buf.push(item);
151        }
152        buf
153    }
154}
155
156impl<T> IntoIterator for Metered<Vec<T>> {
157    type Item = T;
158    type IntoIter = std::vec::IntoIter<Self::Item>;
159
160    fn into_iter(self) -> Self::IntoIter {
161        self.inner.into_iter()
162    }
163}