Rollup merge of #128641 - Konippi:standardize-duplicate-processes-in-parser, r=scottmcm
refactor: standardize duplicate processes in parser ## Summary This PR refactors the `read_number` function to standardize duplicate code, improve readability, and enhance efficiency. ## Changes - Merged the logic for both `max_digits` cases into a single `read_atomically` closure - Simplified control flow and reduced code duplication
This commit is contained in:
commit
da65b9064f
@ -112,18 +112,18 @@ fn read_number<T: ReadNumberHelper + TryFrom<u32>>(
|
||||
max_digits: Option<usize>,
|
||||
allow_zero_prefix: bool,
|
||||
) -> Option<T> {
|
||||
// If max_digits.is_some(), then we are parsing a `u8` or `u16` and
|
||||
// don't need to use checked arithmetic since it fits within a `u32`.
|
||||
if let Some(max_digits) = max_digits {
|
||||
// u32::MAX = 4_294_967_295u32, which is 10 digits long.
|
||||
// `max_digits` must be less than 10 to not overflow a `u32`.
|
||||
debug_assert!(max_digits < 10);
|
||||
self.read_atomically(move |p| {
|
||||
let mut digit_count = 0;
|
||||
let has_leading_zero = p.peek_char() == Some('0');
|
||||
|
||||
// If max_digits.is_some(), then we are parsing a `u8` or `u16` and
|
||||
// don't need to use checked arithmetic since it fits within a `u32`.
|
||||
let result = if let Some(max_digits) = max_digits {
|
||||
// u32::MAX = 4_294_967_295u32, which is 10 digits long.
|
||||
// `max_digits` must be less than 10 to not overflow a `u32`.
|
||||
debug_assert!(max_digits < 10);
|
||||
|
||||
self.read_atomically(move |p| {
|
||||
let mut result = 0_u32;
|
||||
let mut digit_count = 0;
|
||||
let has_leading_zero = p.peek_char() == Some('0');
|
||||
|
||||
while let Some(digit) = p.read_atomically(|p| p.read_char()?.to_digit(radix)) {
|
||||
result *= radix;
|
||||
result += digit;
|
||||
@ -134,19 +134,9 @@ fn read_number<T: ReadNumberHelper + TryFrom<u32>>(
|
||||
}
|
||||
}
|
||||
|
||||
if digit_count == 0 {
|
||||
None
|
||||
} else if !allow_zero_prefix && has_leading_zero && digit_count > 1 {
|
||||
None
|
||||
} else {
|
||||
result.try_into().ok()
|
||||
}
|
||||
})
|
||||
} else {
|
||||
self.read_atomically(move |p| {
|
||||
result.try_into().ok()
|
||||
} else {
|
||||
let mut result = T::ZERO;
|
||||
let mut digit_count = 0;
|
||||
let has_leading_zero = p.peek_char() == Some('0');
|
||||
|
||||
while let Some(digit) = p.read_atomically(|p| p.read_char()?.to_digit(radix)) {
|
||||
result = result.checked_mul(radix)?;
|
||||
@ -154,15 +144,17 @@ fn read_number<T: ReadNumberHelper + TryFrom<u32>>(
|
||||
digit_count += 1;
|
||||
}
|
||||
|
||||
if digit_count == 0 {
|
||||
None
|
||||
} else if !allow_zero_prefix && has_leading_zero && digit_count > 1 {
|
||||
None
|
||||
} else {
|
||||
Some(result)
|
||||
}
|
||||
})
|
||||
}
|
||||
Some(result)
|
||||
};
|
||||
|
||||
if digit_count == 0 {
|
||||
None
|
||||
} else if !allow_zero_prefix && has_leading_zero && digit_count > 1 {
|
||||
None
|
||||
} else {
|
||||
result
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/// Reads an IPv4 address.
|
||||
|
Loading…
Reference in New Issue
Block a user