! @param[in] j JSON value to serialize */
| 15002 | @param[in] j JSON value to serialize |
| 15003 | */ |
| 15004 | void write_cbor(const BasicJsonType& j) |
| 15005 | { |
| 15006 | switch (j.type()) |
| 15007 | { |
| 15008 | case value_t::null: |
| 15009 | { |
| 15010 | oa->write_character(to_char_type(0xF6)); |
| 15011 | break; |
| 15012 | } |
| 15013 | |
| 15014 | case value_t::boolean: |
| 15015 | { |
| 15016 | oa->write_character(j.m_value.boolean |
| 15017 | ? to_char_type(0xF5) |
| 15018 | : to_char_type(0xF4)); |
| 15019 | break; |
| 15020 | } |
| 15021 | |
| 15022 | case value_t::number_integer: |
| 15023 | { |
| 15024 | if (j.m_value.number_integer >= 0) |
| 15025 | { |
| 15026 | // CBOR does not differentiate between positive signed |
| 15027 | // integers and unsigned integers. Therefore, we used the |
| 15028 | // code from the value_t::number_unsigned case here. |
| 15029 | if (j.m_value.number_integer <= 0x17) |
| 15030 | { |
| 15031 | write_number(static_cast<std::uint8_t>(j.m_value.number_integer)); |
| 15032 | } |
| 15033 | else if (j.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)()) |
| 15034 | { |
| 15035 | oa->write_character(to_char_type(0x18)); |
| 15036 | write_number(static_cast<std::uint8_t>(j.m_value.number_integer)); |
| 15037 | } |
| 15038 | else if (j.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)()) |
| 15039 | { |
| 15040 | oa->write_character(to_char_type(0x19)); |
| 15041 | write_number(static_cast<std::uint16_t>(j.m_value.number_integer)); |
| 15042 | } |
| 15043 | else if (j.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)()) |
| 15044 | { |
| 15045 | oa->write_character(to_char_type(0x1A)); |
| 15046 | write_number(static_cast<std::uint32_t>(j.m_value.number_integer)); |
| 15047 | } |
| 15048 | else |
| 15049 | { |
| 15050 | oa->write_character(to_char_type(0x1B)); |
| 15051 | write_number(static_cast<std::uint64_t>(j.m_value.number_integer)); |
| 15052 | } |
| 15053 | } |
| 15054 | else |
| 15055 | { |
| 15056 | // The conversions below encode the sign in the first |
| 15057 | // byte, and the value is converted to a positive number. |
| 15058 | const auto positive_number = -1 - j.m_value.number_integer; |
| 15059 | if (j.m_value.number_integer >= -24) |
| 15060 | { |
| 15061 | write_number(static_cast<std::uint8_t>(0x20 + positive_number)); |
no test coverage detected