protobuf/rt/
packed.rs
1use crate::fixed::ProtobufFixed;
2use crate::rt::compute_raw_varint32_size;
3use crate::rt::tag_size;
4use crate::varint::generic::ProtobufVarint;
5use crate::zigzag::ProtobufVarintZigzag;
6use crate::Enum;
7use crate::EnumOrUnknown;
8
9pub(crate) fn vec_packed_varint_data_size<T: ProtobufVarint>(vec: &[T]) -> u64 {
11 vec.iter().map(|v| v.len_varint() as u64).sum()
12}
13
14pub(crate) fn vec_packed_varint_zigzag_data_size<T: ProtobufVarintZigzag>(vec: &[T]) -> u64 {
16 vec.iter().map(|v| v.len_varint_zigzag()).sum()
17}
18
19pub(crate) fn vec_packed_enum_or_unknown_data_size<E: Enum>(vec: &[EnumOrUnknown<E>]) -> u64 {
21 vec.iter()
22 .map(|e| compute_raw_varint32_size(e.value() as u32))
23 .sum()
24}
25
26#[inline]
28fn vec_packed_varint_size<T: ProtobufVarint>(field_number: u32, vec: &[T]) -> u64 {
29 if vec.is_empty() {
30 0
31 } else {
32 let data_size = vec_packed_varint_data_size(vec);
33 tag_size(field_number) + data_size.len_varint() + data_size
34 }
35}
36
37#[inline]
39pub fn vec_packed_int32_size(field_number: u32, vec: &[i32]) -> u64 {
40 vec_packed_varint_size(field_number, vec)
41}
42
43#[inline]
45pub fn vec_packed_int64_size(field_number: u32, vec: &[i64]) -> u64 {
46 vec_packed_varint_size(field_number, vec)
47}
48
49#[inline]
51pub fn vec_packed_uint32_size(field_number: u32, vec: &[u32]) -> u64 {
52 vec_packed_varint_size(field_number, vec)
53}
54
55#[inline]
57pub fn vec_packed_uint64_size(field_number: u32, vec: &[u64]) -> u64 {
58 vec_packed_varint_size(field_number, vec)
59}
60
61#[inline]
63fn vec_packed_varint_zigzag_size<T: ProtobufVarintZigzag>(field_number: u32, vec: &[T]) -> u64 {
64 if vec.is_empty() {
65 0
66 } else {
67 let data_size = vec_packed_varint_zigzag_data_size(vec);
68 tag_size(field_number) + data_size.len_varint() + data_size
69 }
70}
71
72#[inline]
74pub fn vec_packed_sint32_size(field_number: u32, vec: &[i32]) -> u64 {
75 vec_packed_varint_zigzag_size(field_number, vec)
76}
77
78#[inline]
80pub fn vec_packed_sint64_size(field_number: u32, vec: &[i64]) -> u64 {
81 vec_packed_varint_zigzag_size(field_number, vec)
82}
83
84#[inline]
86pub fn vec_packed_enum_or_unknown_size<E: Enum>(
87 field_number: u32,
88 vec: &[EnumOrUnknown<E>],
89) -> u64 {
90 if vec.is_empty() {
91 0
92 } else {
93 let data_size = vec_packed_enum_or_unknown_data_size(vec);
94 tag_size(field_number) + data_size.len_varint() + data_size
95 }
96}
97
98pub(crate) fn vec_packed_fixed_data_size<V: ProtobufFixed>(vec: &[V]) -> u64 {
100 (vec.len() as u64) * (V::LEN as u64)
101}
102
103#[inline]
105fn vec_packed_fixed_size<V: ProtobufFixed>(field_number: u32, vec: &[V]) -> u64 {
106 if vec.is_empty() {
107 0
108 } else {
109 let data_size = vec_packed_fixed_data_size::<V>(vec);
110 tag_size(field_number) + data_size.len_varint() + data_size
111 }
112}
113
114#[inline]
116pub fn vec_packed_fixed32_size(field_number: u32, vec: &[u32]) -> u64 {
117 vec_packed_fixed_size(field_number, vec)
118}
119
120#[inline]
122pub fn vec_packed_fixed64_size(field_number: u32, vec: &[u64]) -> u64 {
123 vec_packed_fixed_size(field_number, vec)
124}
125
126#[inline]
128pub fn vec_packed_sfixed32_size(field_number: u32, vec: &[i32]) -> u64 {
129 vec_packed_fixed_size(field_number, vec)
130}
131
132#[inline]
134pub fn vec_packed_sfixed64_size(field_number: u32, vec: &[i64]) -> u64 {
135 vec_packed_fixed_size(field_number, vec)
136}
137
138#[inline]
140pub fn vec_packed_float_size(field_number: u32, vec: &[f32]) -> u64 {
141 vec_packed_fixed_size(field_number, vec)
142}
143
144#[inline]
146pub fn vec_packed_double_size(field_number: u32, vec: &[f64]) -> u64 {
147 vec_packed_fixed_size(field_number, vec)
148}
149
150#[inline]
152pub fn vec_packed_bool_size(field_number: u32, vec: &[bool]) -> u64 {
153 vec_packed_fixed_size(field_number, vec)
154}