Coverage Report

Created: 2025-10-13 06:08

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/bincode/src/de/decoder.rs
Line
Count
Source
1
use super::{
2
    read::{BorrowReader, Reader},
3
    BorrowDecoder, Decoder,
4
};
5
use crate::{config::Config, error::DecodeError, utils::Sealed};
6
7
/// A Decoder that reads bytes from a given reader `R`.
8
///
9
/// This struct should rarely be used.
10
/// In most cases, prefer any of the `decode` functions.
11
///
12
/// The ByteOrder that is chosen will impact the endianness that
13
/// is used to read integers out of the reader.
14
///
15
/// ```
16
/// # let slice: &[u8] = &[0, 0, 0, 0];
17
/// # let some_reader = bincode::de::read::SliceReader::new(slice);
18
/// use bincode::de::{DecoderImpl, Decode};
19
/// let mut context = ();
20
/// let mut decoder = DecoderImpl::new(some_reader, bincode::config::standard(), &mut context);
21
/// // this u32 can be any Decode
22
/// let value = u32::decode(&mut decoder).unwrap();
23
/// ```
24
pub struct DecoderImpl<R, C: Config, Context> {
25
    reader: R,
26
    config: C,
27
    bytes_read: usize,
28
    context: Context,
29
}
30
31
impl<R: Reader, C: Config, Context> DecoderImpl<R, C, Context> {
32
    /// Construct a new Decoder
33
12.3k
    pub fn new(reader: R, config: C, context: Context) -> DecoderImpl<R, C, Context> {
34
12.3k
        DecoderImpl {
35
12.3k
            reader,
36
12.3k
            config,
37
12.3k
            bytes_read: 0,
38
12.3k
            context,
39
12.3k
        }
40
12.3k
    }
<bincode::de::decoder::DecoderImpl<bincode::de::read::SliceReader, bincode::config::Configuration<bincode::config::LittleEndian, bincode::config::Fixint, bincode::config::Limit<1024>>, ()>>::new
Line
Count
Source
33
4.84k
    pub fn new(reader: R, config: C, context: Context) -> DecoderImpl<R, C, Context> {
34
4.84k
        DecoderImpl {
35
4.84k
            reader,
36
4.84k
            config,
37
4.84k
            bytes_read: 0,
38
4.84k
            context,
39
4.84k
        }
40
4.84k
    }
Unexecuted instantiation: <bincode::de::decoder::DecoderImpl<_, _, _>>::new
<bincode::de::decoder::DecoderImpl<bincode::de::read::SliceReader, bincode::config::Configuration<bincode::config::LittleEndian, bincode::config::Varint, bincode::config::Limit<1024>>, ()>>::new
Line
Count
Source
33
7.53k
    pub fn new(reader: R, config: C, context: Context) -> DecoderImpl<R, C, Context> {
34
7.53k
        DecoderImpl {
35
7.53k
            reader,
36
7.53k
            config,
37
7.53k
            bytes_read: 0,
38
7.53k
            context,
39
7.53k
        }
40
7.53k
    }
41
}
42
43
impl<R, C: Config, Context> Sealed for DecoderImpl<R, C, Context> {}
44
45
impl<'de, R: BorrowReader<'de>, C: Config, Context> BorrowDecoder<'de>
46
    for DecoderImpl<R, C, Context>
47
{
48
    type BR = R;
49
50
0
    fn borrow_reader(&mut self) -> &mut Self::BR {
51
0
        &mut self.reader
52
0
    }
53
}
54
55
impl<R: Reader, C: Config, Context> Decoder for DecoderImpl<R, C, Context> {
56
    type R = R;
57
58
    type C = C;
59
    type Context = Context;
60
61
591k
    fn reader(&mut self) -> &mut Self::R {
62
591k
        &mut self.reader
63
591k
    }
<bincode::de::decoder::DecoderImpl<bincode::de::read::SliceReader, bincode::config::Configuration<bincode::config::LittleEndian, bincode::config::Fixint, bincode::config::Limit<1024>>, ()> as bincode::de::Decoder>::reader
Line
Count
Source
61
56.3k
    fn reader(&mut self) -> &mut Self::R {
62
56.3k
        &mut self.reader
63
56.3k
    }
Unexecuted instantiation: <bincode::de::decoder::DecoderImpl<_, _, _> as bincode::de::Decoder>::reader
<bincode::de::decoder::DecoderImpl<bincode::de::read::SliceReader, bincode::config::Configuration<bincode::config::LittleEndian, bincode::config::Varint, bincode::config::Limit<1024>>, ()> as bincode::de::Decoder>::reader
Line
Count
Source
61
535k
    fn reader(&mut self) -> &mut Self::R {
62
535k
        &mut self.reader
63
535k
    }
64
65
0
    fn config(&self) -> &Self::C {
66
0
        &self.config
67
0
    }
68
69
    #[inline]
70
396k
    fn claim_bytes_read(&mut self, n: usize) -> Result<(), DecodeError> {
71
        // C::LIMIT is a const so this check should get compiled away
72
396k
        if let Some(limit) = C::LIMIT {
73
            // Make sure we don't accidentally overflow `bytes_read`
74
396k
            self.bytes_read = self
75
396k
                .bytes_read
76
396k
                .checked_add(n)
77
396k
                .ok_or(DecodeError::LimitExceeded)?;
78
396k
            if self.bytes_read > limit {
79
1.93k
                Err(DecodeError::LimitExceeded)
80
            } else {
81
394k
                Ok(())
82
            }
83
        } else {
84
0
            Ok(())
85
        }
86
396k
    }
<bincode::de::decoder::DecoderImpl<bincode::de::read::SliceReader, bincode::config::Configuration<bincode::config::LittleEndian, bincode::config::Fixint, bincode::config::Limit<1024>>, ()> as bincode::de::Decoder>::claim_bytes_read
Line
Count
Source
70
53.0k
    fn claim_bytes_read(&mut self, n: usize) -> Result<(), DecodeError> {
71
        // C::LIMIT is a const so this check should get compiled away
72
53.0k
        if let Some(limit) = C::LIMIT {
73
            // Make sure we don't accidentally overflow `bytes_read`
74
53.0k
            self.bytes_read = self
75
53.0k
                .bytes_read
76
53.0k
                .checked_add(n)
77
53.0k
                .ok_or(DecodeError::LimitExceeded)?;
78
53.0k
            if self.bytes_read > limit {
79
1.35k
                Err(DecodeError::LimitExceeded)
80
            } else {
81
51.7k
                Ok(())
82
            }
83
        } else {
84
0
            Ok(())
85
        }
86
53.0k
    }
Unexecuted instantiation: <bincode::de::decoder::DecoderImpl<_, _, _> as bincode::de::Decoder>::claim_bytes_read
<bincode::de::decoder::DecoderImpl<bincode::de::read::SliceReader, bincode::config::Configuration<bincode::config::LittleEndian, bincode::config::Varint, bincode::config::Limit<1024>>, ()> as bincode::de::Decoder>::claim_bytes_read
Line
Count
Source
70
343k
    fn claim_bytes_read(&mut self, n: usize) -> Result<(), DecodeError> {
71
        // C::LIMIT is a const so this check should get compiled away
72
343k
        if let Some(limit) = C::LIMIT {
73
            // Make sure we don't accidentally overflow `bytes_read`
74
343k
            self.bytes_read = self
75
343k
                .bytes_read
76
343k
                .checked_add(n)
77
343k
                .ok_or(DecodeError::LimitExceeded)?;
78
343k
            if self.bytes_read > limit {
79
577
                Err(DecodeError::LimitExceeded)
80
            } else {
81
342k
                Ok(())
82
            }
83
        } else {
84
0
            Ok(())
85
        }
86
343k
    }
87
88
    #[inline]
89
201k
    fn unclaim_bytes_read(&mut self, n: usize) {
90
201k
        // C::LIMIT is a const so this check should get compiled away
91
201k
        if C::LIMIT.is_some() {
92
201k
            // We should always be claiming more than we unclaim, so this should never underflow
93
201k
            self.bytes_read -= n;
94
201k
        }
95
201k
    }
<bincode::de::decoder::DecoderImpl<bincode::de::read::SliceReader, bincode::config::Configuration<bincode::config::LittleEndian, bincode::config::Fixint, bincode::config::Limit<1024>>, ()> as bincode::de::Decoder>::unclaim_bytes_read
Line
Count
Source
89
16.2k
    fn unclaim_bytes_read(&mut self, n: usize) {
90
16.2k
        // C::LIMIT is a const so this check should get compiled away
91
16.2k
        if C::LIMIT.is_some() {
92
16.2k
            // We should always be claiming more than we unclaim, so this should never underflow
93
16.2k
            self.bytes_read -= n;
94
16.2k
        }
95
16.2k
    }
Unexecuted instantiation: <bincode::de::decoder::DecoderImpl<_, _, _> as bincode::de::Decoder>::unclaim_bytes_read
<bincode::de::decoder::DecoderImpl<bincode::de::read::SliceReader, bincode::config::Configuration<bincode::config::LittleEndian, bincode::config::Varint, bincode::config::Limit<1024>>, ()> as bincode::de::Decoder>::unclaim_bytes_read
Line
Count
Source
89
185k
    fn unclaim_bytes_read(&mut self, n: usize) {
90
185k
        // C::LIMIT is a const so this check should get compiled away
91
185k
        if C::LIMIT.is_some() {
92
185k
            // We should always be claiming more than we unclaim, so this should never underflow
93
185k
            self.bytes_read -= n;
94
185k
        }
95
185k
    }
96
97
0
    fn context(&mut self) -> &mut Self::Context {
98
0
        &mut self.context
99
0
    }
100
}
101
102
pub struct WithContext<'a, D: ?Sized, C> {
103
    pub(crate) decoder: &'a mut D,
104
    pub(crate) context: C,
105
}
106
107
impl<C, D: Decoder + ?Sized> Sealed for WithContext<'_, D, C> {}
108
109
impl<Context, D: Decoder + ?Sized> Decoder for WithContext<'_, D, Context> {
110
    type R = D::R;
111
112
    type C = D::C;
113
114
    type Context = Context;
115
116
0
    fn context(&mut self) -> &mut Self::Context {
117
0
        &mut self.context
118
0
    }
119
120
0
    fn reader(&mut self) -> &mut Self::R {
121
0
        self.decoder.reader()
122
0
    }
123
124
0
    fn config(&self) -> &Self::C {
125
0
        self.decoder.config()
126
0
    }
127
128
0
    fn claim_bytes_read(&mut self, n: usize) -> Result<(), DecodeError> {
129
0
        self.decoder.claim_bytes_read(n)
130
0
    }
131
132
0
    fn unclaim_bytes_read(&mut self, n: usize) {
133
0
        self.decoder.unclaim_bytes_read(n)
134
0
    }
135
}
136
137
impl<'de, C, D: BorrowDecoder<'de>> BorrowDecoder<'de> for WithContext<'_, D, C> {
138
    type BR = D::BR;
139
0
    fn borrow_reader(&mut self) -> &mut Self::BR {
140
0
        self.decoder.borrow_reader()
141
0
    }
142
}