protobuf/coded_output_stream/
mod.rs

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