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>>;
12 fn encode_i16(v: i16, writer: &mut W) -> Result<usize, Error<W::Error>>;
14 fn encode_i32(v: i32, writer: &mut W) -> Result<usize, Error<W::Error>>;
16 fn encode_i64(v: i64, writer: &mut W) -> Result<usize, Error<W::Error>>;
18 fn encode_i128(v: i128, writer: &mut W) -> Result<usize, Error<W::Error>>;
20 fn encode_u8(v: u8, writer: &mut W) -> Result<usize, Error<W::Error>>;
22 fn encode_u16(v: u16, writer: &mut W) -> Result<usize, Error<W::Error>>;
24 fn encode_u32(v: u32, writer: &mut W) -> Result<usize, Error<W::Error>>;
26 fn encode_u64(v: u64, writer: &mut W) -> Result<usize, Error<W::Error>>;
28 fn encode_u128(v: u128, writer: &mut W) -> Result<usize, Error<W::Error>>;
30 fn encode_f32(v: f32, writer: &mut W) -> Result<usize, Error<W::Error>>;
32 fn encode_f64(v: f64, writer: &mut W) -> Result<usize, Error<W::Error>>;
34}
35
36pub struct Exact;
68
69impl<W: IoWrite> NumEncoder<W> for Exact {
70 fn encode_i8(v: i8, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
71 v.encode(writer)
72 }
73
74 fn encode_i16(v: i16, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
75 v.encode(writer)
76 }
77
78 fn encode_i32(v: i32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
79 v.encode(writer)
80 }
81
82 fn encode_i64(v: i64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
83 v.encode(writer)
84 }
85
86 fn encode_i128(v: i128, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
87 v.encode(writer)
88 }
89
90 fn encode_u8(v: u8, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
91 v.encode(writer)
92 }
93
94 fn encode_u16(v: u16, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
95 v.encode(writer)
96 }
97
98 fn encode_u32(v: u32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
99 v.encode(writer)
100 }
101
102 fn encode_u64(v: u64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
103 v.encode(writer)
104 }
105
106 fn encode_u128(v: u128, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
107 v.encode(writer)
108 }
109
110 fn encode_f32(v: f32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
111 v.encode(writer)
112 }
113
114 fn encode_f64(v: f64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
115 v.encode(writer)
116 }
117}
118
119pub struct LosslessMinimize;
178
179impl LosslessMinimize {
180 fn encode_int<T: ToPrimitive, W: IoWrite>(
181 v: T,
182 writer: &mut W,
183 ) -> Result<usize, Error<<W as IoWrite>::Error>> {
184 EncodeMinimizeInt(v).encode(writer)
185 }
186
187 fn encode_float<T: Into<EncodeMinimizeFloat>, W: IoWrite>(
188 v: T,
189 writer: &mut W,
190 ) -> Result<usize, Error<<W as IoWrite>::Error>> {
191 let encoder: EncodeMinimizeFloat = v.into();
192 let size = encoder.encode(writer)?;
193 Ok(size)
194 }
195}
196
197impl<W: IoWrite> NumEncoder<W> for LosslessMinimize {
198 fn encode_i8(v: i8, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
199 Self::encode_int(v, writer)
200 }
201
202 fn encode_i16(v: i16, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
203 Self::encode_int(v, writer)
204 }
205
206 fn encode_i32(v: i32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
207 Self::encode_int(v, writer)
208 }
209
210 fn encode_i64(v: i64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
211 Self::encode_int(v, writer)
212 }
213
214 fn encode_i128(v: i128, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
215 Self::encode_int(v, writer)
216 }
217
218 fn encode_u8(v: u8, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
219 Self::encode_int(v, writer)
220 }
221
222 fn encode_u16(v: u16, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
223 Self::encode_int(v, writer)
224 }
225
226 fn encode_u32(v: u32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
227 Self::encode_int(v, writer)
228 }
229
230 fn encode_u64(v: u64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
231 Self::encode_int(v, writer)
232 }
233
234 fn encode_u128(v: u128, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
235 Self::encode_int(v, writer)
236 }
237
238 fn encode_f32(v: f32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
239 Self::encode_float(v, writer)
240 }
241
242 fn encode_f64(v: f64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
243 Self::encode_float(v, writer)
244 }
245}
246
247pub struct AggressiveMinimize;
293
294impl AggressiveMinimize {
295 fn encode_int<T: ToPrimitive, W: IoWrite>(
296 v: T,
297 writer: &mut W,
298 ) -> Result<usize, Error<<W as IoWrite>::Error>> {
299 EncodeMinimizeInt(v).encode(writer)
300 }
301
302 fn encode_float<T: FloatCore + Into<EncodeMinimizeFloat>, W: IoWrite>(
303 v: T,
304 writer: &mut W,
305 ) -> Result<usize, Error<<W as IoWrite>::Error>> {
306 if v.is_finite() && v.fract().is_zero() {
307 let size = Self::encode_int(v, writer).or_else(|_| v.into().encode(writer))?;
308 Ok(size)
309 } else {
310 let size = v.into().encode(writer)?;
311 Ok(size)
312 }
313 }
314}
315
316impl<W: IoWrite> NumEncoder<W> for AggressiveMinimize {
317 fn encode_i8(v: i8, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
318 Self::encode_int(v, writer)
319 }
320
321 fn encode_i16(v: i16, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
322 Self::encode_int(v, writer)
323 }
324
325 fn encode_i32(v: i32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
326 Self::encode_int(v, writer)
327 }
328
329 fn encode_i64(v: i64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
330 Self::encode_int(v, writer)
331 }
332
333 fn encode_i128(v: i128, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
334 Self::encode_int(v, writer)
335 }
336
337 fn encode_u8(v: u8, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
338 Self::encode_int(v, writer)
339 }
340
341 fn encode_u16(v: u16, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
342 Self::encode_int(v, writer)
343 }
344
345 fn encode_u32(v: u32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
346 Self::encode_int(v, writer)
347 }
348
349 fn encode_u64(v: u64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
350 Self::encode_int(v, writer)
351 }
352
353 fn encode_u128(v: u128, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
354 Self::encode_int(v, writer)
355 }
356
357 fn encode_f32(v: f32, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
358 Self::encode_float(v, writer)
359 }
360
361 fn encode_f64(v: f64, writer: &mut W) -> Result<usize, Error<<W as IoWrite>::Error>> {
362 Self::encode_float(v, writer)
363 }
364}