| 11745 | // not exist |
| 11746 | |
| 11747 | bool get_ubjson_high_precision_number() |
| 11748 | { |
| 11749 | // get size of following number string |
| 11750 | std::size_t size{}; |
| 11751 | bool no_ndarray = true; |
| 11752 | auto res = get_ubjson_size_value(size, no_ndarray); |
| 11753 | if (JSON_HEDLEY_UNLIKELY(!res)) |
| 11754 | { |
| 11755 | return res; |
| 11756 | } |
| 11757 | |
| 11758 | // get number string |
| 11759 | std::vector<char> number_vector; |
| 11760 | for (std::size_t i = 0; i < size; ++i) |
| 11761 | { |
| 11762 | get(); |
| 11763 | if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "number"))) |
| 11764 | { |
| 11765 | return false; |
| 11766 | } |
| 11767 | number_vector.push_back(static_cast<char>(current)); |
| 11768 | } |
| 11769 | |
| 11770 | // parse number string |
| 11771 | using ia_type = decltype(detail::input_adapter(number_vector)); |
| 11772 | auto number_lexer = detail::lexer<BasicJsonType, ia_type>(detail::input_adapter(number_vector), false); |
| 11773 | const auto result_number = number_lexer.scan(); |
| 11774 | const auto number_string = number_lexer.get_token_string(); |
| 11775 | const auto result_remainder = number_lexer.scan(); |
| 11776 | |
| 11777 | using token_type = typename detail::lexer_base<BasicJsonType>::token_type; |
| 11778 | |
| 11779 | if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input)) |
| 11780 | { |
| 11781 | return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, |
| 11782 | exception_message(input_format, concat("invalid number text: ", number_lexer.get_token_string()), "high-precision number"), nullptr)); |
| 11783 | } |
| 11784 | |
| 11785 | switch (result_number) |
| 11786 | { |
| 11787 | case token_type::value_integer: |
| 11788 | return sax->number_integer(number_lexer.get_number_integer()); |
| 11789 | case token_type::value_unsigned: |
| 11790 | return sax->number_unsigned(number_lexer.get_number_unsigned()); |
| 11791 | case token_type::value_float: |
| 11792 | return sax->number_float(number_lexer.get_number_float(), std::move(number_string)); |
| 11793 | case token_type::uninitialized: |
| 11794 | case token_type::literal_true: |
| 11795 | case token_type::literal_false: |
| 11796 | case token_type::literal_null: |
| 11797 | case token_type::value_string: |
| 11798 | case token_type::begin_array: |
| 11799 | case token_type::begin_object: |
| 11800 | case token_type::end_array: |
| 11801 | case token_type::end_object: |
| 11802 | case token_type::name_separator: |
| 11803 | case token_type::value_separator: |
| 11804 | case token_type::parse_error: |
nothing calls this directly
no test coverage detected