30 #ifndef _PARSE_NUMBERS_H
31 #define _PARSE_NUMBERS_H 1
33 #pragma GCC system_header
37 #if __cplusplus > 201103L
39 namespace std _GLIBCXX_VISIBILITY(default)
41 _GLIBCXX_BEGIN_NAMESPACE_VERSION
43 namespace __parse_int {
45 template<
unsigned _Base,
char _Dig>
48 template<
unsigned _Base>
49 struct _Digit<_Base, '0'>
51 static constexpr
bool valid{
true};
52 static constexpr
unsigned value{0};
55 template<
unsigned _Base>
56 struct _Digit<_Base, '1'>
58 static constexpr
bool valid{
true};
59 static constexpr
unsigned value{1};
62 template<
unsigned _Base>
63 struct _Digit<_Base, '2'>
65 static_assert(_Base > 2,
"invalid digit");
66 static constexpr
bool valid{
true};
67 static constexpr
unsigned value{2};
70 template<
unsigned _Base>
71 struct _Digit<_Base, '3'>
73 static_assert(_Base > 3,
"invalid digit");
74 static constexpr
bool valid{
true};
75 static constexpr
unsigned value{3};
78 template<
unsigned _Base>
79 struct _Digit<_Base, '4'>
81 static_assert(_Base > 4,
"invalid digit");
82 static constexpr
bool valid{
true};
83 static constexpr
unsigned value{4};
86 template<
unsigned _Base>
87 struct _Digit<_Base, '5'>
89 static_assert(_Base > 5,
"invalid digit");
90 static constexpr
bool valid{
true};
91 static constexpr
unsigned value{5};
94 template<
unsigned _Base>
95 struct _Digit<_Base, '6'>
97 static_assert(_Base > 6,
"invalid digit");
98 static constexpr
bool valid{
true};
99 static constexpr
unsigned value{6};
102 template<
unsigned _Base>
103 struct _Digit<_Base, '7'>
105 static_assert(_Base > 7,
"invalid digit");
106 static constexpr
bool valid{
true};
107 static constexpr
unsigned value{7};
110 template<
unsigned _Base>
111 struct _Digit<_Base, '8'>
113 static_assert(_Base > 8,
"invalid digit");
114 static constexpr
bool valid{
true};
115 static constexpr
unsigned value{8};
118 template<
unsigned _Base>
119 struct _Digit<_Base, '9'>
121 static_assert(_Base > 9,
"invalid digit");
122 static constexpr
bool valid{
true};
123 static constexpr
unsigned value{9};
126 template<
unsigned _Base>
127 struct _Digit<_Base, 'a'>
129 static_assert(_Base > 0xa,
"invalid digit");
130 static constexpr
bool valid{
true};
131 static constexpr
unsigned value{0xa};
134 template<
unsigned _Base>
135 struct _Digit<_Base, 'A'>
137 static_assert(_Base > 0xa,
"invalid digit");
138 static constexpr
bool valid{
true};
139 static constexpr
unsigned value{0xa};
142 template<
unsigned _Base>
143 struct _Digit<_Base, 'b'>
145 static_assert(_Base > 0xb,
"invalid digit");
146 static constexpr
bool valid{
true};
147 static constexpr
unsigned value{0xb};
150 template<
unsigned _Base>
151 struct _Digit<_Base, 'B'>
153 static_assert(_Base > 0xb,
"invalid digit");
154 static constexpr
bool valid{
true};
155 static constexpr
unsigned value{0xb};
158 template<
unsigned _Base>
159 struct _Digit<_Base, 'c'>
161 static_assert(_Base > 0xc,
"invalid digit");
162 static constexpr
bool valid{
true};
163 static constexpr
unsigned value{0xc};
166 template<
unsigned _Base>
167 struct _Digit<_Base, 'C'>
169 static_assert(_Base > 0xc,
"invalid digit");
170 static constexpr
bool valid{
true};
171 static constexpr
unsigned value{0xc};
174 template<
unsigned _Base>
175 struct _Digit<_Base, 'd'>
177 static_assert(_Base > 0xd,
"invalid digit");
178 static constexpr
bool valid{
true};
179 static constexpr
unsigned value{0xd};
182 template<
unsigned _Base>
183 struct _Digit<_Base, 'D'>
185 static_assert(_Base > 0xd,
"invalid digit");
186 static constexpr
bool valid{
true};
187 static constexpr
unsigned value{0xd};
190 template<
unsigned _Base>
191 struct _Digit<_Base, 'e'>
193 static_assert(_Base > 0xe,
"invalid digit");
194 static constexpr
bool valid{
true};
195 static constexpr
unsigned value{0xe};
198 template<
unsigned _Base>
199 struct _Digit<_Base, 'E'>
201 static_assert(_Base > 0xe,
"invalid digit");
202 static constexpr
bool valid{
true};
203 static constexpr
unsigned value{0xe};
206 template<
unsigned _Base>
207 struct _Digit<_Base, 'f'>
209 static_assert(_Base > 0xf,
"invalid digit");
210 static constexpr
bool valid{
true};
211 static constexpr
unsigned value{0xf};
214 template<
unsigned _Base>
215 struct _Digit<_Base, 'F'>
217 static_assert(_Base > 0xf,
"invalid digit");
218 static constexpr
bool valid{
true};
219 static constexpr
unsigned value{0xf};
223 template<
unsigned _Base>
224 struct _Digit<_Base, '\''>
226 static constexpr
bool valid{
false};
227 static constexpr
unsigned value{0};
233 template<
unsigned _Base,
char _Dig,
char... _Digs>
236 static constexpr
unsigned
237 value{_Digit<_Base, _Dig>::valid ?
238 1U + _Digits_help<_Base, _Digs...>::value :
239 _Digits_help<_Base, _Digs...>::value};
242 template<
unsigned _Base,
char _Dig>
243 struct _Digits_help<_Base, _Dig>
245 static constexpr
unsigned value{_Digit<_Base, _Dig>::valid ? 1U : 0U};
248 template<
unsigned _Base,
char... _Digs>
251 static constexpr
unsigned value{_Digits_help<_Base, _Digs...>::value};
254 template<
unsigned _Base>
255 struct _Digits<_Base>
257 static constexpr
unsigned value{0U};
262 template<
unsigned _Base,
char _Dig,
char... _Digs>
265 static constexpr
unsigned
266 value{_Digit<_Base, _Dig>::valid ?
267 _Base * _Power_help<_Base, _Digs...>::value :
268 _Power_help<_Base, _Digs...>::value};
271 template<
unsigned _Base,
char _Dig>
272 struct _Power_help<_Base, _Dig>
274 static constexpr
unsigned value{_Digit<_Base, _Dig>::valid ? 1U : 0U};
277 template<
unsigned _Base,
char... _Digs>
280 static constexpr
unsigned value{_Power_help<_Base, _Digs...>::value};
283 template<
unsigned _Base>
286 static constexpr
unsigned value{0U};
291 template<
unsigned _Base,
unsigned _Pow,
char _Dig,
char... _Digs>
294 static constexpr
unsigned
295 value{_Digit<_Base, _Dig>::valid ?
296 _Pow * _Digit<_Base, _Dig>::value
297 + _Number_help<_Base, _Pow / _Base, _Digs...>::value :
298 _Number_help<_Base, _Pow, _Digs...>::value};
301 template<
unsigned _Base,
unsigned _Pow,
char _Dig>
302 struct _Number_help<_Base, _Pow, _Dig>
305 static constexpr
unsigned
306 value{_Digit<_Base, _Dig>::valid ? _Digit<_Base, _Dig>::value : 0U};
309 template<
unsigned _Base,
char... _Digs>
312 static constexpr
unsigned
313 value{_Number_help<_Base, _Power<_Base, _Digs...>::value,
317 template<
unsigned _Base>
318 struct _Number<_Base>
320 static constexpr
unsigned value{0U};
326 template<
char... _Digs>
329 template<
char... _Digs>
330 struct _Parse_int<'0', 'b', _Digs...>
332 static constexpr
unsigned long long
333 value{_Number<2U, _Digs...>::value};
336 template<
char... _Digs>
337 struct _Parse_int<'0', 'B', _Digs...>
339 static constexpr
unsigned long long
340 value{_Number<2U, _Digs...>::value};
343 template<
char... _Digs>
344 struct _Parse_int<'0', 'x', _Digs...>
346 static constexpr
unsigned long long
347 value{_Number<16U, _Digs...>::value};
350 template<
char... _Digs>
351 struct _Parse_int<'0', 'X', _Digs...>
353 static constexpr
unsigned long long
354 value{_Number<16U, _Digs...>::value};
357 template<
char... _Digs>
358 struct _Parse_int<'0', _Digs...>
360 static constexpr
unsigned long long
361 value{_Number<8U, _Digs...>::value};
364 template<
char... _Digs>
367 static constexpr
unsigned long long
368 value{_Number<10U, _Digs...>::value};
374 namespace __select_int {
376 template<
unsigned long long _Val,
typename... _Ints>
377 struct _Select_int_base;
379 template<
unsigned long long _Val,
typename _IntType,
typename... _Ints>
380 struct _Select_int_base<_Val, _IntType, _Ints...>
385 _Val <= static_cast<unsigned long long>
386 (std::numeric_limits<_IntType>::max()),
388 typename _Select_int_base<_Val, _Ints...>::value_type
394 template<unsigned long long _Val>
395 struct _Select_int_base<_Val> : integral_constant<unsigned long long, _Val>
398 template<char... _Digs>
401 __parse_int::_Parse_int<_Digs...>::value,
412 _GLIBCXX_END_NAMESPACE_VERSION