1use crate::varint::Varint;
2use crate::WireType;
3
4use std::collections::HashMap;
5use std::fmt;
6
7use bytes::{BytesOwned, BytesRead, BytesWrite};
8
9#[derive(Debug, Clone, PartialEq, Eq)]
10#[non_exhaustive]
11pub enum EncodeError {
12 BufferExausted,
13 Other(String),
14}
15
16impl fmt::Display for EncodeError {
17 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
18 match self {
19 Self::BufferExausted => write!(f, "the buffer was to small"),
20 Self::Other(s) => write!(f, "encode error: {s}"),
21 }
22 }
23}
24
25impl std::error::Error for EncodeError {}
26
27#[derive(Debug)]
28pub struct MessageEncoder<B> {
29 inner: B,
30}
31
32impl<B> MessageEncoder<B> {
33 pub fn new(inner: B) -> Self {
34 Self { inner }
35 }
36
37 pub fn inner(&self) -> &B {
38 &self.inner
39 }
40
41 pub fn finish(self) -> B {
42 self.inner
43 }
44}
45
46impl MessageEncoder<BytesOwned> {
47 pub fn new_owned() -> Self {
48 Self {
49 inner: BytesOwned::new(),
50 }
51 }
52}
53
54impl<B> MessageEncoder<B>
55where
56 B: BytesWrite,
57{
58 pub fn write_tag(
59 &mut self,
60 fieldnum: u64,
61 wtype: WireType,
62 ) -> Result<(), EncodeError> {
63 let mut tag = Varint(fieldnum << 3);
64 tag.0 |= wtype.as_num() as u64;
65
66 tag.write(&mut self.inner)
67 .map_err(|_| EncodeError::BufferExausted)
68 }
69
70 pub fn write_len(&mut self, len: u64) -> Result<(), EncodeError> {
71 Varint(len)
72 .write(&mut self.inner)
73 .map_err(|_| EncodeError::BufferExausted)
74 }
75
76 pub fn write_bytes(&mut self, bytes: &[u8]) -> Result<(), EncodeError> {
77 self.inner
78 .try_write(bytes)
79 .map_err(|_| EncodeError::BufferExausted)
80 }
81
82 pub fn written_len(&self) -> u64 {
83 self.inner.as_bytes().len() as u64
84 }
85
86 pub fn write_varint(&mut self, val: u64) -> Result<(), EncodeError> {
87 Varint(val)
88 .write(&mut self.inner)
89 .map_err(|_| EncodeError::BufferExausted)
90 }
91
92 pub fn write_i32(&mut self, val: u32) -> Result<(), EncodeError> {
93 self.inner
94 .try_write_le_u32(val)
95 .map_err(|_| EncodeError::BufferExausted)
96 }
97
98 pub fn write_i64(&mut self, val: u64) -> Result<(), EncodeError> {
99 self.inner
100 .try_write_le_u64(val)
101 .map_err(|_| EncodeError::BufferExausted)
102 }
103
104 pub fn write_empty_field(
105 &mut self,
106 fieldnum: u64,
107 ) -> Result<(), EncodeError> {
108 self.write_tag(fieldnum, WireType::Len)?;
109 self.write_len(0)
110 }
111}
112
113impl From<MessageEncoder<BytesOwned>> for Vec<u8> {
114 fn from(w: MessageEncoder<BytesOwned>) -> Self {
115 w.inner.into()
116 }
117}
118
119#[derive(Debug)]
120pub struct SizeBuilder {
121 inner: u64,
122}
123
124impl SizeBuilder {
125 pub fn new() -> Self {
126 Self { inner: 0 }
127 }
128
129 pub fn write_tag(&mut self, fieldnum: u64, _wtype: WireType) {
130 self.inner += Varint(fieldnum << 3).size();
131 }
132
133 pub fn write_len(&mut self, len: u64) {
134 self.write_varint(len);
136 }
137
138 pub fn write_varint(&mut self, val: u64) {
139 self.inner += Varint(val).size();
140 }
141
142 pub fn write_i32(&mut self, _val: u32) {
143 self.inner += 4;
144 }
145
146 pub fn write_i64(&mut self, _val: u64) {
147 self.inner += 8;
148 }
149
150 pub fn write_bytes(&mut self, len: u64) {
151 self.inner += len;
152 }
153
154 pub fn write_empty_field(&mut self, fieldnum: u64) {
155 self.write_tag(fieldnum, WireType::Len);
156 self.write_len(0);
157 }
158
159 pub fn finish(self) -> u64 {
160 self.inner
161 }
162}
163
164#[derive(Debug, Clone, Copy, PartialEq, Eq)]
165pub struct FieldOpt {
166 pub num: u64,
167 pub is_nested: bool,
168}
169
170impl FieldOpt {
171 pub const fn new(num: u64) -> Self {
172 Self {
173 num,
174 is_nested: false,
175 }
176 }
177}
178
179pub trait EncodeMessage {
185 fn write_to_bytes(&mut self) -> Result<Vec<u8>, EncodeError> {
186 let mut encoder = MessageEncoder::new_owned();
188
189 self.encode(None, &mut encoder)?;
190
191 Ok(encoder.into())
192 }
193
194 const WIRE_TYPE: WireType;
196
197 fn is_default(&self) -> bool;
198
199 fn encoded_size(
205 &mut self,
206 field: Option<FieldOpt>,
207 builder: &mut SizeBuilder,
208 ) -> Result<(), EncodeError>;
209
210 fn encode<B>(
217 &mut self,
218 field: Option<FieldOpt>,
219 encoder: &mut MessageEncoder<B>,
220 ) -> Result<(), EncodeError>
221 where
222 B: BytesWrite;
223}
224
225impl<V: EncodeMessage> EncodeMessage for &mut V {
226 const WIRE_TYPE: WireType = V::WIRE_TYPE;
227
228 fn is_default(&self) -> bool {
229 (**self).is_default()
230 }
231
232 fn encoded_size(
233 &mut self,
234 field: Option<FieldOpt>,
235 builder: &mut SizeBuilder,
236 ) -> Result<(), EncodeError> {
237 (**self).encoded_size(field, builder)
238 }
239
240 fn encode<B>(
241 &mut self,
242 field: Option<FieldOpt>,
243 encoder: &mut MessageEncoder<B>,
244 ) -> Result<(), EncodeError>
245 where
246 B: BytesWrite,
247 {
248 (**self).encode(field, encoder)
249 }
250}
251
252macro_rules! impl_from_ref {
253 ($ty:ty) => {
254 impl EncodeMessage for $ty {
255 const WIRE_TYPE: WireType = <&$ty>::WIRE_TYPE;
256
257 fn is_default(&self) -> bool {
258 (&&*self).is_default()
259 }
260
261 fn encoded_size(
262 &mut self,
263 field: Option<FieldOpt>,
264 builder: &mut SizeBuilder,
265 ) -> Result<(), EncodeError> {
266 (&mut &*self).encoded_size(field, builder)
267 }
268
269 fn encode<B>(
270 &mut self,
271 field: Option<FieldOpt>,
272 encoder: &mut MessageEncoder<B>,
273 ) -> Result<(), EncodeError>
274 where
275 B: BytesWrite,
276 {
277 (&mut &*self).encode(field, encoder)
278 }
279 }
280 };
281}
282
283impl<V> EncodeMessage for Vec<V>
284where
285 V: EncodeMessage,
286{
287 const WIRE_TYPE: WireType = WireType::Len;
288
289 fn is_default(&self) -> bool {
290 self.is_empty()
291 }
292
293 fn encoded_size(
295 &mut self,
296 field: Option<FieldOpt>,
297 builder: &mut SizeBuilder,
298 ) -> Result<(), EncodeError> {
299 self.as_mut_slice().encoded_size(field, builder)
300 }
301
302 fn encode<B>(
303 &mut self,
304 field: Option<FieldOpt>,
305 encoder: &mut MessageEncoder<B>,
306 ) -> Result<(), EncodeError>
307 where
308 B: BytesWrite,
309 {
310 self.as_mut_slice().encode(field, encoder)
311 }
312}
313
314impl<V, const S: usize> EncodeMessage for [V; S]
315where
316 V: EncodeMessage,
317{
318 const WIRE_TYPE: WireType = WireType::Len;
319
320 fn is_default(&self) -> bool {
321 self.is_empty()
322 }
323
324 fn encoded_size(
326 &mut self,
327 field: Option<FieldOpt>,
328 builder: &mut SizeBuilder,
329 ) -> Result<(), EncodeError> {
330 self.as_mut_slice().encoded_size(field, builder)
331 }
332
333 fn encode<B>(
334 &mut self,
335 field: Option<FieldOpt>,
336 encoder: &mut MessageEncoder<B>,
337 ) -> Result<(), EncodeError>
338 where
339 B: BytesWrite,
340 {
341 self.as_mut_slice().encode(field, encoder)
342 }
343}
344
345impl<V> EncodeMessage for [V]
346where
347 V: EncodeMessage,
348{
349 const WIRE_TYPE: WireType = WireType::Len;
350
351 fn is_default(&self) -> bool {
352 self.is_empty()
353 }
354
355 fn encoded_size(
357 &mut self,
358 field: Option<FieldOpt>,
359 builder: &mut SizeBuilder,
360 ) -> Result<(), EncodeError> {
361 let field = field.unwrap_or(FieldOpt::new(1));
363
364 if field.is_nested {
367 builder.write_tag(field.num, WireType::Len);
368
369 let mut size = SizeBuilder::new();
370 self.encoded_size(None, &mut size)?;
371 let size = size.finish();
372
373 builder.write_len(size);
374 builder.write_bytes(size);
375 return Ok(());
376 }
377
378 if V::WIRE_TYPE.can_be_packed() && self.len() > 1 {
380 builder.write_tag(field.num, WireType::Len);
381
382 let mut packed_builder = SizeBuilder::new();
383 for v in self.iter_mut() {
384 v.encoded_size(None, &mut packed_builder)?;
385 }
386 let packed_size = packed_builder.finish();
388
389 builder.write_len(packed_size);
390 builder.write_bytes(packed_size);
391 return Ok(());
392 }
393
394 for v in self.iter_mut() {
396 let field = FieldOpt {
397 num: field.num,
398 is_nested: true,
399 };
400 v.encoded_size(Some(field), builder)?;
401 }
402
403 Ok(())
404 }
405
406 fn encode<B>(
407 &mut self,
408 field: Option<FieldOpt>,
409 encoder: &mut MessageEncoder<B>,
410 ) -> Result<(), EncodeError>
411 where
412 B: BytesWrite,
413 {
414 let field = field.unwrap_or(FieldOpt::new(1));
416
417 if field.is_nested {
420 encoder.write_tag(field.num, WireType::Len)?;
421
422 let mut size = SizeBuilder::new();
423 self.encoded_size(None, &mut size)?;
424 let size = size.finish();
425
426 encoder.write_len(size)?;
427
428 #[cfg(debug_assertions)]
429 let prev_len = encoder.written_len();
430
431 self.encode(None, encoder)?;
432
433 #[cfg(debug_assertions)]
434 {
435 let added_len = encoder.written_len() - prev_len;
436 assert_eq!(
437 size, added_len as u64,
438 "size does not match real size"
439 );
440 }
441
442 return Ok(());
443 }
444
445 if V::WIRE_TYPE.can_be_packed() && self.len() > 1 {
447 encoder.write_tag(field.num, WireType::Len)?;
448
449 let mut packed_builder = SizeBuilder::new();
450 for v in self.iter_mut() {
451 v.encoded_size(None, &mut packed_builder)?;
452 }
453 let packed_size = packed_builder.finish();
455
456 encoder.write_len(packed_size)?;
457
458 #[cfg(debug_assertions)]
459 let prev_len = encoder.written_len();
460
461 for v in self.iter_mut() {
462 v.encode(None, encoder)?;
463 }
464
465 #[cfg(debug_assertions)]
466 {
467 let added_len = encoder.written_len() - prev_len;
468 assert_eq!(
469 packed_size, added_len as u64,
470 "size does not match real size"
471 );
472 }
473
474 return Ok(());
475 }
476
477 for v in self.iter_mut() {
479 let field = FieldOpt {
480 num: field.num,
481 is_nested: true,
482 };
483 v.encode(Some(field), encoder)?;
484 }
485
486 Ok(())
487 }
488}
489
490impl<K, V> EncodeMessage for HashMap<K, V>
491where
492 for<'a> &'a K: EncodeMessage,
493 V: EncodeMessage,
494{
495 const WIRE_TYPE: WireType = WireType::Len;
496
497 fn is_default(&self) -> bool {
498 self.is_empty()
499 }
500
501 fn encoded_size(
503 &mut self,
504 field: Option<FieldOpt>,
505 builder: &mut SizeBuilder,
506 ) -> Result<(), EncodeError> {
507 let field = field.unwrap_or(FieldOpt::new(1));
509
510 if field.is_nested {
513 builder.write_tag(field.num, WireType::Len);
514
515 let mut size = SizeBuilder::new();
516 self.encoded_size(None, &mut size)?;
518 let size = size.finish();
519
520 builder.write_len(size);
521 builder.write_bytes(size);
522 return Ok(());
523 }
524
525 for (k, v) in self.iter_mut() {
527 let field = FieldOpt {
528 num: field.num,
529 is_nested: true,
530 };
531 (k, v).encoded_size(Some(field), builder)?;
532 }
533
534 Ok(())
535 }
536
537 fn encode<B>(
538 &mut self,
539 field: Option<FieldOpt>,
540 encoder: &mut MessageEncoder<B>,
541 ) -> Result<(), EncodeError>
542 where
543 B: BytesWrite,
544 {
545 let field = field.unwrap_or(FieldOpt::new(1));
547
548 if field.is_nested {
551 encoder.write_tag(field.num, WireType::Len)?;
552
553 let mut size = SizeBuilder::new();
554 self.encoded_size(None, &mut size)?;
555 let size = size.finish();
556
557 encoder.write_len(size)?;
558
559 #[cfg(debug_assertions)]
560 let prev_len = encoder.written_len();
561
562 self.encode(None, encoder)?;
563
564 #[cfg(debug_assertions)]
565 {
566 let added_len = encoder.written_len() - prev_len;
567 assert_eq!(
568 size, added_len as u64,
569 "size does not match real size"
570 );
571 }
572
573 return Ok(());
574 }
575
576 for (k, v) in self.iter_mut() {
578 let field = FieldOpt {
579 num: field.num,
580 is_nested: true,
581 };
582 (k, v).encode(Some(field), encoder)?;
583 }
584
585 Ok(())
586 }
587}
588
589impl EncodeMessage for Vec<u8> {
590 const WIRE_TYPE: WireType = WireType::Len;
591
592 fn is_default(&self) -> bool {
593 self.as_slice().is_default()
594 }
595
596 fn encoded_size(
598 &mut self,
599 field: Option<FieldOpt>,
600 builder: &mut SizeBuilder,
601 ) -> Result<(), EncodeError> {
602 self.as_slice().encoded_size(field, builder)
603 }
604
605 fn encode<B>(
606 &mut self,
607 field: Option<FieldOpt>,
608 encoder: &mut MessageEncoder<B>,
609 ) -> Result<(), EncodeError>
610 where
611 B: BytesWrite,
612 {
613 self.as_slice().encode(field, encoder)
614 }
615}
616
617impl<const S: usize> EncodeMessage for [u8; S] {
618 const WIRE_TYPE: WireType = WireType::Len;
619
620 fn is_default(&self) -> bool {
621 self.as_slice().is_default()
622 }
623
624 fn encoded_size(
626 &mut self,
627 field: Option<FieldOpt>,
628 builder: &mut SizeBuilder,
629 ) -> Result<(), EncodeError> {
630 self.as_slice().encoded_size(field, builder)
631 }
632
633 fn encode<B>(
634 &mut self,
635 field: Option<FieldOpt>,
636 encoder: &mut MessageEncoder<B>,
637 ) -> Result<(), EncodeError>
638 where
639 B: BytesWrite,
640 {
641 self.as_slice().encode(field, encoder)
642 }
643}
644
645macro_rules! impl_tuple {
647 ($($gen:ident, $idx:tt),*) => (
648 impl<$($gen),*> EncodeMessage for ($($gen),*)
649 where
650 $($gen: EncodeMessage),*
651 {
652 const WIRE_TYPE: WireType = WireType::Len;
653
654 fn is_default(&self) -> bool {
655 false
656 }
657
658 fn encoded_size(
660 &mut self,
661 field: Option<FieldOpt>,
662 builder: &mut SizeBuilder
663 ) -> Result<(), EncodeError> {
664 let mut size = SizeBuilder::new();
665 $(
666 if !self.$idx.is_default() {
667 self.$idx.encoded_size(
668 Some(FieldOpt::new($idx)),
669 &mut size
670 )?;
671 }
672 )*
673 let fields_size = size.finish();
674
675 if let Some(field) = field {
676 builder.write_tag(field.num, Self::WIRE_TYPE);
677 builder.write_len(fields_size);
678 }
679
680 builder.write_bytes(fields_size);
681
682 Ok(())
683 }
684
685 fn encode<Bytes>(
686 &mut self,
687 field: Option<FieldOpt>,
688 encoder: &mut MessageEncoder<Bytes>
689 ) -> Result<(), EncodeError>
690 where Bytes: BytesWrite {
691 #[cfg(debug_assertions)]
692 let mut dbg_fields_size = None;
693
694 if let Some(field) = field {
697 encoder.write_tag(field.num, Self::WIRE_TYPE)?;
698
699 let mut size = SizeBuilder::new();
700 $(
701 if !self.$idx.is_default() {
702 self.$idx.encoded_size(
703 Some(FieldOpt::new($idx)),
704 &mut size
705 )?;
706 }
707 )*
708 let fields_size = size.finish();
709
710 encoder.write_len(fields_size)?;
711
712 #[cfg(debug_assertions)]
713 {
714 dbg_fields_size = Some(fields_size);
715 }
716 }
717
718 #[cfg(debug_assertions)]
719 let prev_len = encoder.written_len();
720
721 $(
722 if !self.$idx.is_default() {
723 self.$idx.encode(
724 Some(FieldOpt::new($idx)),
725 encoder
726 )?;
727 }
728 )*
729
730 #[cfg(debug_assertions)]
731 if let Some(fields_size) = dbg_fields_size {
732 let added_len = encoder.written_len() - prev_len;
733 assert_eq!(fields_size, added_len as u64,
734 "encoded size does not match actual size");
735 }
736
737 Ok(())
738 }
739 }
740 )
741}
742
743impl_tuple![A, 0, B, 1];
747impl_tuple![A, 0, B, 1, C, 2];
748impl_tuple![A, 0, B, 1, C, 2, D, 3];
749impl_tuple![A, 0, B, 1, C, 2, D, 3, E, 4];
750impl_tuple![A, 0, B, 1, C, 2, D, 3, E, 4, F, 5];
751
752impl_from_ref!([u8]);
753
754impl EncodeMessage for &[u8] {
755 const WIRE_TYPE: WireType = WireType::Len;
756
757 fn is_default(&self) -> bool {
758 self.is_empty()
759 }
760
761 fn encoded_size(
763 &mut self,
764 field: Option<FieldOpt>,
765 writer: &mut SizeBuilder,
766 ) -> Result<(), EncodeError> {
767 if let Some(field) = field {
768 writer.write_tag(field.num, Self::WIRE_TYPE);
769 writer.write_len(self.len() as u64);
770 }
771
772 writer.write_bytes(self.len() as u64);
773
774 Ok(())
775 }
776
777 fn encode<B>(
778 &mut self,
779 field: Option<FieldOpt>,
780 writer: &mut MessageEncoder<B>,
781 ) -> Result<(), EncodeError>
782 where
783 B: BytesWrite,
784 {
785 if let Some(field) = field {
786 writer.write_tag(field.num, Self::WIRE_TYPE)?;
787 writer.write_len(self.len() as u64)?;
788 }
789
790 writer.write_bytes(self)
791 }
792}
793
794impl_from_ref!(String);
795
796impl EncodeMessage for &String {
797 const WIRE_TYPE: WireType = WireType::Len;
798
799 fn is_default(&self) -> bool {
800 self.as_bytes().is_default()
801 }
802
803 fn encoded_size(
805 &mut self,
806 field: Option<FieldOpt>,
807 builder: &mut SizeBuilder,
808 ) -> Result<(), EncodeError> {
809 self.as_bytes().encoded_size(field, builder)
810 }
811
812 fn encode<B>(
813 &mut self,
814 field: Option<FieldOpt>,
815 encoder: &mut MessageEncoder<B>,
816 ) -> Result<(), EncodeError>
817 where
818 B: BytesWrite,
819 {
820 self.as_bytes().encode(field, encoder)
821 }
822}
823
824impl EncodeMessage for &str {
825 const WIRE_TYPE: WireType = WireType::Len;
826
827 fn is_default(&self) -> bool {
828 self.as_bytes().is_default()
829 }
830
831 fn encoded_size(
833 &mut self,
834 field: Option<FieldOpt>,
835 builder: &mut SizeBuilder,
836 ) -> Result<(), EncodeError> {
837 self.as_bytes().encoded_size(field, builder)
838 }
839
840 fn encode<B>(
841 &mut self,
842 field: Option<FieldOpt>,
843 encoder: &mut MessageEncoder<B>,
844 ) -> Result<(), EncodeError>
845 where
846 B: BytesWrite,
847 {
848 self.as_bytes().encode(field, encoder)
849 }
850}
851
852impl<T> EncodeMessage for Option<T>
853where
854 T: EncodeMessage,
855{
856 const WIRE_TYPE: WireType = WireType::Len;
857
858 fn is_default(&self) -> bool {
859 self.is_none()
860 }
861
862 fn encoded_size(
863 &mut self,
864 field: Option<FieldOpt>,
865 builder: &mut SizeBuilder,
866 ) -> Result<(), EncodeError> {
867 let field = field.unwrap_or(FieldOpt::new(1));
868
869 if field.is_nested {
870 builder.write_tag(field.num, WireType::Len);
871
872 let mut size = SizeBuilder::new();
873 self.encoded_size(None, &mut size)?;
874 let size = size.finish();
875
876 builder.write_len(size);
877 builder.write_bytes(size);
878
879 return Ok(());
880 }
881
882 match self {
883 Some(v) => v.encoded_size(
884 Some(FieldOpt {
885 num: field.num,
886 is_nested: true,
887 }),
888 builder,
889 ),
890 None => Ok(()),
891 }
892 }
893
894 fn encode<B>(
895 &mut self,
896 field: Option<FieldOpt>,
897 encoder: &mut MessageEncoder<B>,
898 ) -> Result<(), EncodeError>
899 where
900 B: BytesWrite,
901 {
902 let field = field.unwrap_or(FieldOpt::new(1));
903
904 if field.is_nested {
905 encoder.write_tag(field.num, WireType::Len)?;
906
907 let mut size = SizeBuilder::new();
908 self.encoded_size(None, &mut size)?;
909 let size = size.finish();
910
911 encoder.write_len(size)?;
912
913 #[cfg(debug_assertions)]
914 let prev_len = encoder.written_len();
915
916 self.encode(None, encoder)?;
917
918 #[cfg(debug_assertions)]
919 {
920 let added_len = encoder.written_len() - prev_len;
921 assert_eq!(
922 size, added_len as u64,
923 "size does not match real size"
924 );
925 }
926
927 return Ok(());
928 }
929
930 match self {
931 Some(v) => v.encode(
932 Some(FieldOpt {
933 num: field.num,
934 is_nested: true,
935 }),
936 encoder,
937 ),
938 None => Ok(()),
939 }
940 }
941}
942
943impl_from_ref!(bool);
944
945impl EncodeMessage for &bool {
946 const WIRE_TYPE: WireType = WireType::Varint;
947
948 fn is_default(&self) -> bool {
949 **self == false
950 }
951
952 fn encoded_size(
953 &mut self,
954 field: Option<FieldOpt>,
955 builder: &mut SizeBuilder,
956 ) -> Result<(), EncodeError> {
957 if let Some(field) = field {
958 builder.write_tag(field.num, Self::WIRE_TYPE);
959 }
960
961 builder.write_varint(**self as u64);
962
963 Ok(())
964 }
965
966 fn encode<B>(
967 &mut self,
968 field: Option<FieldOpt>,
969 encoder: &mut MessageEncoder<B>,
970 ) -> Result<(), EncodeError>
971 where
972 B: BytesWrite,
973 {
974 if let Some(field) = field {
975 encoder.write_tag(field.num, Self::WIRE_TYPE)?;
976 }
977
978 encoder.write_varint(**self as u64)
979 }
980}
981
982macro_rules! impl_varint {
984 ($($ty:ty),*) => ($(
985 impl_from_ref!($ty);
986
987 impl EncodeMessage for &$ty {
988 const WIRE_TYPE: WireType = WireType::Varint;
989
990 fn is_default(&self) -> bool {
991 **self == 0
992 }
993
994 fn encoded_size(
995 &mut self,
996 field: Option<FieldOpt>,
997 builder: &mut SizeBuilder
998 ) -> Result<(), EncodeError> {
999 if let Some(field) = field {
1000 builder.write_tag(field.num, Self::WIRE_TYPE);
1001 }
1002
1003 builder.write_varint(**self as u64);
1004
1005 Ok(())
1006 }
1007
1008 fn encode<B>(
1009 &mut self,
1010 field: Option<FieldOpt>,
1011 encoder: &mut MessageEncoder<B>
1012 ) -> Result<(), EncodeError>
1013 where B: BytesWrite {
1014 if let Some(field) = field {
1015 encoder.write_tag(field.num, Self::WIRE_TYPE)?;
1016 }
1017
1018 encoder.write_varint(**self as u64)
1019 }
1020 }
1021 )*)
1022}
1023
1024impl_varint![i32, i64, u32, u64];
1025
1026macro_rules! impl_floats {
1027 ($($src:ident, $wty:ident, $wtype:ident as $ty:ty),*) => ($(
1028 impl_from_ref!($ty);
1029
1030 impl EncodeMessage for &$ty {
1031 const WIRE_TYPE: WireType = WireType::$wtype;
1032
1033 fn is_default(&self) -> bool {
1034 **self == 0 as $ty
1035 }
1036
1037 fn encoded_size(
1038 &mut self,
1039 field: Option<FieldOpt>,
1040 builder: &mut SizeBuilder
1041 ) -> Result<(), EncodeError> {
1042 if let Some(field) = field {
1043 builder.write_tag(field.num, Self::WIRE_TYPE);
1044 }
1045
1046 builder.$src(**self as $wty);
1047
1048 Ok(())
1049 }
1050
1051 fn encode<B>(
1052 &mut self,
1053 field: Option<FieldOpt>,
1054 encoder: &mut MessageEncoder<B>
1055 ) -> Result<(), EncodeError>
1056 where B: BytesWrite {
1057 if let Some(field) = field {
1058 encoder.write_tag(field.num, Self::WIRE_TYPE)?;
1059 }
1060
1061 encoder.$src(**self as $wty)
1062 }
1063 }
1064 )*)
1065}
1066
1067impl_floats![write_i32, u32, I32 as f32, write_i64, u64, I64 as f64];