1use std::mem::MaybeUninit;
2
3use bytes::{buf::UninitSlice, Buf, BufMut};
4
5#[derive(Default)]
7pub struct Sizer {
8 pub size: usize,
9}
10
11unsafe impl BufMut for Sizer {
12 unsafe fn advance_mut(&mut self, cnt: usize) {
13 self.size += cnt;
14 }
15
16 fn chunk_mut(&mut self) -> &mut UninitSlice {
17 thread_local! {
20 static BUFFER: std::cell::UnsafeCell<[MaybeUninit<u8>; 8192]> =
21 const { std::cell::UnsafeCell::new([MaybeUninit::uninit(); 8192]) };
22 }
23
24 BUFFER.with(|buf| {
25 let ptr = buf.get();
26 unsafe {
27 let slice = (*ptr).as_mut_ptr();
28 bytes::buf::UninitSlice::from_raw_parts_mut(slice as *mut u8, 8192)
29 }
30 })
31 }
32
33 fn remaining_mut(&self) -> usize {
34 usize::MAX
35 }
36
37 fn has_remaining_mut(&self) -> bool {
38 true
39 }
40
41 fn put<T: Buf>(&mut self, mut src: T) {
42 self.size += src.remaining();
43 src.advance(src.remaining());
44 }
45
46 fn put_bytes(&mut self, _val: u8, cnt: usize) {
47 self.size += cnt;
48 }
49
50 fn put_f32(&mut self, _val: f32) {
51 self.size += 4;
52 }
53
54 fn put_f32_le(&mut self, _: f32) {
55 self.size += 4
56 }
57
58 fn put_f32_ne(&mut self, _: f32) {
59 self.size += 4
60 }
61
62 fn put_f64(&mut self, _: f64) {
63 self.size += 8
64 }
65
66 fn put_f64_le(&mut self, _: f64) {
67 self.size += 8
68 }
69
70 fn put_f64_ne(&mut self, _: f64) {
71 self.size += 8
72 }
73
74 fn put_i128(&mut self, _: i128) {
75 self.size += 16
76 }
77
78 fn put_i128_le(&mut self, _: i128) {
79 self.size += 16
80 }
81
82 fn put_i128_ne(&mut self, _: i128) {
83 self.size += 16
84 }
85
86 fn put_i16(&mut self, _: i16) {
87 self.size += 2
88 }
89
90 fn put_i16_le(&mut self, _: i16) {
91 self.size += 2
92 }
93
94 fn put_i16_ne(&mut self, _: i16) {
95 self.size += 2
96 }
97
98 fn put_i32(&mut self, _: i32) {
99 self.size += 4
100 }
101
102 fn put_i32_le(&mut self, _: i32) {
103 self.size += 4
104 }
105
106 fn put_i32_ne(&mut self, _: i32) {
107 self.size += 4
108 }
109
110 fn put_i64(&mut self, _: i64) {
111 self.size += 8
112 }
113
114 fn put_i64_le(&mut self, _: i64) {
115 self.size += 8
116 }
117
118 fn put_i64_ne(&mut self, _: i64) {
119 self.size += 8
120 }
121
122 fn put_i8(&mut self, _: i8) {
123 self.size += 1
124 }
125
126 fn put_int(&mut self, _: i64, nbytes: usize) {
127 self.size += nbytes
128 }
129
130 fn put_int_le(&mut self, _: i64, nbytes: usize) {
131 self.size += nbytes
132 }
133
134 fn put_int_ne(&mut self, _: i64, nbytes: usize) {
135 self.size += nbytes
136 }
137
138 fn put_slice(&mut self, src: &[u8]) {
139 self.size += src.len();
140 }
141
142 fn put_u128(&mut self, _: u128) {
143 self.size += 16
144 }
145
146 fn put_u128_le(&mut self, _: u128) {
147 self.size += 16
148 }
149
150 fn put_u128_ne(&mut self, _: u128) {
151 self.size += 16
152 }
153
154 fn put_u16(&mut self, _: u16) {
155 self.size += 2
156 }
157
158 fn put_u16_le(&mut self, _: u16) {
159 self.size += 2
160 }
161
162 fn put_u16_ne(&mut self, _: u16) {
163 self.size += 2
164 }
165
166 fn put_u32(&mut self, _: u32) {
167 self.size += 4
168 }
169
170 fn put_u32_le(&mut self, _: u32) {
171 self.size += 4
172 }
173
174 fn put_u32_ne(&mut self, _: u32) {
175 self.size += 4
176 }
177
178 fn put_u64(&mut self, _: u64) {
179 self.size += 8
180 }
181
182 fn put_u64_le(&mut self, _: u64) {
183 self.size += 8
184 }
185
186 fn put_u64_ne(&mut self, _: u64) {
187 self.size += 8
188 }
189
190 fn put_u8(&mut self, _: u8) {
191 self.size += 1
192 }
193
194 fn put_uint(&mut self, _: u64, nbytes: usize) {
195 self.size += nbytes
196 }
197
198 fn put_uint_le(&mut self, _: u64, nbytes: usize) {
199 self.size += nbytes
200 }
201
202 fn put_uint_ne(&mut self, _: u64, nbytes: usize) {
203 self.size += nbytes
204 }
205
206 }