1use messagepack_core::{
2 Encode,
3 encode::{Error, float::EncodeMinimizeFloat, int::EncodeMinimizeInt},
4 io::IoWrite,
5};
6use num_traits::{ToPrimitive, float::FloatCore};
7
8pub trait NumEncoder<W: IoWrite> {
10 fn encode_i8(v: i8, writer: &mut W) -> Result<usize, Error<W::Error>>;
11 fn encode_i16(v: i16, writer: &mut W) -> Result<usize, Error<W::Error>>;
12 fn encode_i32(v: i32, writer: &mut W) -> Result<usize, Error<W::Error>>;
13 fn encode_i64(v: i64, writer: &mut W) -> Result<usize, Error<W::Error>>;
14 fn encode_i128(v: i128, writer: &mut W) -> Result<usize, Error<W::Error>>;
15 fn encode_u8(v: u8, writer: &mut W) -> Result<usize, Error<W::Error>>;
16 fn encode_u16(v: u16, writer: &mut W) -> Result<usize, Error<W::Error>>;
17 fn encode_u32(v: u32, writer: &mut W) -> Result<usize, Error<W::Error>>;
18 fn encode_u64(v: u64, writer: &mut W) -> Result<usize, Error<W::Error>>;
19 fn encode_u128(v: u128, writer: &mut W) -> Result<usize, Error<W::Error>>;
20 fn encode_f32(v: f32, writer: &mut W) -> Result<usize, Error<W::Error>>;
21 fn encode_f64(v: f64, writer: &mut W) -> Result<usize, Error<W::Error>>;
22}
23
24pub struct Exact;
62
63impl<W: IoWrite> NumEncoder<W> for Exact {
64 fn encode_i8(v: i8, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
65 v.encode(writer)
66 }
67
68 fn encode_i16(v: i16, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
69 v.encode(writer)
70 }
71
72 fn encode_i32(v: i32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
73 v.encode(writer)
74 }
75
76 fn encode_i64(v: i64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
77 v.encode(writer)
78 }
79
80 fn encode_i128(v: i128, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
81 v.encode(writer)
82 }
83
84 fn encode_u8(v: u8, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
85 v.encode(writer)
86 }
87
88 fn encode_u16(v: u16, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
89 v.encode(writer)
90 }
91
92 fn encode_u32(v: u32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
93 v.encode(writer)
94 }
95
96 fn encode_u64(v: u64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
97 v.encode(writer)
98 }
99
100 fn encode_u128(v: u128, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
101 v.encode(writer)
102 }
103
104 fn encode_f32(v: f32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
105 v.encode(writer)
106 }
107
108 fn encode_f64(v: f64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
109 v.encode(writer)
110 }
111}
112
113pub struct LosslessMinimize;
185
186impl LosslessMinimize {
187 fn encode_int<T: ToPrimitive, W: IoWrite>(
188 v: T,
189 writer: &mut W,
190 ) -> Result<usize, Error<<W as IoWrite>::Error>> {
191 EncodeMinimizeInt(v).encode(writer)
192 }
193
194 fn encode_float<T: Into<EncodeMinimizeFloat>, W: IoWrite>(
195 v: T,
196 writer: &mut W,
197 ) -> Result<usize, Error<<W as IoWrite>::Error>> {
198 let encoder: EncodeMinimizeFloat = v.into();
199 let size = encoder.encode(writer)?;
200 Ok(size)
201 }
202}
203
204impl<W: IoWrite> NumEncoder<W> for LosslessMinimize {
205 fn encode_i8(v: i8, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
206 Self::encode_int(v, writer)
207 }
208
209 fn encode_i16(v: i16, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
210 Self::encode_int(v, writer)
211 }
212
213 fn encode_i32(v: i32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
214 Self::encode_int(v, writer)
215 }
216
217 fn encode_i64(v: i64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
218 Self::encode_int(v, writer)
219 }
220
221 fn encode_i128(v: i128, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
222 Self::encode_int(v, writer)
223 }
224
225 fn encode_u8(v: u8, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
226 Self::encode_int(v, writer)
227 }
228
229 fn encode_u16(v: u16, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
230 Self::encode_int(v, writer)
231 }
232
233 fn encode_u32(v: u32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
234 Self::encode_int(v, writer)
235 }
236
237 fn encode_u64(v: u64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
238 Self::encode_int(v, writer)
239 }
240
241 fn encode_u128(v: u128, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
242 Self::encode_int(v, writer)
243 }
244
245 fn encode_f32(v: f32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
246 Self::encode_float(v, writer)
247 }
248
249 fn encode_f64(v: f64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
250 Self::encode_float(v, writer)
251 }
252}
253
254pub struct AggressiveMinimize;
309
310impl AggressiveMinimize {
311 fn encode_int<T: ToPrimitive, W: IoWrite>(
312 v: T,
313 writer: &mut W,
314 ) -> Result<usize, Error<<W as IoWrite>::Error>> {
315 EncodeMinimizeInt(v).encode(writer)
316 }
317
318 fn encode_float<T: FloatCore + Into<EncodeMinimizeFloat>, W: IoWrite>(
319 v: T,
320 writer: &mut W,
321 ) -> Result<usize, Error<<W as IoWrite>::Error>> {
322 if v.is_finite() && v.fract().is_zero() {
323 let size = Self::encode_int(v, writer).or_else(|_| v.into().encode(writer))?;
324 Ok(size)
325 } else {
326 let size = v.into().encode(writer)?;
327 Ok(size)
328 }
329 }
330}
331
332impl<W: IoWrite> NumEncoder<W> for AggressiveMinimize {
333 fn encode_i8(v: i8, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
334 Self::encode_int(v, writer)
335 }
336
337 fn encode_i16(v: i16, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
338 Self::encode_int(v, writer)
339 }
340
341 fn encode_i32(v: i32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
342 Self::encode_int(v, writer)
343 }
344
345 fn encode_i64(v: i64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
346 Self::encode_int(v, writer)
347 }
348
349 fn encode_i128(v: i128, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
350 Self::encode_int(v, writer)
351 }
352
353 fn encode_u8(v: u8, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
354 Self::encode_int(v, writer)
355 }
356
357 fn encode_u16(v: u16, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
358 Self::encode_int(v, writer)
359 }
360
361 fn encode_u32(v: u32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
362 Self::encode_int(v, writer)
363 }
364
365 fn encode_u64(v: u64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
366 Self::encode_int(v, writer)
367 }
368
369 fn encode_u128(v: u128, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
370 Self::encode_int(v, writer)
371 }
372
373 fn encode_f32(v: f32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
374 Self::encode_float(v, writer)
375 }
376
377 fn encode_f64(v: f64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
378 Self::encode_float(v, writer)
379 }
380}