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
37const OUTPUT_STREAM_BUFFER_SIZE: usize = 8 * 1024;
40
41#[derive(Debug)]
43pub struct CodedOutputStream<'a> {
44 target: OutputTarget<'a>,
45 buffer: OutputBuffer,
46 pos_of_buffer_start: u64,
48}
49
50impl<'a> CodedOutputStream<'a> {
51 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 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 pub fn bytes(bytes: &'a mut [u8]) -> CodedOutputStream<'a> {
75 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 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 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 pub fn total_bytes_written(&self) -> u64 {
144 self.pos_of_buffer_start + self.buffer.pos_within_buf() as u64
145 }
146
147 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 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 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 pub fn write_raw_bytes(&mut self, bytes: &[u8]) -> crate::Result<()> {
225 if bytes.len() <= self.buffer.unfilled_len() {
226 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 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 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 pub fn write_raw_varint32(&mut self, value: u32) -> crate::Result<()> {
266 if self.buffer.unfilled_len() >= 5 {
267 unsafe {
269 let len = encode_varint32(value, self.buffer.unfilled());
270 self.buffer.advance(len);
271 };
272 Ok(())
273 } else {
274 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 pub fn write_raw_varint64(&mut self, value: u64) -> crate::Result<()> {
285 if self.buffer.unfilled_len() >= MAX_VARINT_ENCODED_LEN {
286 unsafe {
288 let len = encode_varint64(value, self.buffer.unfilled());
289 self.buffer.advance(len);
290 };
291 Ok(())
292 } else {
293 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 pub fn write_raw_little_endian32(&mut self, value: u32) -> crate::Result<()> {
304 self.write_raw_bytes(&value.to_le_bytes())
305 }
306
307 pub fn write_raw_little_endian64(&mut self, value: u64) -> crate::Result<()> {
309 self.write_raw_bytes(&value.to_le_bytes())
310 }
311
312 pub fn write_float_no_tag(&mut self, value: f32) -> crate::Result<()> {
314 self.write_raw_little_endian32(value.to_bits())
315 }
316
317 pub fn write_double_no_tag(&mut self, value: f64) -> crate::Result<()> {
319 self.write_raw_little_endian64(value.to_bits())
320 }
321
322 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 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 pub fn write_uint64_no_tag(&mut self, value: u64) -> crate::Result<()> {
338 self.write_raw_varint64(value)
339 }
340
341 pub fn write_uint32_no_tag(&mut self, value: u32) -> crate::Result<()> {
343 self.write_raw_varint32(value)
344 }
345
346 pub fn write_int64_no_tag(&mut self, value: i64) -> crate::Result<()> {
348 self.write_raw_varint64(value as u64)
349 }
350
351 pub fn write_int32_no_tag(&mut self, value: i32) -> crate::Result<()> {
353 self.write_raw_varint64(value as u64)
354 }
355
356 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 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 pub fn write_fixed64_no_tag(&mut self, value: u64) -> crate::Result<()> {
368 self.write_raw_little_endian64(value)
369 }
370
371 pub fn write_fixed32_no_tag(&mut self, value: u32) -> crate::Result<()> {
373 self.write_raw_little_endian32(value)
374 }
375
376 pub fn write_sfixed64_no_tag(&mut self, value: i64) -> crate::Result<()> {
378 self.write_raw_little_endian64(value as u64)
379 }
380
381 pub fn write_sfixed32_no_tag(&mut self, value: i32) -> crate::Result<()> {
383 self.write_raw_little_endian32(value as u32)
384 }
385
386 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 pub fn write_enum_no_tag(&mut self, value: i32) -> crate::Result<()> {
393 self.write_int32_no_tag(value)
394 }
395
396 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 pub fn write_string_no_tag(&mut self, s: &str) -> crate::Result<()> {
568 self.write_bytes_no_tag(s.as_bytes())
569 }
570
571 pub fn write_message_no_tag<M: Message>(&mut self, msg: &M) -> crate::Result<()> {
573 msg.write_length_delimited_to(self)
574 }
575
576 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 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 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 pub fn write_repeated_packed_float_no_tag(&mut self, values: &[f32]) -> crate::Result<()> {
601 if LITTLE_ENDIAN {
602 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 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 pub fn write_repeated_packed_double_no_tag(&mut self, values: &[f64]) -> crate::Result<()> {
632 if LITTLE_ENDIAN {
633 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 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 pub fn write_repeated_packed_fixed32_no_tag(&mut self, values: &[u32]) -> crate::Result<()> {
663 if LITTLE_ENDIAN {
664 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 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 pub fn write_repeated_packed_fixed64_no_tag(&mut self, values: &[u64]) -> crate::Result<()> {
694 if LITTLE_ENDIAN {
695 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 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 pub fn write_repeated_packed_sfixed32_no_tag(&mut self, values: &[i32]) -> crate::Result<()> {
725 if LITTLE_ENDIAN {
726 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 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 pub fn write_repeated_packed_sfixed64_no_tag(&mut self, values: &[i64]) -> crate::Result<()> {
756 if LITTLE_ENDIAN {
757 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 #[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 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 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 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 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 {
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 {
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 {
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)] 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 {
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 {
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 {
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 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)] 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}