| 2411 | // Parses fill and alignment. |
| 2412 | template <typename Char, typename Handler> |
| 2413 | FMT_CONSTEXPR const Char* parse_align(const Char* begin, const Char* end, |
| 2414 | Handler&& handler) { |
| 2415 | FMT_ASSERT(begin != end, ""); |
| 2416 | auto align = align::none; |
| 2417 | auto p = next_code_point(begin, end); |
| 2418 | if (p == end) p = begin; |
| 2419 | for (;;) { |
| 2420 | switch (static_cast<char>(*p)) { |
| 2421 | case '<': |
| 2422 | align = align::left; |
| 2423 | break; |
| 2424 | case '>': |
| 2425 | align = align::right; |
| 2426 | break; |
| 2427 | #if FMT_NUMERIC_ALIGN |
| 2428 | case '=': |
| 2429 | align = align::numeric; |
| 2430 | break; |
| 2431 | #endif |
| 2432 | case '^': |
| 2433 | align = align::center; |
| 2434 | break; |
| 2435 | } |
| 2436 | if (align != align::none) { |
| 2437 | if (p != begin) { |
| 2438 | auto c = *begin; |
| 2439 | if (c == '{') |
| 2440 | return handler.on_error("invalid fill character '{'"), begin; |
| 2441 | handler.on_fill(basic_string_view<Char>(begin, to_unsigned(p - begin))); |
| 2442 | begin = p + 1; |
| 2443 | } else |
| 2444 | ++begin; |
| 2445 | handler.on_align(align); |
| 2446 | break; |
| 2447 | } else if (p == begin) { |
| 2448 | break; |
| 2449 | } |
| 2450 | p = begin; |
| 2451 | } |
| 2452 | return begin; |
| 2453 | } |
| 2454 | |
| 2455 | template <typename Char, typename Handler> |
| 2456 | FMT_CONSTEXPR const Char* parse_width(const Char* begin, const Char* end, |
no test coverage detected