Coverage Report

Created: 2026-11-03 08:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/bincode-2.0.1/src/enc/impls.rs
Line
Count
Source
1
use super::{write::Writer, Encode, Encoder};
2
use crate::{
3
    config::{Endianness, IntEncoding, InternalEndianConfig, InternalIntEncodingConfig},
4
    error::EncodeError,
5
};
6
use core::cmp::Reverse;
7
use core::{
8
    cell::{Cell, RefCell},
9
    marker::PhantomData,
10
    num::{
11
        NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU128,
12
        NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize, Wrapping,
13
    },
14
    ops::{Bound, Range, RangeInclusive},
15
    time::Duration,
16
};
17
18
impl Encode for () {
19
0
    fn encode<E: Encoder>(&self, _: &mut E) -> Result<(), EncodeError> {
20
0
        Ok(())
21
0
    }
22
}
23
24
impl<T> Encode for PhantomData<T> {
25
0
    fn encode<E: Encoder>(&self, _: &mut E) -> Result<(), EncodeError> {
26
0
        Ok(())
27
0
    }
28
}
29
30
impl Encode for bool {
31
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
32
0
        u8::from(*self).encode(encoder)
33
0
    }
34
}
35
36
impl Encode for u8 {
37
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
38
0
        encoder.writer().write(&[*self])
39
0
    }
Unexecuted instantiation: <u8 as bincode::enc::Encode>::encode::<bincode::enc::encoder::EncoderImpl<bincode::features::impl_std::IoWriter<std::io::buffered::bufwriter::BufWriter<&mut std::fs::File>>, bincode::config::Configuration>>
Unexecuted instantiation: <u8 as bincode::enc::Encode>::encode::<bincode::enc::encoder::EncoderImpl<bincode::features::impl_std::IoWriter<surrealmx::compression::CompressedWriter>, bincode::config::Configuration>>
Unexecuted instantiation: <u8 as bincode::enc::Encode>::encode::<&mut bincode::enc::encoder::EncoderImpl<bincode::features::impl_std::IoWriter<std::io::buffered::bufwriter::BufWriter<&mut std::fs::File>>, bincode::config::Configuration>>
Unexecuted instantiation: <u8 as bincode::enc::Encode>::encode::<&mut bincode::enc::encoder::EncoderImpl<bincode::features::impl_std::IoWriter<surrealmx::compression::CompressedWriter>, bincode::config::Configuration>>
Unexecuted instantiation: <u8 as bincode::enc::Encode>::encode::<_>
40
}
41
42
impl Encode for NonZeroU8 {
43
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
44
0
        self.get().encode(encoder)
45
0
    }
46
}
47
48
impl Encode for u16 {
49
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
50
0
        match E::C::INT_ENCODING {
51
            IntEncoding::Variable => {
52
0
                crate::varint::varint_encode_u16(encoder.writer(), E::C::ENDIAN, *self)
53
            }
54
0
            IntEncoding::Fixed => match E::C::ENDIAN {
55
0
                Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
56
0
                Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
57
            },
58
        }
59
0
    }
60
}
61
62
impl Encode for NonZeroU16 {
63
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
64
0
        self.get().encode(encoder)
65
0
    }
66
}
67
68
impl Encode for u32 {
69
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
70
0
        match E::C::INT_ENCODING {
71
            IntEncoding::Variable => {
72
0
                crate::varint::varint_encode_u32(encoder.writer(), E::C::ENDIAN, *self)
73
            }
74
0
            IntEncoding::Fixed => match E::C::ENDIAN {
75
0
                Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
76
0
                Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
77
            },
78
        }
79
0
    }
80
}
81
82
impl Encode for NonZeroU32 {
83
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
84
0
        self.get().encode(encoder)
85
0
    }
86
}
87
88
impl Encode for u64 {
89
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
90
0
        match E::C::INT_ENCODING {
91
            IntEncoding::Variable => {
92
0
                crate::varint::varint_encode_u64(encoder.writer(), E::C::ENDIAN, *self)
93
            }
94
0
            IntEncoding::Fixed => match E::C::ENDIAN {
95
0
                Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
96
0
                Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
97
            },
98
        }
99
0
    }
Unexecuted instantiation: <u64 as bincode::enc::Encode>::encode::<bincode::enc::encoder::EncoderImpl<bincode::features::impl_std::IoWriter<std::io::buffered::bufwriter::BufWriter<&mut std::fs::File>>, bincode::config::Configuration>>
Unexecuted instantiation: <u64 as bincode::enc::Encode>::encode::<bincode::enc::encoder::EncoderImpl<bincode::features::impl_std::IoWriter<surrealmx::compression::CompressedWriter>, bincode::config::Configuration>>
Unexecuted instantiation: <u64 as bincode::enc::Encode>::encode::<_>
100
}
101
102
impl Encode for NonZeroU64 {
103
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
104
0
        self.get().encode(encoder)
105
0
    }
106
}
107
108
impl Encode for u128 {
109
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
110
0
        match E::C::INT_ENCODING {
111
            IntEncoding::Variable => {
112
0
                crate::varint::varint_encode_u128(encoder.writer(), E::C::ENDIAN, *self)
113
            }
114
0
            IntEncoding::Fixed => match E::C::ENDIAN {
115
0
                Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
116
0
                Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
117
            },
118
        }
119
0
    }
120
}
121
122
impl Encode for NonZeroU128 {
123
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
124
0
        self.get().encode(encoder)
125
0
    }
126
}
127
128
impl Encode for usize {
129
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
130
0
        match E::C::INT_ENCODING {
131
            IntEncoding::Variable => {
132
0
                crate::varint::varint_encode_usize(encoder.writer(), E::C::ENDIAN, *self)
133
            }
134
0
            IntEncoding::Fixed => match E::C::ENDIAN {
135
0
                Endianness::Big => encoder.writer().write(&(*self as u64).to_be_bytes()),
136
0
                Endianness::Little => encoder.writer().write(&(*self as u64).to_le_bytes()),
137
            },
138
        }
139
0
    }
Unexecuted instantiation: <usize as bincode::enc::Encode>::encode::<&mut bincode::enc::encoder::EncoderImpl<bincode::features::impl_std::IoWriter<surrealmx::compression::CompressedWriter>, bincode::config::Configuration>>
Unexecuted instantiation: <usize as bincode::enc::Encode>::encode::<_>
140
}
141
142
impl Encode for NonZeroUsize {
143
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
144
0
        self.get().encode(encoder)
145
0
    }
146
}
147
148
impl Encode for i8 {
149
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
150
0
        encoder.writer().write(&[*self as u8])
151
0
    }
152
}
153
154
impl Encode for NonZeroI8 {
155
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
156
0
        self.get().encode(encoder)
157
0
    }
158
}
159
160
impl Encode for i16 {
161
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
162
0
        match E::C::INT_ENCODING {
163
            IntEncoding::Variable => {
164
0
                crate::varint::varint_encode_i16(encoder.writer(), E::C::ENDIAN, *self)
165
            }
166
0
            IntEncoding::Fixed => match E::C::ENDIAN {
167
0
                Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
168
0
                Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
169
            },
170
        }
171
0
    }
172
}
173
174
impl Encode for NonZeroI16 {
175
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
176
0
        self.get().encode(encoder)
177
0
    }
178
}
179
180
impl Encode for i32 {
181
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
182
0
        match E::C::INT_ENCODING {
183
            IntEncoding::Variable => {
184
0
                crate::varint::varint_encode_i32(encoder.writer(), E::C::ENDIAN, *self)
185
            }
186
0
            IntEncoding::Fixed => match E::C::ENDIAN {
187
0
                Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
188
0
                Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
189
            },
190
        }
191
0
    }
192
}
193
194
impl Encode for NonZeroI32 {
195
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
196
0
        self.get().encode(encoder)
197
0
    }
198
}
199
200
impl Encode for i64 {
201
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
202
0
        match E::C::INT_ENCODING {
203
            IntEncoding::Variable => {
204
0
                crate::varint::varint_encode_i64(encoder.writer(), E::C::ENDIAN, *self)
205
            }
206
0
            IntEncoding::Fixed => match E::C::ENDIAN {
207
0
                Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
208
0
                Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
209
            },
210
        }
211
0
    }
212
}
213
214
impl Encode for NonZeroI64 {
215
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
216
0
        self.get().encode(encoder)
217
0
    }
218
}
219
220
impl Encode for i128 {
221
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
222
0
        match E::C::INT_ENCODING {
223
            IntEncoding::Variable => {
224
0
                crate::varint::varint_encode_i128(encoder.writer(), E::C::ENDIAN, *self)
225
            }
226
0
            IntEncoding::Fixed => match E::C::ENDIAN {
227
0
                Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
228
0
                Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
229
            },
230
        }
231
0
    }
232
}
233
234
impl Encode for NonZeroI128 {
235
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
236
0
        self.get().encode(encoder)
237
0
    }
238
}
239
240
impl Encode for isize {
241
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
242
0
        match E::C::INT_ENCODING {
243
            IntEncoding::Variable => {
244
0
                crate::varint::varint_encode_isize(encoder.writer(), E::C::ENDIAN, *self)
245
            }
246
0
            IntEncoding::Fixed => match E::C::ENDIAN {
247
0
                Endianness::Big => encoder.writer().write(&(*self as i64).to_be_bytes()),
248
0
                Endianness::Little => encoder.writer().write(&(*self as i64).to_le_bytes()),
249
            },
250
        }
251
0
    }
252
}
253
254
impl Encode for NonZeroIsize {
255
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
256
0
        self.get().encode(encoder)
257
0
    }
258
}
259
260
impl Encode for f32 {
261
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
262
0
        match E::C::ENDIAN {
263
0
            Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
264
0
            Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
265
        }
266
0
    }
267
}
268
269
impl Encode for f64 {
270
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
271
0
        match E::C::ENDIAN {
272
0
            Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
273
0
            Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
274
        }
275
0
    }
276
}
277
278
impl<T: Encode> Encode for Wrapping<T> {
279
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
280
0
        self.0.encode(encoder)
281
0
    }
282
}
283
284
impl<T: Encode> Encode for Reverse<T> {
285
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
286
0
        self.0.encode(encoder)
287
0
    }
288
}
289
290
impl Encode for char {
291
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
292
0
        encode_utf8(encoder.writer(), *self)
293
0
    }
294
}
295
296
impl<T> Encode for [T]
297
where
298
    T: Encode,
299
{
300
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
301
0
        super::encode_slice_len(encoder, self.len())?;
302
303
0
        if unty::type_equal::<T, u8>() {
304
            // Safety: T = u8
305
0
            let t: &[u8] = unsafe { core::mem::transmute(self) };
306
0
            encoder.writer().write(t)?;
307
0
            return Ok(());
308
0
        }
309
310
0
        for item in self {
311
0
            item.encode(encoder)?;
312
        }
313
0
        Ok(())
314
0
    }
Unexecuted instantiation: <[u8] as bincode::enc::Encode>::encode::<bincode::enc::encoder::EncoderImpl<bincode::features::impl_std::IoWriter<std::io::buffered::bufwriter::BufWriter<&mut std::fs::File>>, bincode::config::Configuration>>
Unexecuted instantiation: <[u8] as bincode::enc::Encode>::encode::<bincode::enc::encoder::EncoderImpl<bincode::features::impl_std::IoWriter<surrealmx::compression::CompressedWriter>, bincode::config::Configuration>>
Unexecuted instantiation: <[_] as bincode::enc::Encode>::encode::<_>
315
}
316
317
const TAG_CONT: u8 = 0b1000_0000;
318
const TAG_TWO_B: u8 = 0b1100_0000;
319
const TAG_THREE_B: u8 = 0b1110_0000;
320
const TAG_FOUR_B: u8 = 0b1111_0000;
321
const MAX_ONE_B: u32 = 0x80;
322
const MAX_TWO_B: u32 = 0x800;
323
const MAX_THREE_B: u32 = 0x10000;
324
325
0
fn encode_utf8(writer: &mut impl Writer, c: char) -> Result<(), EncodeError> {
326
0
    let code = c as u32;
327
328
0
    if code < MAX_ONE_B {
329
0
        writer.write(&[c as u8])
330
0
    } else if code < MAX_TWO_B {
331
0
        let mut buf = [0u8; 2];
332
0
        buf[0] = ((code >> 6) & 0x1F) as u8 | TAG_TWO_B;
333
0
        buf[1] = (code & 0x3F) as u8 | TAG_CONT;
334
0
        writer.write(&buf)
335
0
    } else if code < MAX_THREE_B {
336
0
        let mut buf = [0u8; 3];
337
0
        buf[0] = ((code >> 12) & 0x0F) as u8 | TAG_THREE_B;
338
0
        buf[1] = ((code >> 6) & 0x3F) as u8 | TAG_CONT;
339
0
        buf[2] = (code & 0x3F) as u8 | TAG_CONT;
340
0
        writer.write(&buf)
341
    } else {
342
0
        let mut buf = [0u8; 4];
343
0
        buf[0] = ((code >> 18) & 0x07) as u8 | TAG_FOUR_B;
344
0
        buf[1] = ((code >> 12) & 0x3F) as u8 | TAG_CONT;
345
0
        buf[2] = ((code >> 6) & 0x3F) as u8 | TAG_CONT;
346
0
        buf[3] = (code & 0x3F) as u8 | TAG_CONT;
347
0
        writer.write(&buf)
348
    }
349
0
}
350
351
impl Encode for str {
352
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
353
0
        self.as_bytes().encode(encoder)
354
0
    }
355
}
356
357
impl<T, const N: usize> Encode for [T; N]
358
where
359
    T: Encode,
360
{
361
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
362
0
        if unty::type_equal::<T, u8>() {
363
            // Safety: this is &[u8; N]
364
0
            let array_slice: &[u8] =
365
0
                unsafe { core::slice::from_raw_parts(self.as_ptr().cast(), N) };
366
0
            encoder.writer().write(array_slice)
367
        } else {
368
0
            for item in self.iter() {
369
0
                item.encode(encoder)?;
370
            }
371
0
            Ok(())
372
        }
373
0
    }
374
}
375
376
impl<T> Encode for Option<T>
377
where
378
    T: Encode,
379
{
380
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
381
0
        super::encode_option_variant(encoder, self)?;
382
0
        if let Some(val) = self {
383
0
            val.encode(encoder)?;
384
0
        }
385
0
        Ok(())
386
0
    }
387
}
388
389
impl<T, U> Encode for Result<T, U>
390
where
391
    T: Encode,
392
    U: Encode,
393
{
394
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
395
0
        match self {
396
0
            Ok(val) => {
397
0
                0u32.encode(encoder)?;
398
0
                val.encode(encoder)
399
            }
400
0
            Err(err) => {
401
0
                1u32.encode(encoder)?;
402
0
                err.encode(encoder)
403
            }
404
        }
405
0
    }
406
}
407
408
impl<T> Encode for Cell<T>
409
where
410
    T: Encode + Copy,
411
{
412
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
413
0
        T::encode(&self.get(), encoder)
414
0
    }
415
}
416
417
impl<T> Encode for RefCell<T>
418
where
419
    T: Encode + ?Sized,
420
{
421
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
422
0
        let borrow_guard = self
423
0
            .try_borrow()
424
0
            .map_err(|e| EncodeError::RefCellAlreadyBorrowed {
425
0
                inner: e,
426
0
                type_name: core::any::type_name::<RefCell<T>>(),
427
0
            })?;
428
0
        T::encode(&borrow_guard, encoder)
429
0
    }
430
}
431
432
impl Encode for Duration {
433
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
434
0
        self.as_secs().encode(encoder)?;
435
0
        self.subsec_nanos().encode(encoder)?;
436
0
        Ok(())
437
0
    }
438
}
439
440
impl<T> Encode for Range<T>
441
where
442
    T: Encode,
443
{
444
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
445
0
        self.start.encode(encoder)?;
446
0
        self.end.encode(encoder)?;
447
0
        Ok(())
448
0
    }
449
}
450
451
impl<T> Encode for RangeInclusive<T>
452
where
453
    T: Encode,
454
{
455
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
456
0
        self.start().encode(encoder)?;
457
0
        self.end().encode(encoder)?;
458
0
        Ok(())
459
0
    }
460
}
461
462
impl<T> Encode for Bound<T>
463
where
464
    T: Encode,
465
{
466
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
467
0
        match self {
468
0
            Self::Unbounded => {
469
0
                0u32.encode(encoder)?;
470
            }
471
0
            Self::Included(val) => {
472
0
                1u32.encode(encoder)?;
473
0
                val.encode(encoder)?;
474
            }
475
0
            Self::Excluded(val) => {
476
0
                2u32.encode(encoder)?;
477
0
                val.encode(encoder)?;
478
            }
479
        }
480
0
        Ok(())
481
0
    }
482
}
483
484
impl<T> Encode for &T
485
where
486
    T: Encode + ?Sized,
487
{
488
0
    fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
489
0
        T::encode(self, encoder)
490
0
    }
491
}