! @param[in] j JSON value to serialize */
| 11355 | @param[in] j JSON value to serialize |
| 11356 | */ |
| 11357 | void write_cbor(const BasicJsonType& j) |
| 11358 | { |
| 11359 | switch (j.type()) |
| 11360 | { |
| 11361 | case value_t::null: |
| 11362 | { |
| 11363 | oa->write_character(to_char_type(0xF6)); |
| 11364 | break; |
| 11365 | } |
| 11366 | |
| 11367 | case value_t::boolean: |
| 11368 | { |
| 11369 | oa->write_character(j.m_value.boolean |
| 11370 | ? to_char_type(0xF5) |
| 11371 | : to_char_type(0xF4)); |
| 11372 | break; |
| 11373 | } |
| 11374 | |
| 11375 | case value_t::number_integer: |
| 11376 | { |
| 11377 | if (j.m_value.number_integer >= 0) |
| 11378 | { |
| 11379 | // CBOR does not differentiate between positive signed |
| 11380 | // integers and unsigned integers. Therefore, we used the |
| 11381 | // code from the value_t::number_unsigned case here. |
| 11382 | if (j.m_value.number_integer <= 0x17) |
| 11383 | { |
| 11384 | write_number(static_cast<std::uint8_t>(j.m_value.number_integer)); |
| 11385 | } |
| 11386 | else if (j.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)()) |
| 11387 | { |
| 11388 | oa->write_character(to_char_type(0x18)); |
| 11389 | write_number(static_cast<std::uint8_t>(j.m_value.number_integer)); |
| 11390 | } |
| 11391 | else if (j.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)()) |
| 11392 | { |
| 11393 | oa->write_character(to_char_type(0x19)); |
| 11394 | write_number(static_cast<std::uint16_t>(j.m_value.number_integer)); |
| 11395 | } |
| 11396 | else if (j.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)()) |
| 11397 | { |
| 11398 | oa->write_character(to_char_type(0x1A)); |
| 11399 | write_number(static_cast<std::uint32_t>(j.m_value.number_integer)); |
| 11400 | } |
| 11401 | else |
| 11402 | { |
| 11403 | oa->write_character(to_char_type(0x1B)); |
| 11404 | write_number(static_cast<std::uint64_t>(j.m_value.number_integer)); |
| 11405 | } |
| 11406 | } |
| 11407 | else |
| 11408 | { |
| 11409 | // The conversions below encode the sign in the first |
| 11410 | // byte, and the value is converted to a positive number. |
| 11411 | const auto positive_number = -1 - j.m_value.number_integer; |
| 11412 | if (j.m_value.number_integer >= -24) |
| 11413 | { |
| 11414 | write_number(static_cast<std::uint8_t>(0x20 + positive_number)); |
no test coverage detected