Skip to content

Commit 60cbb82

Browse files
committed
A bit of refactoring. Moved bodies of the most of closures related to parsing numbers into regular functions.
1 parent 01320d5 commit 60cbb82

File tree

1 file changed

+23
-7
lines changed

1 file changed

+23
-7
lines changed

src/parser.rs

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,22 @@ impl<'a> Debug for LineReader<'a> {
122122
}
123123
}
124124

125+
fn is_octal_digit(c: &&u8) -> bool {
126+
(b'0'..=b'7').contains(**c)
127+
}
128+
129+
fn decimal_reducer_usize(r: usize, c: &u8) -> usize {
130+
r * 10 + usize::from(*c - b'0')
131+
}
132+
133+
fn decimal_reducer_u32(r: u32, c: &u8) -> u32 {
134+
r * 10 + u32::from(*c - b'0')
135+
}
136+
137+
fn octal_reducer_u32(r: u32, c: &u8) -> u32 {
138+
r * 8 + u32::from(*c - b'0')
139+
}
140+
125141
impl<'a> LineReader<'a> {
126142
fn is_empty(&self) -> bool {
127143
self.buf.is_empty()
@@ -185,14 +201,14 @@ impl<'a> LineReader<'a> {
185201
let iter = &mut buf.iter();
186202
let old_start = iter
187203
.take_while(|&&c| c.is_ascii_digit())
188-
.fold(0, |r, &c| r * 10 + u32::from(c - b'0'));
204+
.fold(0, decimal_reducer_u32);
189205

190206
let c = *iter
191207
.next()
192208
.ok_or_else(|| ParsepatchError::InvalidHunkHeader(self.get_line()))?;
193209
let old_lines = if c.is_ascii_digit() {
194210
iter.take_while(|&&c| c.is_ascii_digit())
195-
.fold(u32::from(c - b'0'), |r, &c| r * 10 + u32::from(c - b'0'))
211+
.fold(u32::from(c - b'0'), decimal_reducer_u32)
196212
} else {
197213
1
198214
};
@@ -203,14 +219,14 @@ impl<'a> LineReader<'a> {
203219

204220
let new_start = iter
205221
.take_while(|&&c| c.is_ascii_digit())
206-
.fold(0, |r, &c| r * 10 + u32::from(c - b'0'));
222+
.fold(0, decimal_reducer_u32);
207223

208224
let c = *iter
209225
.next()
210226
.ok_or_else(|| ParsepatchError::InvalidHunkHeader(self.get_line()))?;
211227
let new_lines = if c.is_ascii_digit() {
212228
iter.take_while(|&&c| c.is_ascii_digit())
213-
.fold(u32::from(c - b'0'), |r, &c| r * 10 + u32::from(c - b'0'))
229+
.fold(u32::from(c - b'0'), decimal_reducer_u32)
214230
} else {
215231
1
216232
};
@@ -286,8 +302,8 @@ impl<'a> LineReader<'a> {
286302
// the following number is an octal number with 6 digits (so max is 8^6 - 1)
287303
let buf = unsafe { self.buf.get_unchecked(start.len()..) };
288304
buf.iter()
289-
.take_while(|&&c| (b'0'..=b'7').contains(&c))
290-
.fold(0, |r, &c| r * 8 + u32::from(c - b'0'))
305+
.take_while(is_octal_digit)
306+
.fold(0, octal_reducer_u32)
291307
}
292308
}
293309

@@ -656,7 +672,7 @@ impl<'a> PatchReader<'a> {
656672
fn parse_usize(buf: &[u8]) -> usize {
657673
buf.iter()
658674
.take_while(|&&c| c.is_ascii_digit())
659-
.fold(0, |r, &c| r * 10 + usize::from(c - b'0'))
675+
.fold(0, decimal_reducer_usize)
660676
}
661677

662678
fn skip_binary(&mut self) -> Vec<BinaryHunk> {

0 commit comments

Comments
 (0)