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