1 mod buffer; 2 mod output_target; 3 pub(crate) mod with; 4 5 use std::io; 6 use std::io::Write; 7 use std::mem::MaybeUninit; 8 use std::ptr; 9 use std::slice; 10 11 use crate::byteorder::LITTLE_ENDIAN; 12 use crate::coded_output_stream::buffer::OutputBuffer; 13 use crate::coded_output_stream::output_target::OutputTarget; 14 use crate::error::ProtobufError; 15 use crate::rt::packed::vec_packed_enum_or_unknown_data_size; 16 use crate::rt::packed::vec_packed_fixed_data_size; 17 use crate::rt::packed::vec_packed_varint_data_size; 18 use crate::rt::packed::vec_packed_varint_zigzag_data_size; 19 use crate::varint::encode::encode_varint32; 20 use crate::varint::encode::encode_varint64; 21 use crate::varint::encode::encoded_varint64_len; 22 use crate::varint::MAX_VARINT_ENCODED_LEN; 23 use crate::wire_format; 24 use crate::wire_format::check_message_size; 25 use crate::wire_format::WireType; 26 use crate::wire_format::MAX_MESSAGE_SIZE; 27 use crate::zigzag::encode_zig_zag_32; 28 use crate::zigzag::encode_zig_zag_64; 29 use crate::Enum; 30 use crate::EnumOrUnknown; 31 use crate::Message; 32 use crate::MessageDyn; 33 use crate::MessageFull; 34 use crate::UnknownFields; 35 use crate::UnknownValueRef; 36 37 // Equal to the default buffer size of `BufWriter`, so when 38 // `CodedOutputStream` wraps `BufWriter`, it often skips double buffering. 39 const OUTPUT_STREAM_BUFFER_SIZE: usize = 8 * 1024; 40 41 /// Buffered write with handy utilities 42 #[derive(Debug)] 43 pub struct CodedOutputStream<'a> { 44 target: OutputTarget<'a>, 45 buffer: OutputBuffer, 46 /// Absolute position of the buffer start. 47 pos_of_buffer_start: u64, 48 } 49 50 impl<'a> CodedOutputStream<'a> { 51 /// Construct from given `Write`. 52 /// 53 /// `CodedOutputStream` is buffered even if `Write` is not new(writer: &'a mut dyn Write) -> CodedOutputStream<'a>54 pub fn new(writer: &'a mut dyn Write) -> CodedOutputStream<'a> { 55 let buffer_len = OUTPUT_STREAM_BUFFER_SIZE; 56 57 let mut buffer_storage = Vec::with_capacity(buffer_len); 58 59 // SAFETY: we are not using the `buffer_storage` 60 // except for initializing the `buffer` field. 61 // See `buffer` field documentation. 62 let buffer = OutputBuffer::new(buffer_storage.spare_capacity_mut()); 63 64 CodedOutputStream { 65 target: OutputTarget::Write(writer, buffer_storage), 66 buffer, 67 pos_of_buffer_start: 0, 68 } 69 } 70 71 /// `CodedOutputStream` which writes directly to bytes. 72 /// 73 /// Attempt to write more than bytes capacity results in error. bytes(bytes: &'a mut [u8]) -> CodedOutputStream<'a>74 pub fn bytes(bytes: &'a mut [u8]) -> CodedOutputStream<'a> { 75 // SAFETY: it is safe to cast from &mut [u8] to &mut [MaybeUninit<u8>]. 76 let buffer = 77 ptr::slice_from_raw_parts_mut(bytes.as_mut_ptr() as *mut MaybeUninit<u8>, bytes.len()); 78 let buffer = OutputBuffer::new(buffer); 79 CodedOutputStream { 80 target: OutputTarget::Bytes, 81 buffer, 82 pos_of_buffer_start: 0, 83 } 84 } 85 86 /// `CodedOutputStream` which writes directly to `Vec<u8>`. vec(vec: &'a mut Vec<u8>) -> CodedOutputStream<'a>87 pub fn vec(vec: &'a mut Vec<u8>) -> CodedOutputStream<'a> { 88 let buffer = OutputBuffer::new(vec.spare_capacity_mut()); 89 CodedOutputStream { 90 target: OutputTarget::Vec(vec), 91 buffer, 92 pos_of_buffer_start: 0, 93 } 94 } 95 reserve_additional( &mut self, additional: u32, message: &str, ) -> crate::Result<()>96 pub(crate) fn reserve_additional( 97 &mut self, 98 additional: u32, 99 message: &str, 100 ) -> crate::Result<()> { 101 if additional as usize <= self.buffer.unfilled_len() { 102 return Ok(()); 103 } 104 match &mut self.target { 105 OutputTarget::Write(..) => Ok(()), 106 OutputTarget::Vec(v) => { 107 let reserve = (additional as usize) 108 .checked_add(self.buffer.pos_within_buf()) 109 .unwrap(); 110 v.reserve(reserve); 111 // `pos_within_buf` remains unchanged. 112 self.buffer.replace_buffer_keep_pos(v.spare_capacity_mut()); 113 Ok(()) 114 } 115 OutputTarget::Bytes => { 116 Err(ProtobufError::BufferHasNotEnoughCapacity(message.to_owned()).into()) 117 } 118 } 119 } 120 reserve_additional_for_length_delimited( &mut self, size: u32, message: &str, ) -> crate::Result<()>121 pub(crate) fn reserve_additional_for_length_delimited( 122 &mut self, 123 size: u32, 124 message: &str, 125 ) -> crate::Result<()> { 126 debug_assert!( 127 size <= MAX_MESSAGE_SIZE as u32, 128 "Caller of this function is responsible to guarantee \ 129 that message size does not exceed; size: {}, MAX_MESSAGE_SIZE: {}", 130 size, 131 MAX_MESSAGE_SIZE, 132 ); 133 let reserve = size + encoded_varint64_len(size as u64) as u32; 134 self.reserve_additional(reserve, message) 135 } 136 137 /// Total number of bytes written to this stream. 138 /// 139 /// This number may be larger than the actual number of bytes written to the underlying stream, 140 /// if the buffer was not flushed. 141 /// 142 /// The number may be inaccurate if there was an error during the write. total_bytes_written(&self) -> u64143 pub fn total_bytes_written(&self) -> u64 { 144 self.pos_of_buffer_start + self.buffer.pos_within_buf() as u64 145 } 146 147 /// Check if EOF is reached. 148 /// 149 /// # Panics 150 /// 151 /// If underlying write has no EOF check_eof(&self)152 pub fn check_eof(&self) { 153 match self.target { 154 OutputTarget::Bytes => { 155 assert_eq!( 156 self.buffer.buffer().len() as u64, 157 self.buffer.pos_within_buf() as u64 158 ); 159 } 160 OutputTarget::Write(..) | OutputTarget::Vec(..) => { 161 panic!("must not be called with Writer or Vec"); 162 } 163 } 164 } 165 refresh_buffer(&mut self) -> crate::Result<()>166 fn refresh_buffer(&mut self) -> crate::Result<()> { 167 match self.target { 168 OutputTarget::Write(ref mut write, _) => { 169 write.write_all(self.buffer.filled())?; 170 self.pos_of_buffer_start += self.buffer.pos_within_buf() as u64; 171 self.buffer.rewind(); 172 } 173 OutputTarget::Vec(ref mut vec) => unsafe { 174 let vec_len = vec.len(); 175 assert!(vec_len + self.buffer.pos_within_buf() <= vec.capacity()); 176 vec.set_len(vec_len + self.buffer.pos_within_buf()); 177 vec.reserve(1); 178 self.pos_of_buffer_start += self.buffer.pos_within_buf() as u64; 179 self.buffer = OutputBuffer::new(vec.spare_capacity_mut()); 180 }, 181 OutputTarget::Bytes => { 182 return Err(ProtobufError::IoError(io::Error::new( 183 io::ErrorKind::Other, 184 "given slice is too small to serialize the message", 185 )) 186 .into()); 187 } 188 } 189 Ok(()) 190 } 191 192 /// Flush to buffer to the underlying buffer. 193 /// Note that `CodedOutputStream` does `flush` in the destructor, 194 /// however, if `flush` in destructor fails, then destructor panics 195 /// and program terminates. So it's advisable to explicitly call flush 196 /// before destructor. flush(&mut self) -> crate::Result<()>197 pub fn flush(&mut self) -> crate::Result<()> { 198 match &mut self.target { 199 OutputTarget::Bytes => Ok(()), 200 OutputTarget::Vec(vec) => { 201 let vec_len = vec.len(); 202 assert!(vec_len + self.buffer.pos_within_buf() <= vec.capacity()); 203 unsafe { 204 vec.set_len(vec_len + self.buffer.pos_within_buf()); 205 } 206 self.pos_of_buffer_start += self.buffer.pos_within_buf() as u64; 207 self.buffer = OutputBuffer::new(vec.spare_capacity_mut()); 208 Ok(()) 209 } 210 OutputTarget::Write(..) => self.refresh_buffer(), 211 } 212 } 213 214 /// Write a byte write_raw_byte(&mut self, byte: u8) -> crate::Result<()>215 pub fn write_raw_byte(&mut self, byte: u8) -> crate::Result<()> { 216 if self.buffer.unfilled_len() == 0 { 217 self.refresh_buffer()?; 218 } 219 unsafe { self.buffer.write_byte(byte) }; 220 Ok(()) 221 } 222 223 /// Write bytes write_raw_bytes(&mut self, bytes: &[u8]) -> crate::Result<()>224 pub fn write_raw_bytes(&mut self, bytes: &[u8]) -> crate::Result<()> { 225 if bytes.len() <= self.buffer.unfilled_len() { 226 // SAFETY: we've just checked that there's enough space in the buffer. 227 unsafe { self.buffer.write_bytes(bytes) }; 228 return Ok(()); 229 } 230 231 self.refresh_buffer()?; 232 233 assert!(self.buffer.pos_within_buf() == 0); 234 235 if bytes.len() <= self.buffer.unfilled_len() { 236 // SAFETY: we've just checked that there's enough space in the buffer. 237 unsafe { self.buffer.write_bytes(bytes) }; 238 return Ok(()); 239 } 240 241 match self.target { 242 OutputTarget::Bytes => { 243 unreachable!(); 244 } 245 OutputTarget::Write(ref mut write, _) => { 246 write.write_all(bytes)?; 247 } 248 OutputTarget::Vec(ref mut vec) => { 249 assert!(self.buffer.pos_within_buf() == 0); 250 vec.extend(bytes); 251 self.buffer = OutputBuffer::new(vec.spare_capacity_mut()); 252 self.pos_of_buffer_start += bytes.len() as u64; 253 } 254 } 255 Ok(()) 256 } 257 258 /// Write a tag write_tag(&mut self, field_number: u32, wire_type: WireType) -> crate::Result<()>259 pub fn write_tag(&mut self, field_number: u32, wire_type: WireType) -> crate::Result<()> { 260 self.write_raw_varint32(wire_format::Tag::make(field_number, wire_type).value()) 261 } 262 263 /// Write varint write_raw_varint32(&mut self, value: u32) -> crate::Result<()>264 pub fn write_raw_varint32(&mut self, value: u32) -> crate::Result<()> { 265 if self.buffer.unfilled_len() >= 5 { 266 // fast path 267 unsafe { 268 let len = encode_varint32(value, self.buffer.unfilled()); 269 self.buffer.advance(len); 270 }; 271 Ok(()) 272 } else { 273 // slow path 274 let buf = &mut [0u8; 5]; 275 let len = encode_varint32(value, unsafe { 276 slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut MaybeUninit<u8>, buf.len()) 277 }); 278 self.write_raw_bytes(&buf[..len]) 279 } 280 } 281 282 /// Write varint write_raw_varint64(&mut self, value: u64) -> crate::Result<()>283 pub fn write_raw_varint64(&mut self, value: u64) -> crate::Result<()> { 284 if self.buffer.unfilled_len() >= MAX_VARINT_ENCODED_LEN { 285 // fast path 286 unsafe { 287 let len = encode_varint64(value, self.buffer.unfilled()); 288 self.buffer.advance(len); 289 }; 290 Ok(()) 291 } else { 292 // slow path 293 let buf = &mut [0u8; MAX_VARINT_ENCODED_LEN]; 294 let len = encode_varint64(value, unsafe { 295 slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut MaybeUninit<u8>, buf.len()) 296 }); 297 self.write_raw_bytes(&buf[..len]) 298 } 299 } 300 301 /// Write 32-bit integer little endian write_raw_little_endian32(&mut self, value: u32) -> crate::Result<()>302 pub fn write_raw_little_endian32(&mut self, value: u32) -> crate::Result<()> { 303 self.write_raw_bytes(&value.to_le_bytes()) 304 } 305 306 /// Write 64-bit integer little endian write_raw_little_endian64(&mut self, value: u64) -> crate::Result<()>307 pub fn write_raw_little_endian64(&mut self, value: u64) -> crate::Result<()> { 308 self.write_raw_bytes(&value.to_le_bytes()) 309 } 310 311 /// Write `float` write_float_no_tag(&mut self, value: f32) -> crate::Result<()>312 pub fn write_float_no_tag(&mut self, value: f32) -> crate::Result<()> { 313 self.write_raw_little_endian32(value.to_bits()) 314 } 315 316 /// Write `double` write_double_no_tag(&mut self, value: f64) -> crate::Result<()>317 pub fn write_double_no_tag(&mut self, value: f64) -> crate::Result<()> { 318 self.write_raw_little_endian64(value.to_bits()) 319 } 320 321 /// Write `float` field write_float(&mut self, field_number: u32, value: f32) -> crate::Result<()>322 pub fn write_float(&mut self, field_number: u32, value: f32) -> crate::Result<()> { 323 self.write_tag(field_number, WireType::Fixed32)?; 324 self.write_float_no_tag(value)?; 325 Ok(()) 326 } 327 328 /// Write `double` field write_double(&mut self, field_number: u32, value: f64) -> crate::Result<()>329 pub fn write_double(&mut self, field_number: u32, value: f64) -> crate::Result<()> { 330 self.write_tag(field_number, WireType::Fixed64)?; 331 self.write_double_no_tag(value)?; 332 Ok(()) 333 } 334 335 /// Write varint write_uint64_no_tag(&mut self, value: u64) -> crate::Result<()>336 pub fn write_uint64_no_tag(&mut self, value: u64) -> crate::Result<()> { 337 self.write_raw_varint64(value) 338 } 339 340 /// Write varint write_uint32_no_tag(&mut self, value: u32) -> crate::Result<()>341 pub fn write_uint32_no_tag(&mut self, value: u32) -> crate::Result<()> { 342 self.write_raw_varint32(value) 343 } 344 345 /// Write varint write_int64_no_tag(&mut self, value: i64) -> crate::Result<()>346 pub fn write_int64_no_tag(&mut self, value: i64) -> crate::Result<()> { 347 self.write_raw_varint64(value as u64) 348 } 349 350 /// Write varint write_int32_no_tag(&mut self, value: i32) -> crate::Result<()>351 pub fn write_int32_no_tag(&mut self, value: i32) -> crate::Result<()> { 352 self.write_raw_varint64(value as u64) 353 } 354 355 /// Write zigzag varint write_sint64_no_tag(&mut self, value: i64) -> crate::Result<()>356 pub fn write_sint64_no_tag(&mut self, value: i64) -> crate::Result<()> { 357 self.write_uint64_no_tag(encode_zig_zag_64(value)) 358 } 359 360 /// Write zigzag varint write_sint32_no_tag(&mut self, value: i32) -> crate::Result<()>361 pub fn write_sint32_no_tag(&mut self, value: i32) -> crate::Result<()> { 362 self.write_uint32_no_tag(encode_zig_zag_32(value)) 363 } 364 365 /// Write `fixed64` write_fixed64_no_tag(&mut self, value: u64) -> crate::Result<()>366 pub fn write_fixed64_no_tag(&mut self, value: u64) -> crate::Result<()> { 367 self.write_raw_little_endian64(value) 368 } 369 370 /// Write `fixed32` write_fixed32_no_tag(&mut self, value: u32) -> crate::Result<()>371 pub fn write_fixed32_no_tag(&mut self, value: u32) -> crate::Result<()> { 372 self.write_raw_little_endian32(value) 373 } 374 375 /// Write `sfixed64` write_sfixed64_no_tag(&mut self, value: i64) -> crate::Result<()>376 pub fn write_sfixed64_no_tag(&mut self, value: i64) -> crate::Result<()> { 377 self.write_raw_little_endian64(value as u64) 378 } 379 380 /// Write `sfixed32` write_sfixed32_no_tag(&mut self, value: i32) -> crate::Result<()>381 pub fn write_sfixed32_no_tag(&mut self, value: i32) -> crate::Result<()> { 382 self.write_raw_little_endian32(value as u32) 383 } 384 385 /// Write `bool` write_bool_no_tag(&mut self, value: bool) -> crate::Result<()>386 pub fn write_bool_no_tag(&mut self, value: bool) -> crate::Result<()> { 387 self.write_raw_varint32(if value { 1 } else { 0 }) 388 } 389 390 /// Write `enum` write_enum_no_tag(&mut self, value: i32) -> crate::Result<()>391 pub fn write_enum_no_tag(&mut self, value: i32) -> crate::Result<()> { 392 self.write_int32_no_tag(value) 393 } 394 395 /// Write `enum` write_enum_obj_no_tag<E>(&mut self, value: E) -> crate::Result<()> where E: Enum,396 pub fn write_enum_obj_no_tag<E>(&mut self, value: E) -> crate::Result<()> 397 where 398 E: Enum, 399 { 400 self.write_enum_no_tag(value.value()) 401 } 402 403 /// Write `enum` write_enum_or_unknown_no_tag<E>(&mut self, value: EnumOrUnknown<E>) -> crate::Result<()> where E: Enum,404 pub fn write_enum_or_unknown_no_tag<E>(&mut self, value: EnumOrUnknown<E>) -> crate::Result<()> 405 where 406 E: Enum, 407 { 408 self.write_enum_no_tag(value.value()) 409 } 410 411 /// Write unknown value write_unknown_no_tag(&mut self, unknown: UnknownValueRef) -> crate::Result<()>412 pub fn write_unknown_no_tag(&mut self, unknown: UnknownValueRef) -> crate::Result<()> { 413 match unknown { 414 UnknownValueRef::Fixed64(fixed64) => self.write_raw_little_endian64(fixed64), 415 UnknownValueRef::Fixed32(fixed32) => self.write_raw_little_endian32(fixed32), 416 UnknownValueRef::Varint(varint) => self.write_raw_varint64(varint), 417 UnknownValueRef::LengthDelimited(bytes) => self.write_bytes_no_tag(bytes), 418 } 419 } 420 421 /// Write `uint64` field write_uint64(&mut self, field_number: u32, value: u64) -> crate::Result<()>422 pub fn write_uint64(&mut self, field_number: u32, value: u64) -> crate::Result<()> { 423 self.write_tag(field_number, WireType::Varint)?; 424 self.write_uint64_no_tag(value)?; 425 Ok(()) 426 } 427 428 /// Write `uint32` field write_uint32(&mut self, field_number: u32, value: u32) -> crate::Result<()>429 pub fn write_uint32(&mut self, field_number: u32, value: u32) -> crate::Result<()> { 430 self.write_tag(field_number, WireType::Varint)?; 431 self.write_uint32_no_tag(value)?; 432 Ok(()) 433 } 434 435 /// Write `int64` field write_int64(&mut self, field_number: u32, value: i64) -> crate::Result<()>436 pub fn write_int64(&mut self, field_number: u32, value: i64) -> crate::Result<()> { 437 self.write_tag(field_number, WireType::Varint)?; 438 self.write_int64_no_tag(value)?; 439 Ok(()) 440 } 441 442 /// Write `int32` field write_int32(&mut self, field_number: u32, value: i32) -> crate::Result<()>443 pub fn write_int32(&mut self, field_number: u32, value: i32) -> crate::Result<()> { 444 self.write_tag(field_number, WireType::Varint)?; 445 self.write_int32_no_tag(value)?; 446 Ok(()) 447 } 448 449 /// Write `sint64` field write_sint64(&mut self, field_number: u32, value: i64) -> crate::Result<()>450 pub fn write_sint64(&mut self, field_number: u32, value: i64) -> crate::Result<()> { 451 self.write_tag(field_number, WireType::Varint)?; 452 self.write_sint64_no_tag(value)?; 453 Ok(()) 454 } 455 456 /// Write `sint32` field write_sint32(&mut self, field_number: u32, value: i32) -> crate::Result<()>457 pub fn write_sint32(&mut self, field_number: u32, value: i32) -> crate::Result<()> { 458 self.write_tag(field_number, WireType::Varint)?; 459 self.write_sint32_no_tag(value)?; 460 Ok(()) 461 } 462 463 /// Write `fixed64` field write_fixed64(&mut self, field_number: u32, value: u64) -> crate::Result<()>464 pub fn write_fixed64(&mut self, field_number: u32, value: u64) -> crate::Result<()> { 465 self.write_tag(field_number, WireType::Fixed64)?; 466 self.write_fixed64_no_tag(value)?; 467 Ok(()) 468 } 469 470 /// Write `fixed32` field write_fixed32(&mut self, field_number: u32, value: u32) -> crate::Result<()>471 pub fn write_fixed32(&mut self, field_number: u32, value: u32) -> crate::Result<()> { 472 self.write_tag(field_number, WireType::Fixed32)?; 473 self.write_fixed32_no_tag(value)?; 474 Ok(()) 475 } 476 477 /// Write `sfixed64` field write_sfixed64(&mut self, field_number: u32, value: i64) -> crate::Result<()>478 pub fn write_sfixed64(&mut self, field_number: u32, value: i64) -> crate::Result<()> { 479 self.write_tag(field_number, WireType::Fixed64)?; 480 self.write_sfixed64_no_tag(value)?; 481 Ok(()) 482 } 483 484 /// Write `sfixed32` field write_sfixed32(&mut self, field_number: u32, value: i32) -> crate::Result<()>485 pub fn write_sfixed32(&mut self, field_number: u32, value: i32) -> crate::Result<()> { 486 self.write_tag(field_number, WireType::Fixed32)?; 487 self.write_sfixed32_no_tag(value)?; 488 Ok(()) 489 } 490 491 /// Write `bool` field write_bool(&mut self, field_number: u32, value: bool) -> crate::Result<()>492 pub fn write_bool(&mut self, field_number: u32, value: bool) -> crate::Result<()> { 493 self.write_tag(field_number, WireType::Varint)?; 494 self.write_bool_no_tag(value)?; 495 Ok(()) 496 } 497 498 /// Write `enum` field write_enum(&mut self, field_number: u32, value: i32) -> crate::Result<()>499 pub fn write_enum(&mut self, field_number: u32, value: i32) -> crate::Result<()> { 500 self.write_tag(field_number, WireType::Varint)?; 501 self.write_enum_no_tag(value)?; 502 Ok(()) 503 } 504 505 /// Write `enum` field write_enum_obj<E>(&mut self, field_number: u32, value: E) -> crate::Result<()> where E: Enum,506 pub fn write_enum_obj<E>(&mut self, field_number: u32, value: E) -> crate::Result<()> 507 where 508 E: Enum, 509 { 510 self.write_enum(field_number, value.value()) 511 } 512 513 /// Write `enum` field write_enum_or_unknown<E>( &mut self, field_number: u32, value: EnumOrUnknown<E>, ) -> crate::Result<()> where E: Enum,514 pub fn write_enum_or_unknown<E>( 515 &mut self, 516 field_number: u32, 517 value: EnumOrUnknown<E>, 518 ) -> crate::Result<()> 519 where 520 E: Enum, 521 { 522 self.write_enum(field_number, value.value()) 523 } 524 525 /// Write unknown field write_unknown( &mut self, field_number: u32, value: UnknownValueRef, ) -> crate::Result<()>526 pub fn write_unknown( 527 &mut self, 528 field_number: u32, 529 value: UnknownValueRef, 530 ) -> crate::Result<()> { 531 self.write_tag(field_number, value.wire_type())?; 532 self.write_unknown_no_tag(value)?; 533 Ok(()) 534 } 535 536 /// Write unknown fields write_unknown_fields(&mut self, fields: &UnknownFields) -> crate::Result<()>537 pub fn write_unknown_fields(&mut self, fields: &UnknownFields) -> crate::Result<()> { 538 for (number, value) in fields { 539 self.write_unknown(number, value)?; 540 } 541 Ok(()) 542 } 543 544 /// Write unknown fields sorting them by name 545 // TODO: make unknown fields deterministic and remove this. write_unknown_fields_sorted( &mut self, fields: &UnknownFields, ) -> crate::Result<()>546 pub(crate) fn write_unknown_fields_sorted( 547 &mut self, 548 fields: &UnknownFields, 549 ) -> crate::Result<()> { 550 let mut fields: Vec<_> = fields.iter().collect(); 551 fields.sort_by_key(|(n, _)| *n); 552 for (number, value) in fields { 553 self.write_unknown(number, value)?; 554 } 555 Ok(()) 556 } 557 558 /// Write bytes write_bytes_no_tag(&mut self, bytes: &[u8]) -> crate::Result<()>559 pub fn write_bytes_no_tag(&mut self, bytes: &[u8]) -> crate::Result<()> { 560 self.write_raw_varint32(bytes.len() as u32)?; 561 self.write_raw_bytes(bytes)?; 562 Ok(()) 563 } 564 565 /// Write string write_string_no_tag(&mut self, s: &str) -> crate::Result<()>566 pub fn write_string_no_tag(&mut self, s: &str) -> crate::Result<()> { 567 self.write_bytes_no_tag(s.as_bytes()) 568 } 569 570 /// Write message write_message_no_tag<M: Message>(&mut self, msg: &M) -> crate::Result<()>571 pub fn write_message_no_tag<M: Message>(&mut self, msg: &M) -> crate::Result<()> { 572 msg.write_length_delimited_to(self) 573 } 574 575 /// Write dynamic message write_message_no_tag_dyn(&mut self, msg: &dyn MessageDyn) -> crate::Result<()>576 pub fn write_message_no_tag_dyn(&mut self, msg: &dyn MessageDyn) -> crate::Result<()> { 577 let size = msg.compute_size_dyn(); 578 let size = check_message_size(size)?; 579 self.write_raw_varint32(size)?; 580 msg.write_to_dyn(self)?; 581 Ok(()) 582 } 583 584 /// Write `bytes` field write_bytes(&mut self, field_number: u32, bytes: &[u8]) -> crate::Result<()>585 pub fn write_bytes(&mut self, field_number: u32, bytes: &[u8]) -> crate::Result<()> { 586 self.write_tag(field_number, WireType::LengthDelimited)?; 587 self.write_bytes_no_tag(bytes)?; 588 Ok(()) 589 } 590 591 /// Write `string` field write_string(&mut self, field_number: u32, s: &str) -> crate::Result<()>592 pub fn write_string(&mut self, field_number: u32, s: &str) -> crate::Result<()> { 593 self.write_tag(field_number, WireType::LengthDelimited)?; 594 self.write_string_no_tag(s)?; 595 Ok(()) 596 } 597 598 /// Write repeated packed float values. write_repeated_packed_float_no_tag(&mut self, values: &[f32]) -> crate::Result<()>599 pub fn write_repeated_packed_float_no_tag(&mut self, values: &[f32]) -> crate::Result<()> { 600 if LITTLE_ENDIAN { 601 // SAFETY: it is safe to transmute floats to bytes. 602 let bytes = 603 unsafe { slice::from_raw_parts(values.as_ptr() as *const u8, values.len() * 4) }; 604 self.write_raw_bytes(bytes) 605 } else { 606 for v in values { 607 self.write_float_no_tag(*v)?; 608 } 609 Ok(()) 610 } 611 } 612 613 /// Write field header and data for repeated packed float. write_repeated_packed_float( &mut self, field_number: u32, values: &[f32], ) -> crate::Result<()>614 pub fn write_repeated_packed_float( 615 &mut self, 616 field_number: u32, 617 values: &[f32], 618 ) -> crate::Result<()> { 619 if values.is_empty() { 620 return Ok(()); 621 } 622 self.write_tag(field_number, WireType::LengthDelimited)?; 623 let data_size = vec_packed_fixed_data_size(values); 624 self.write_raw_varint32(data_size as u32)?; 625 self.write_repeated_packed_float_no_tag(values)?; 626 Ok(()) 627 } 628 629 /// Write repeated packed double values. write_repeated_packed_double_no_tag(&mut self, values: &[f64]) -> crate::Result<()>630 pub fn write_repeated_packed_double_no_tag(&mut self, values: &[f64]) -> crate::Result<()> { 631 if LITTLE_ENDIAN { 632 // SAFETY: it is safe to transmute doubles to bytes. 633 let bytes = 634 unsafe { slice::from_raw_parts(values.as_ptr() as *const u8, values.len() * 8) }; 635 self.write_raw_bytes(bytes) 636 } else { 637 for v in values { 638 self.write_double_no_tag(*v)?; 639 } 640 Ok(()) 641 } 642 } 643 644 /// Write field header and data for repeated packed double. write_repeated_packed_double( &mut self, field_number: u32, values: &[f64], ) -> crate::Result<()>645 pub fn write_repeated_packed_double( 646 &mut self, 647 field_number: u32, 648 values: &[f64], 649 ) -> crate::Result<()> { 650 if values.is_empty() { 651 return Ok(()); 652 } 653 self.write_tag(field_number, WireType::LengthDelimited)?; 654 let data_size = vec_packed_fixed_data_size(values); 655 self.write_raw_varint32(data_size as u32)?; 656 self.write_repeated_packed_double_no_tag(values)?; 657 Ok(()) 658 } 659 660 /// Write repeated packed fixed32 values. write_repeated_packed_fixed32_no_tag(&mut self, values: &[u32]) -> crate::Result<()>661 pub fn write_repeated_packed_fixed32_no_tag(&mut self, values: &[u32]) -> crate::Result<()> { 662 if LITTLE_ENDIAN { 663 // SAFETY: it is safe to transmute integer to bytes. 664 let bytes = 665 unsafe { slice::from_raw_parts(values.as_ptr() as *const u8, values.len() * 4) }; 666 self.write_raw_bytes(bytes)?; 667 } else { 668 for v in values { 669 self.write_fixed32_no_tag(*v)?; 670 } 671 } 672 Ok(()) 673 } 674 675 /// Write field header and data for repeated packed fixed32. write_repeated_packed_fixed32( &mut self, field_number: u32, values: &[u32], ) -> crate::Result<()>676 pub fn write_repeated_packed_fixed32( 677 &mut self, 678 field_number: u32, 679 values: &[u32], 680 ) -> crate::Result<()> { 681 if values.is_empty() { 682 return Ok(()); 683 } 684 self.write_tag(field_number, WireType::LengthDelimited)?; 685 let data_size = vec_packed_fixed_data_size(values); 686 self.write_raw_varint32(data_size as u32)?; 687 self.write_repeated_packed_fixed32_no_tag(values)?; 688 Ok(()) 689 } 690 691 /// Write repeated packed fixed64 values. write_repeated_packed_fixed64_no_tag(&mut self, values: &[u64]) -> crate::Result<()>692 pub fn write_repeated_packed_fixed64_no_tag(&mut self, values: &[u64]) -> crate::Result<()> { 693 if LITTLE_ENDIAN { 694 // SAFETY: it is safe to transmute integer to bytes. 695 let bytes = 696 unsafe { slice::from_raw_parts(values.as_ptr() as *const u8, values.len() * 8) }; 697 self.write_raw_bytes(bytes)?; 698 } else { 699 for v in values { 700 self.write_fixed64_no_tag(*v)?; 701 } 702 } 703 Ok(()) 704 } 705 706 /// Write field header and data for repeated packed fixed64. write_repeated_packed_fixed64( &mut self, field_number: u32, values: &[u64], ) -> crate::Result<()>707 pub fn write_repeated_packed_fixed64( 708 &mut self, 709 field_number: u32, 710 values: &[u64], 711 ) -> crate::Result<()> { 712 if values.is_empty() { 713 return Ok(()); 714 } 715 self.write_tag(field_number, WireType::LengthDelimited)?; 716 let data_size = vec_packed_fixed_data_size(values); 717 self.write_raw_varint32(data_size as u32)?; 718 self.write_repeated_packed_fixed64_no_tag(values)?; 719 Ok(()) 720 } 721 722 /// Write repeated packed sfixed32 values. write_repeated_packed_sfixed32_no_tag(&mut self, values: &[i32]) -> crate::Result<()>723 pub fn write_repeated_packed_sfixed32_no_tag(&mut self, values: &[i32]) -> crate::Result<()> { 724 if LITTLE_ENDIAN { 725 // SAFETY: it is safe to transmute integer to bytes. 726 let bytes = 727 unsafe { slice::from_raw_parts(values.as_ptr() as *const u8, values.len() * 4) }; 728 self.write_raw_bytes(bytes)?; 729 } else { 730 for v in values { 731 self.write_sfixed32_no_tag(*v)?; 732 } 733 } 734 Ok(()) 735 } 736 737 /// Write field header and data for repeated packed sfixed32. write_repeated_packed_sfixed32( &mut self, field_number: u32, values: &[i32], ) -> crate::Result<()>738 pub fn write_repeated_packed_sfixed32( 739 &mut self, 740 field_number: u32, 741 values: &[i32], 742 ) -> crate::Result<()> { 743 if values.is_empty() { 744 return Ok(()); 745 } 746 self.write_tag(field_number, WireType::LengthDelimited)?; 747 let data_size = vec_packed_fixed_data_size(values); 748 self.write_raw_varint32(data_size as u32)?; 749 self.write_repeated_packed_sfixed32_no_tag(values)?; 750 Ok(()) 751 } 752 753 /// Write repeated packed sfixed64 values. write_repeated_packed_sfixed64_no_tag(&mut self, values: &[i64]) -> crate::Result<()>754 pub fn write_repeated_packed_sfixed64_no_tag(&mut self, values: &[i64]) -> crate::Result<()> { 755 if LITTLE_ENDIAN { 756 // SAFETY: it is safe to transmute integer to bytes. 757 let bytes = 758 unsafe { slice::from_raw_parts(values.as_ptr() as *const u8, values.len() * 8) }; 759 self.write_raw_bytes(bytes)?; 760 } else { 761 for v in values { 762 self.write_sfixed64_no_tag(*v)?; 763 } 764 } 765 Ok(()) 766 } 767 768 /// Write field header and data for repeated packed sfixed64. write_repeated_packed_sfixed64( &mut self, field_number: u32, values: &[i64], ) -> crate::Result<()>769 pub fn write_repeated_packed_sfixed64( 770 &mut self, 771 field_number: u32, 772 values: &[i64], 773 ) -> crate::Result<()> { 774 if values.is_empty() { 775 return Ok(()); 776 } 777 self.write_tag(field_number, WireType::LengthDelimited)?; 778 let data_size = vec_packed_fixed_data_size(values); 779 self.write_raw_varint32(data_size as u32)?; 780 self.write_repeated_packed_sfixed64_no_tag(values)?; 781 Ok(()) 782 } 783 784 /// Write repeated packed int32 values. write_repeated_packed_int32_no_tag(&mut self, values: &[i32]) -> crate::Result<()>785 pub fn write_repeated_packed_int32_no_tag(&mut self, values: &[i32]) -> crate::Result<()> { 786 for v in values { 787 self.write_int32_no_tag(*v)?; 788 } 789 Ok(()) 790 } 791 792 /// Write field header and data for repeated packed int32. write_repeated_packed_int32( &mut self, field_number: u32, values: &[i32], ) -> crate::Result<()>793 pub fn write_repeated_packed_int32( 794 &mut self, 795 field_number: u32, 796 values: &[i32], 797 ) -> crate::Result<()> { 798 if values.is_empty() { 799 return Ok(()); 800 } 801 self.write_tag(field_number, WireType::LengthDelimited)?; 802 let data_size = vec_packed_varint_data_size(values); 803 self.write_raw_varint32(data_size as u32)?; 804 self.write_repeated_packed_int32_no_tag(values)?; 805 Ok(()) 806 } 807 808 /// Write repeated packed int64 values. write_repeated_packed_int64_no_tag(&mut self, values: &[i64]) -> crate::Result<()>809 pub fn write_repeated_packed_int64_no_tag(&mut self, values: &[i64]) -> crate::Result<()> { 810 for v in values { 811 self.write_int64_no_tag(*v)?; 812 } 813 Ok(()) 814 } 815 816 /// Write field header and data for repeated packed int64. write_repeated_packed_int64( &mut self, field_number: u32, values: &[i64], ) -> crate::Result<()>817 pub fn write_repeated_packed_int64( 818 &mut self, 819 field_number: u32, 820 values: &[i64], 821 ) -> crate::Result<()> { 822 if values.is_empty() { 823 return Ok(()); 824 } 825 self.write_tag(field_number, WireType::LengthDelimited)?; 826 let data_size = vec_packed_varint_data_size(values); 827 self.write_raw_varint32(data_size as u32)?; 828 self.write_repeated_packed_int64_no_tag(values)?; 829 Ok(()) 830 } 831 832 /// Write repeated packed uint32 values. write_repeated_packed_uint32_no_tag(&mut self, values: &[u32]) -> crate::Result<()>833 pub fn write_repeated_packed_uint32_no_tag(&mut self, values: &[u32]) -> crate::Result<()> { 834 for v in values { 835 self.write_uint32_no_tag(*v)?; 836 } 837 Ok(()) 838 } 839 840 /// Write field header and data for repeated packed uint32. write_repeated_packed_uint32( &mut self, field_number: u32, values: &[u32], ) -> crate::Result<()>841 pub fn write_repeated_packed_uint32( 842 &mut self, 843 field_number: u32, 844 values: &[u32], 845 ) -> crate::Result<()> { 846 if values.is_empty() { 847 return Ok(()); 848 } 849 self.write_tag(field_number, WireType::LengthDelimited)?; 850 let data_size = vec_packed_varint_data_size(values); 851 self.write_raw_varint32(data_size as u32)?; 852 self.write_repeated_packed_uint32_no_tag(values)?; 853 Ok(()) 854 } 855 856 /// Write repeated packed uint64 values. write_repeated_packed_uint64_no_tag(&mut self, values: &[u64]) -> crate::Result<()>857 pub fn write_repeated_packed_uint64_no_tag(&mut self, values: &[u64]) -> crate::Result<()> { 858 for v in values { 859 self.write_uint64_no_tag(*v)?; 860 } 861 Ok(()) 862 } 863 864 /// Write field header and data for repeated packed uint64. write_repeated_packed_uint64( &mut self, field_number: u32, values: &[u64], ) -> crate::Result<()>865 pub fn write_repeated_packed_uint64( 866 &mut self, 867 field_number: u32, 868 values: &[u64], 869 ) -> crate::Result<()> { 870 if values.is_empty() { 871 return Ok(()); 872 } 873 self.write_tag(field_number, WireType::LengthDelimited)?; 874 let data_size = vec_packed_varint_data_size(values); 875 self.write_raw_varint32(data_size as u32)?; 876 self.write_repeated_packed_uint64_no_tag(values)?; 877 Ok(()) 878 } 879 880 /// Write repeated packed sint32 values. write_repeated_packed_sint32_no_tag(&mut self, values: &[i32]) -> crate::Result<()>881 pub fn write_repeated_packed_sint32_no_tag(&mut self, values: &[i32]) -> crate::Result<()> { 882 for v in values { 883 self.write_sint32_no_tag(*v)?; 884 } 885 Ok(()) 886 } 887 888 /// Write field header and data for repeated packed sint32. write_repeated_packed_sint32( &mut self, field_number: u32, values: &[i32], ) -> crate::Result<()>889 pub fn write_repeated_packed_sint32( 890 &mut self, 891 field_number: u32, 892 values: &[i32], 893 ) -> crate::Result<()> { 894 if values.is_empty() { 895 return Ok(()); 896 } 897 self.write_tag(field_number, WireType::LengthDelimited)?; 898 let data_size = vec_packed_varint_zigzag_data_size(values); 899 self.write_raw_varint32(data_size as u32)?; 900 self.write_repeated_packed_sint32_no_tag(values)?; 901 Ok(()) 902 } 903 904 /// Write repeated packed sint64 values. write_repeated_packed_sint64_no_tag(&mut self, values: &[i64]) -> crate::Result<()>905 pub fn write_repeated_packed_sint64_no_tag(&mut self, values: &[i64]) -> crate::Result<()> { 906 for v in values { 907 self.write_sint64_no_tag(*v)?; 908 } 909 Ok(()) 910 } 911 912 /// Write field header and data for repeated packed sint64. write_repeated_packed_sint64( &mut self, field_number: u32, values: &[i64], ) -> crate::Result<()>913 pub fn write_repeated_packed_sint64( 914 &mut self, 915 field_number: u32, 916 values: &[i64], 917 ) -> crate::Result<()> { 918 if values.is_empty() { 919 return Ok(()); 920 } 921 self.write_tag(field_number, WireType::LengthDelimited)?; 922 let data_size = vec_packed_varint_zigzag_data_size(values); 923 self.write_raw_varint32(data_size as u32)?; 924 self.write_repeated_packed_sint64_no_tag(values)?; 925 Ok(()) 926 } 927 928 /// Write repeated packed bool values. write_repeated_packed_bool_no_tag(&mut self, values: &[bool]) -> crate::Result<()>929 pub fn write_repeated_packed_bool_no_tag(&mut self, values: &[bool]) -> crate::Result<()> { 930 for v in values { 931 self.write_bool_no_tag(*v)?; 932 } 933 Ok(()) 934 } 935 936 /// Write field header and data for repeated packed bool. write_repeated_packed_bool( &mut self, field_number: u32, values: &[bool], ) -> crate::Result<()>937 pub fn write_repeated_packed_bool( 938 &mut self, 939 field_number: u32, 940 values: &[bool], 941 ) -> crate::Result<()> { 942 if values.is_empty() { 943 return Ok(()); 944 } 945 self.write_tag(field_number, WireType::LengthDelimited)?; 946 let data_size = vec_packed_fixed_data_size(values); 947 self.write_raw_varint32(data_size as u32)?; 948 self.write_repeated_packed_bool_no_tag(values)?; 949 Ok(()) 950 } 951 952 /// Write repeated packed enum values. 953 #[inline] write_repeated_packed_enum_or_unknown_no_tag<E: Enum>( &mut self, values: &[EnumOrUnknown<E>], ) -> crate::Result<()>954 pub fn write_repeated_packed_enum_or_unknown_no_tag<E: Enum>( 955 &mut self, 956 values: &[EnumOrUnknown<E>], 957 ) -> crate::Result<()> { 958 self.write_repeated_packed_int32_no_tag(EnumOrUnknown::cast_to_values(values)) 959 } 960 961 /// Write field header and data for repeated packed enum. write_repeated_packed_enum_or_unknown<E: Enum>( &mut self, field_number: u32, values: &[EnumOrUnknown<E>], ) -> crate::Result<()>962 pub fn write_repeated_packed_enum_or_unknown<E: Enum>( 963 &mut self, 964 field_number: u32, 965 values: &[EnumOrUnknown<E>], 966 ) -> crate::Result<()> { 967 if values.is_empty() { 968 return Ok(()); 969 } 970 self.write_tag(field_number, WireType::LengthDelimited)?; 971 let data_size = vec_packed_enum_or_unknown_data_size(values); 972 self.write_raw_varint32(data_size as u32)?; 973 self.write_repeated_packed_enum_or_unknown_no_tag(values)?; 974 Ok(()) 975 } 976 977 /// Write `message` field write_message<M: MessageFull>( &mut self, field_number: u32, msg: &M, ) -> crate::Result<()>978 pub fn write_message<M: MessageFull>( 979 &mut self, 980 field_number: u32, 981 msg: &M, 982 ) -> crate::Result<()> { 983 self.write_tag(field_number, WireType::LengthDelimited)?; 984 self.write_message_no_tag(msg)?; 985 Ok(()) 986 } 987 988 /// Write dynamic `message` field write_message_dyn( &mut self, field_number: u32, msg: &dyn MessageDyn, ) -> crate::Result<()>989 pub fn write_message_dyn( 990 &mut self, 991 field_number: u32, 992 msg: &dyn MessageDyn, 993 ) -> crate::Result<()> { 994 self.write_tag(field_number, WireType::LengthDelimited)?; 995 self.write_message_no_tag_dyn(msg)?; 996 Ok(()) 997 } 998 } 999 1000 impl<'a> Write for CodedOutputStream<'a> { write(&mut self, buf: &[u8]) -> io::Result<usize>1001 fn write(&mut self, buf: &[u8]) -> io::Result<usize> { 1002 self.write_raw_bytes(buf)?; 1003 Ok(buf.len()) 1004 } 1005 flush(&mut self) -> io::Result<()>1006 fn flush(&mut self) -> io::Result<()> { 1007 CodedOutputStream::flush(self).map_err(Into::into) 1008 } 1009 } 1010 1011 impl<'a> Drop for CodedOutputStream<'a> { drop(&mut self)1012 fn drop(&mut self) { 1013 // This may panic 1014 CodedOutputStream::flush(self).expect("failed to flush"); 1015 } 1016 } 1017 1018 #[cfg(test)] 1019 mod test { 1020 use std::iter; 1021 1022 use super::*; 1023 use crate::hex::decode_hex; 1024 use crate::hex::encode_hex; 1025 test_write<F>(expected: &str, mut gen: F) where F: FnMut(&mut CodedOutputStream) -> crate::Result<()>,1026 fn test_write<F>(expected: &str, mut gen: F) 1027 where 1028 F: FnMut(&mut CodedOutputStream) -> crate::Result<()>, 1029 { 1030 let expected_bytes = decode_hex(expected); 1031 1032 // write to Write 1033 { 1034 let mut v = Vec::new(); 1035 { 1036 let mut os = CodedOutputStream::new(&mut v as &mut dyn Write); 1037 gen(&mut os).unwrap(); 1038 os.flush().unwrap(); 1039 } 1040 assert_eq!(encode_hex(&expected_bytes), encode_hex(&v)); 1041 } 1042 1043 // write to &[u8] 1044 { 1045 let mut r = Vec::with_capacity(expected_bytes.len()); 1046 r.resize(expected_bytes.len(), 0); 1047 { 1048 let mut os = CodedOutputStream::bytes(&mut r); 1049 gen(&mut os).unwrap(); 1050 os.check_eof(); 1051 } 1052 assert_eq!(encode_hex(&expected_bytes), encode_hex(&r)); 1053 } 1054 1055 // write to Vec<u8> 1056 { 1057 let mut r = Vec::new(); 1058 r.extend(&[11, 22, 33, 44, 55, 66, 77]); 1059 { 1060 let mut os = CodedOutputStream::vec(&mut r); 1061 gen(&mut os).unwrap(); 1062 os.flush().unwrap(); 1063 } 1064 1065 r.drain(..7); 1066 assert_eq!(encode_hex(&expected_bytes), encode_hex(&r)); 1067 } 1068 } 1069 1070 #[test] test_output_stream_write_raw_byte()1071 fn test_output_stream_write_raw_byte() { 1072 test_write("a1", |os| os.write_raw_byte(0xa1)); 1073 } 1074 1075 #[test] test_output_stream_write_tag()1076 fn test_output_stream_write_tag() { 1077 test_write("08", |os| os.write_tag(1, WireType::Varint)); 1078 } 1079 1080 #[test] 1081 #[cfg_attr(miri, ignore)] // Miri is too slow for this test. test_output_stream_write_raw_bytes()1082 fn test_output_stream_write_raw_bytes() { 1083 test_write("00 ab", |os| os.write_raw_bytes(&[0x00, 0xab])); 1084 1085 let expected = iter::repeat("01 02 03 04") 1086 .take(2048) 1087 .collect::<Vec<_>>() 1088 .join(" "); 1089 test_write(&expected, |os| { 1090 for _ in 0..2048 { 1091 os.write_raw_bytes(&[0x01, 0x02, 0x03, 0x04])?; 1092 } 1093 1094 Ok(()) 1095 }); 1096 } 1097 1098 #[test] test_output_stream_write_raw_varint32()1099 fn test_output_stream_write_raw_varint32() { 1100 test_write("96 01", |os| os.write_raw_varint32(150)); 1101 test_write("ff ff ff ff 0f", |os| os.write_raw_varint32(0xffffffff)); 1102 } 1103 1104 #[test] test_output_stream_write_raw_varint64()1105 fn test_output_stream_write_raw_varint64() { 1106 test_write("96 01", |os| os.write_raw_varint64(150)); 1107 test_write("ff ff ff ff ff ff ff ff ff 01", |os| { 1108 os.write_raw_varint64(0xffffffffffffffff) 1109 }); 1110 } 1111 1112 #[test] test_output_stream_write_int32_no_tag()1113 fn test_output_stream_write_int32_no_tag() { 1114 test_write("ff ff ff ff ff ff ff ff ff 01", |os| { 1115 os.write_int32_no_tag(-1) 1116 }); 1117 } 1118 1119 #[test] test_output_stream_write_int64_no_tag()1120 fn test_output_stream_write_int64_no_tag() { 1121 test_write("ff ff ff ff ff ff ff ff ff 01", |os| { 1122 os.write_int64_no_tag(-1) 1123 }); 1124 } 1125 1126 #[test] test_output_stream_write_raw_little_endian32()1127 fn test_output_stream_write_raw_little_endian32() { 1128 test_write("f1 e2 d3 c4", |os| os.write_raw_little_endian32(0xc4d3e2f1)); 1129 } 1130 1131 #[test] test_output_stream_write_float_no_tag()1132 fn test_output_stream_write_float_no_tag() { 1133 test_write("95 73 13 61", |os| os.write_float_no_tag(17e19)); 1134 } 1135 1136 #[test] test_output_stream_write_double_no_tag()1137 fn test_output_stream_write_double_no_tag() { 1138 test_write("40 d5 ab 68 b3 07 3d 46", |os| { 1139 os.write_double_no_tag(23e29) 1140 }); 1141 } 1142 1143 #[test] test_output_stream_write_raw_little_endian64()1144 fn test_output_stream_write_raw_little_endian64() { 1145 test_write("f1 e2 d3 c4 b5 a6 07 f8", |os| { 1146 os.write_raw_little_endian64(0xf807a6b5c4d3e2f1) 1147 }); 1148 } 1149 1150 #[test] test_output_stream_io_write()1151 fn test_output_stream_io_write() { 1152 let expected = [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77]; 1153 1154 // write to Write 1155 { 1156 let mut v = Vec::new(); 1157 { 1158 let mut os = CodedOutputStream::new(&mut v as &mut dyn Write); 1159 Write::write(&mut os, &expected).expect("io::Write::write"); 1160 Write::flush(&mut os).expect("io::Write::flush"); 1161 } 1162 assert_eq!(expected, *v); 1163 } 1164 1165 // write to &[u8] 1166 { 1167 let mut v = Vec::with_capacity(expected.len()); 1168 v.resize(expected.len(), 0); 1169 { 1170 let mut os = CodedOutputStream::bytes(&mut v); 1171 Write::write(&mut os, &expected).expect("io::Write::write"); 1172 Write::flush(&mut os).expect("io::Write::flush"); 1173 os.check_eof(); 1174 } 1175 assert_eq!(expected, *v); 1176 } 1177 1178 // write to Vec<u8> 1179 { 1180 let mut v = Vec::new(); 1181 { 1182 let mut os = CodedOutputStream::vec(&mut v); 1183 Write::write(&mut os, &expected).expect("io::Write::write"); 1184 Write::flush(&mut os).expect("io::Write::flush"); 1185 } 1186 assert_eq!(expected, *v); 1187 } 1188 } 1189 1190 #[test] flush_for_vec_does_not_allocate_more()1191 fn flush_for_vec_does_not_allocate_more() { 1192 let mut v = Vec::with_capacity(10); 1193 { 1194 let mut os = CodedOutputStream::vec(&mut v); 1195 for i in 0..10 { 1196 os.write_raw_byte(i as u8).unwrap(); 1197 } 1198 os.flush().unwrap(); 1199 } 1200 assert_eq!(10, v.len()); 1201 // Previously, this allocated more data in buf. 1202 assert_eq!(10, v.capacity()); 1203 } 1204 1205 #[test] total_bytes_written_to_bytes()1206 fn total_bytes_written_to_bytes() { 1207 let mut buf = vec![0; 10]; 1208 let mut stream = CodedOutputStream::bytes(&mut buf); 1209 assert_eq!(0, stream.total_bytes_written()); 1210 stream.write_raw_bytes(&[11, 22]).unwrap(); 1211 assert_eq!(2, stream.total_bytes_written()); 1212 stream.write_raw_bytes(&[33, 44, 55]).unwrap(); 1213 assert_eq!(5, stream.total_bytes_written()); 1214 } 1215 1216 #[test] total_bytes_written_to_vec()1217 fn total_bytes_written_to_vec() { 1218 let mut buf = Vec::new(); 1219 let mut stream = CodedOutputStream::vec(&mut buf); 1220 for i in 0..100 { 1221 stream.write_raw_bytes(&[0, 1, 2]).unwrap(); 1222 assert_eq!((i + 1) * 3, stream.total_bytes_written()); 1223 } 1224 } 1225 } 1226