! @param[in] j JSON value to serialize */
| 12865 | @param[in] j JSON value to serialize |
| 12866 | */ |
| 12867 | void write_cbor(const BasicJsonType& j) |
| 12868 | { |
| 12869 | switch (j.type()) |
| 12870 | { |
| 12871 | case value_t::null: |
| 12872 | { |
| 12873 | oa->write_character(to_char_type(0xF6)); |
| 12874 | break; |
| 12875 | } |
| 12876 | |
| 12877 | case value_t::boolean: |
| 12878 | { |
| 12879 | oa->write_character(j.m_value.boolean |
| 12880 | ? to_char_type(0xF5) |
| 12881 | : to_char_type(0xF4)); |
| 12882 | break; |
| 12883 | } |
| 12884 | |
| 12885 | case value_t::number_integer: |
| 12886 | { |
| 12887 | if (j.m_value.number_integer >= 0) |
| 12888 | { |
| 12889 | // CBOR does not differentiate between positive signed |
| 12890 | // integers and unsigned integers. Therefore, we used the |
| 12891 | // code from the value_t::number_unsigned case here. |
| 12892 | if (j.m_value.number_integer <= 0x17) |
| 12893 | { |
| 12894 | write_number(static_cast<std::uint8_t>(j.m_value.number_integer)); |
| 12895 | } |
| 12896 | else if (j.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)()) |
| 12897 | { |
| 12898 | oa->write_character(to_char_type(0x18)); |
| 12899 | write_number(static_cast<std::uint8_t>(j.m_value.number_integer)); |
| 12900 | } |
| 12901 | else if (j.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)()) |
| 12902 | { |
| 12903 | oa->write_character(to_char_type(0x19)); |
| 12904 | write_number(static_cast<std::uint16_t>(j.m_value.number_integer)); |
| 12905 | } |
| 12906 | else if (j.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)()) |
| 12907 | { |
| 12908 | oa->write_character(to_char_type(0x1A)); |
| 12909 | write_number(static_cast<std::uint32_t>(j.m_value.number_integer)); |
| 12910 | } |
| 12911 | else |
| 12912 | { |
| 12913 | oa->write_character(to_char_type(0x1B)); |
| 12914 | write_number(static_cast<std::uint64_t>(j.m_value.number_integer)); |
| 12915 | } |
| 12916 | } |
| 12917 | else |
| 12918 | { |
| 12919 | // The conversions below encode the sign in the first |
| 12920 | // byte, and the value is converted to a positive number. |
| 12921 | const auto positive_number = -1 - j.m_value.number_integer; |
| 12922 | if (j.m_value.number_integer >= -24) |
| 12923 | { |
| 12924 | write_number(static_cast<std::uint8_t>(0x20 + positive_number)); |
no test coverage detected