| 1381 | // Parses integer | "{" [arg_id] "}". |
| 1382 | template <typename Char> |
| 1383 | FMT_CONSTEXPR auto parse_dynamic_spec(const Char* begin, const Char* end, |
| 1384 | int& value, arg_ref<Char>& ref, |
| 1385 | parse_context<Char>& ctx) |
| 1386 | -> parse_dynamic_spec_result<Char> { |
| 1387 | FMT_ASSERT(begin != end, ""); |
| 1388 | auto kind = arg_id_kind::none; |
| 1389 | if ('0' <= *begin && *begin <= '9') { |
| 1390 | int val = parse_nonnegative_int(begin, end, -1); |
| 1391 | if (val == -1) report_error("number is too big"); |
| 1392 | value = val; |
| 1393 | } else { |
| 1394 | if (*begin == '{') { |
| 1395 | ++begin; |
| 1396 | if (begin != end) { |
| 1397 | Char c = *begin; |
| 1398 | if (c == '}' || c == ':') { |
| 1399 | int id = ctx.next_arg_id(); |
| 1400 | ref = id; |
| 1401 | kind = arg_id_kind::index; |
| 1402 | ctx.check_dynamic_spec(id); |
| 1403 | } else { |
| 1404 | begin = parse_arg_id(begin, end, |
| 1405 | dynamic_spec_handler<Char>{ctx, ref, kind}); |
| 1406 | } |
| 1407 | } |
| 1408 | if (begin != end && *begin == '}') return {++begin, kind}; |
| 1409 | } |
| 1410 | report_error("invalid format string"); |
| 1411 | } |
| 1412 | return {begin, kind}; |
| 1413 | } |
| 1414 | |
| 1415 | template <typename Char> |
| 1416 | FMT_CONSTEXPR auto parse_width(const Char* begin, const Char* end, |
no test coverage detected