moq_lite/coding/
size.rs

1use std::mem::MaybeUninit;
2
3use bytes::{buf::UninitSlice, Buf, BufMut};
4
5// A BufMut implementation that only counts the size of the buffer
6#[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		// We need to return a valid slice, but it won't actually be written to
18		// Use a thread-local static buffer to avoid safety issues
19		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	// TODO
207	// fn writer(self) -> bytes::buf::Writer<Self> {
208	// fn chain_mut<U: BufMut>(self, next: U) -> bytes::buf::Chain<Self, U>
209	// fn limit(self, limit: usize) -> bytes::buf::Limit<Self>
210}