Skip to content

Commit 5add12b

Browse files
committed
A bit of refactoring. Moved bodies of the most of closures related to parsing numbers into regular functions.
1 parent b3dbb48 commit 5add12b

File tree

1 file changed

+34
-14
lines changed

1 file changed

+34
-14
lines changed

src/parser.rs

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,26 @@ impl<'a> Debug for LineReader<'a> {
126126
}
127127
}
128128

129+
fn is_digit(c: &&u8) -> bool {
130+
**c >= b'0' && **c <= b'9'
131+
}
132+
133+
fn is_octal_digit(c: &&u8) -> bool {
134+
**c >= b'0' && **c <= b'7'
135+
}
136+
137+
fn decimal_reducer_usize(r: usize, c: &u8) -> usize {
138+
r * 10 + usize::from(*c - b'0')
139+
}
140+
141+
fn decimal_reducer_u32(r: u32, c: &u8) -> u32 {
142+
r * 10 + u32::from(*c - b'0')
143+
}
144+
145+
fn octal_reducer_u32(r: u32, c: &u8) -> u32 {
146+
r * 8 + u32::from(*c - b'0')
147+
}
148+
129149
impl<'a> LineReader<'a> {
130150
fn is_empty(&self) -> bool {
131151
self.buf.is_empty()
@@ -188,15 +208,15 @@ impl<'a> LineReader<'a> {
188208
// NUMS_PAT = re.compile(r'^@@ -([0-9]+),?([0-9]+)? \+([0-9]+),?([0-9]+)? @@')
189209
let iter = &mut buf.iter();
190210
let old_start = iter
191-
.take_while(|&&c| c >= b'0' && c <= b'9')
192-
.fold(0, |r, &c| r * 10 + u32::from(c - b'0'));
211+
.take_while(is_digit)
212+
.fold(0, decimal_reducer_u32);
193213

194214
let c = *iter
195215
.next()
196216
.ok_or_else(|| ParsepatchError::InvalidHunkHeader(self.get_line()))?;
197-
let old_lines = if c >= b'0' && c <= b'9' {
198-
iter.take_while(|&&c| c >= b'0' && c <= b'9')
199-
.fold(u32::from(c - b'0'), |r, &c| r * 10 + u32::from(c - b'0'))
217+
let old_lines = if is_digit(&&c) {
218+
iter.take_while(is_digit)
219+
.fold(u32::from(c - b'0'), decimal_reducer_u32)
200220
} else {
201221
1
202222
};
@@ -206,15 +226,15 @@ impl<'a> LineReader<'a> {
206226
}
207227

208228
let new_start = iter
209-
.take_while(|&&c| c >= b'0' && c <= b'9')
210-
.fold(0, |r, &c| r * 10 + u32::from(c - b'0'));
229+
.take_while(is_digit)
230+
.fold(0, decimal_reducer_u32);
211231

212232
let c = *iter
213233
.next()
214234
.ok_or_else(|| ParsepatchError::InvalidHunkHeader(self.get_line()))?;
215-
let new_lines = if c >= b'0' && c <= b'9' {
216-
iter.take_while(|&&c| c >= b'0' && c <= b'9')
217-
.fold(u32::from(c - b'0'), |r, &c| r * 10 + u32::from(c - b'0'))
235+
let new_lines = if is_digit(&&c) {
236+
iter.take_while(is_digit)
237+
.fold(u32::from(c - b'0'), decimal_reducer_u32)
218238
} else {
219239
1
220240
};
@@ -290,8 +310,8 @@ impl<'a> LineReader<'a> {
290310
// the following number is an octal number with 6 digits (so max is 8^6 - 1)
291311
let buf = unsafe { self.buf.get_unchecked(start.len()..) };
292312
buf.iter()
293-
.take_while(|&&c| c >= b'0' && c <= b'7')
294-
.fold(0, |r, &c| r * 8 + u32::from(c - b'0'))
313+
.take_while(is_octal_digit)
314+
.fold(0, octal_reducer_u32)
295315
}
296316
}
297317

@@ -659,8 +679,8 @@ impl<'a> PatchReader<'a> {
659679

660680
fn parse_usize(buf: &[u8]) -> usize {
661681
buf.iter()
662-
.take_while(|&&c| c >= b'0' && c <= b'9')
663-
.fold(0, |r, &c| r * 10 + usize::from(c - b'0'))
682+
.take_while(is_digit)
683+
.fold(0, decimal_reducer_usize)
664684
}
665685

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

0 commit comments

Comments
 (0)