| 71 | } |
| 72 | |
| 73 | void |
| 74 | serialize_cbor_value( const value& jv, std::vector<unsigned char>& out ) |
| 75 | { |
| 76 | switch( jv.kind() ) |
| 77 | { |
| 78 | case kind::null: |
| 79 | out.push_back( 224 + 22 ); |
| 80 | break; |
| 81 | |
| 82 | case kind::bool_: |
| 83 | out.push_back( 224 + 20 + jv.get_bool() ); |
| 84 | break; |
| 85 | |
| 86 | case kind::int64: |
| 87 | { |
| 88 | std::int64_t n = jv.get_int64(); |
| 89 | if( n >= 0 ) |
| 90 | serialize_cbor_number( 0, n, out ); |
| 91 | else |
| 92 | serialize_cbor_number( 1, ~n, out ); |
| 93 | } |
| 94 | break; |
| 95 | |
| 96 | case kind::uint64: |
| 97 | serialize_cbor_number( 0, jv.get_uint64(), out ); |
| 98 | break; |
| 99 | |
| 100 | case kind::double_: |
| 101 | { |
| 102 | unsigned char data[ 9 ]; |
| 103 | data[ 0 ] = 224 + 27; |
| 104 | boost::endian::endian_store<double, 8, boost::endian::order::big>( data + 1, jv.get_double() ); |
| 105 | |
| 106 | out.insert( out.end(), std::begin(data), std::end(data) ); |
| 107 | } |
| 108 | break; |
| 109 | |
| 110 | case kind::string: |
| 111 | serialize_cbor_string( jv.get_string(), out ); |
| 112 | break; |
| 113 | |
| 114 | case kind::array: |
| 115 | { |
| 116 | const array& ja = jv.get_array(); |
| 117 | std::size_t n = ja.size(); |
| 118 | |
| 119 | out.reserve( out.size() + n + 1 ); |
| 120 | |
| 121 | serialize_cbor_number( 4, n, out ); |
| 122 | |
| 123 | for( std::size_t i = 0; i < n; ++i ) |
| 124 | serialize_cbor_value( ja[i], out ); |
| 125 | } |
| 126 | break; |
| 127 | |
| 128 | case kind::object: |
| 129 | { |
| 130 | const object& jo = jv.get_object(); |
no test coverage detected