/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 | | } |