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
9/// Size of serialized repeated packed field, excluding length and tag.
10pub(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
14/// Size of serialized repeated packed field, excluding length and tag.
15pub(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
19/// Size of serialized repeated packed enum field, excluding length and tag.
20pub(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/// Size of serialized data with length prefix and tag
27#[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/// Size of serialized data with length prefix and tag.
38#[inline]
39pub fn vec_packed_int32_size(field_number: u32, vec: &[i32]) -> u64 {
40    vec_packed_varint_size(field_number, vec)
41}
42
43/// Size of serialized data with length prefix and tag.
44#[inline]
45pub fn vec_packed_int64_size(field_number: u32, vec: &[i64]) -> u64 {
46    vec_packed_varint_size(field_number, vec)
47}
48
49/// Size of serialized data with length prefix and tag.
50#[inline]
51pub fn vec_packed_uint32_size(field_number: u32, vec: &[u32]) -> u64 {
52    vec_packed_varint_size(field_number, vec)
53}
54
55/// Size of serialized data with length prefix and tag.
56#[inline]
57pub fn vec_packed_uint64_size(field_number: u32, vec: &[u64]) -> u64 {
58    vec_packed_varint_size(field_number, vec)
59}
60
61/// Size of serialized data with length prefix and tag
62#[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/// Size of serialized data with length prefix and tag.
73#[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/// Size of serialized data with length prefix and tag.
79#[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/// Size of serialized data with length prefix and tag
85#[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
98/// Compute data size of fixed encoding of repeated field data.
99pub(crate) fn vec_packed_fixed_data_size<V: ProtobufFixed>(vec: &[V]) -> u64 {
100    (vec.len() as u64) * (V::LEN as u64)
101}
102
103/// Compute field size (data plus header) of fixed encoding of repeated field.
104#[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/// Compute data size of fixed encoding of repeated field data.
115#[inline]
116pub fn vec_packed_fixed32_size(field_number: u32, vec: &[u32]) -> u64 {
117    vec_packed_fixed_size(field_number, vec)
118}
119
120/// Compute data size of fixed encoding of repeated field data.
121#[inline]
122pub fn vec_packed_fixed64_size(field_number: u32, vec: &[u64]) -> u64 {
123    vec_packed_fixed_size(field_number, vec)
124}
125
126/// Compute data size of fixed encoding of repeated field data.
127#[inline]
128pub fn vec_packed_sfixed32_size(field_number: u32, vec: &[i32]) -> u64 {
129    vec_packed_fixed_size(field_number, vec)
130}
131
132/// Compute data size of fixed encoding of repeated field data.
133#[inline]
134pub fn vec_packed_sfixed64_size(field_number: u32, vec: &[i64]) -> u64 {
135    vec_packed_fixed_size(field_number, vec)
136}
137
138/// Compute data size of fixed encoding of repeated field data.
139#[inline]
140pub fn vec_packed_float_size(field_number: u32, vec: &[f32]) -> u64 {
141    vec_packed_fixed_size(field_number, vec)
142}
143
144/// Compute data size of fixed encoding of repeated field data.
145#[inline]
146pub fn vec_packed_double_size(field_number: u32, vec: &[f64]) -> u64 {
147    vec_packed_fixed_size(field_number, vec)
148}
149
150/// Compute data size of fixed encoding of repeated field data.
151#[inline]
152pub fn vec_packed_bool_size(field_number: u32, vec: &[bool]) -> u64 {
153    vec_packed_fixed_size(field_number, vec)
154}