38 template<IntegerMode mode>
43 template<concepts::ParserContext Context>
48 auto parse_digits = [&](
int inferred_radix)
54 if (inferred_radix <= 10) {
66 while (it != sent && valid_digit(*it)) {
79 if (m_radix != 0 && m_radix != 8 && m_radix != 16 && m_radix != 2) {
80 return parse_digits(m_radix);
88 return parse_digits(m_radix == 0 ? 10 : m_radix);
93 return parse_digits(m_radix == 0 ? 10 : m_radix);
99 return parse_digits(10);
105 return parse_digits(8);
110 if (ch == U
'x' || ch == U
'X') {
111 context.advance(++it);
112 return parse_digits(16);
114 if (ch == U
'b' || ch == U
'B') {
115 context.advance(++it);
116 return parse_digits(2);
119 if (ch == U
'o' || ch == U
'O') {
120 context.advance(++it);
121 return parse_digits(8);
123 return parse_digits(m_radix == 0 ? 10 : m_radix);
125 return parse_digits(m_radix == 0 ? 8 : m_radix);
132 template<concepts::Integer T, IntegerMode mode = IntegerMode::Improved>
137 DI_ASSERT(radix == 0 || (radix >= 2 && radix <= 36));
141 return '-'_m ||
'+'_m;
150 auto [sign, number_part] = results;
156 bool negative =
false;
158 if (sign && *sign ==
'-') {
164 if (inferred_radix <= 10) {
176 auto overflow_error = [&] {
188 result *= inferred_radix;
189 result += to_digit(*it);
192 if (result.invalid()) {
195 auto value = *result.value();
198 if (value > max_magnitude) {
201 return static_cast<T
>(negative ? -value : value);
203 return negative ? -value : value;
211template<concepts::Integer T, IntegerMode mode = IntegerMode::Improved>
215 template<concepts::Integer T>
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition parser_base.h:5
constexpr auto parse(Context &context) const -> meta::ParserContextResult< vocab::Tuple< int, meta::Reconstructed< Context, meta::ContainerIterator< Context >, meta::ContainerIterator< Context > > >, Context >
Definition integer.h:44
constexpr MatchIntegerPrefixParser(int radix)
Definition integer.h:41
Definition tuple_forward_declaration.h:5
Definition unexpected.h:14
Definition parser_context.h:12
Definition language.h:238
constexpr auto reconstruct
Definition reconstruct.h:75
constexpr auto end
Definition end.h:47
constexpr auto begin
Definition begin.h:44
Definition json_deserializer.h:532
Definition duration_literals.h:20
constexpr auto to_unsigned
Definition to_unsigned.h:16
Definition zstring_parser.h:9
IntegerError
Definition integer.h:21
@ Underflow
Definition integer.h:23
@ Overflow
Definition integer.h:22
IntegerMode
Mode to use when parsing an integer.
Definition integer.h:32
@ CStandard
Definition integer.h:34
@ Improved
Definition integer.h:33
@ Underflow
Definition zstring_parser.h:21
@ Overflow
Definition zstring_parser.h:20
constexpr auto code_point
Definition code_point_parser.h:35
constexpr auto match_one
Definition match_one.h:27
constexpr auto make_error
Definition make_error.h:19
constexpr auto integer
Definition integer.h:212
char32_t c32
Definition char.h:6
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
constexpr auto make_tuple(Args &&... args)
Definition make_tuple.h:9
Unexpected(E &&) -> Unexpected< meta::UnwrapRefDecay< E > >
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto in_place_type
Definition in_place_type.h:12
Definition numeric_limits.h:7
constexpr auto operator()(int radix=0) const
Definition integer.h:134
Definition in_place_type.h:5