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