1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use crate::util::*;
use super::shared::*;
macro_rules! add_digit {
($value:ident, $radix:ident, $op:ident, $digit:ident) => {
match $value.checked_mul(as_cast($radix)) {
Some(v) => v.$op(as_cast($digit)),
None => None,
}
};
}
macro_rules! parse_digits_exponent {
($value:ident, $iter:ident, $radix:ident, $op:ident, $default:expr) => (
while let Some(c) = $iter.next() {
let digit = match to_digit(c, $radix) {
Ok(v) => v,
Err(c) => return ($value, c),
};
$value = match add_digit!($value, $radix, $op, digit) {
Some(v) => v,
None => {
if let Some(c) = $iter.find(|&c| is_not_digit_char(*c, $radix)) {
return ($default, c);
}
$default
},
};
}
);
}
perftools_inline!{
pub(crate) fn standalone_exponent<'a, Iter>(mut iter: Iter, radix: u32, sign: Sign)
-> (i32, *const u8)
where Iter: AsPtrIterator<'a, u8>
{
let mut value = 0;
match sign {
Sign::Positive => parse_digits_exponent!(value, iter, radix, checked_add, i32::max_value()),
Sign::Negative => parse_digits_exponent!(value, iter, radix, checked_sub, i32::min_value())
}
(value, iter.as_ptr())
}}