| 232 | } |
| 233 | |
| 234 | const unsigned char* |
| 235 | parse_cbor_array( |
| 236 | const unsigned char* first, const unsigned char* last, unsigned char ch, value& v ) |
| 237 | { |
| 238 | std::uint64_t n; |
| 239 | first = parse_cbor_number( first, last, ch, n ); |
| 240 | |
| 241 | array & a = v.emplace_array(); |
| 242 | |
| 243 | a.resize( n ); |
| 244 | |
| 245 | std::size_t i = 0; |
| 246 | |
| 247 | for( ; i < n; ++i ) // double[] fast path |
| 248 | { |
| 249 | ensure( 1, first, last ); |
| 250 | unsigned char ch2 = *first; |
| 251 | |
| 252 | if( ch2 != 0xFB ) break; |
| 253 | |
| 254 | ++first; |
| 255 | ensure( 8, first, last ); |
| 256 | |
| 257 | double w = boost::endian::endian_load<double, 8, boost::endian::order::big>( first ); |
| 258 | first += 8; |
| 259 | |
| 260 | a[ i ] = w; |
| 261 | } |
| 262 | |
| 263 | for( ; i < n; ++i ) // int[] fast path |
| 264 | { |
| 265 | ensure( 1, first, last ); |
| 266 | unsigned char ch2 = *first; |
| 267 | |
| 268 | if( ch2 >= 0x40 ) break; |
| 269 | |
| 270 | ++first; |
| 271 | |
| 272 | std::uint64_t m; |
| 273 | first = parse_cbor_number( first, last, ch2, m ); |
| 274 | |
| 275 | if( ch2 < 0x20 ) |
| 276 | { |
| 277 | a[ i ] = m; |
| 278 | } |
| 279 | else |
| 280 | { |
| 281 | a[ i ] = static_cast<std::int64_t>( ~m ); |
| 282 | } |
| 283 | } |
| 284 | |
| 285 | for( ; i < n; ++i ) |
| 286 | first = parse_cbor_value( first, last, a[ i ] ); |
| 287 | |
| 288 | return first; |
| 289 | } |
| 290 | |
| 291 | const unsigned char* |
no test coverage detected