| use std::any::Any; |
| use std::any::TypeId; |
| use std::fmt; |
| |
| use crate::descriptor::field_descriptor_proto::Type; |
| use crate::message_dyn::MessageDyn; |
| use crate::reflect::dynamic::map::DynamicMap; |
| use crate::reflect::dynamic::optional::DynamicOptional; |
| use crate::reflect::dynamic::repeated::DynamicRepeated; |
| use crate::reflect::map::ReflectMap; |
| use crate::reflect::protobuf_type_box::ProtobufType; |
| use crate::reflect::repeated::ReflectRepeated; |
| use crate::reflect::value::value_ref::ReflectValueMut; |
| use crate::reflect::FieldDescriptor; |
| use crate::reflect::MessageDescriptor; |
| use crate::reflect::ReflectFieldRef; |
| use crate::reflect::ReflectMapMut; |
| use crate::reflect::ReflectMapRef; |
| use crate::reflect::ReflectRepeatedMut; |
| use crate::reflect::ReflectRepeatedRef; |
| use crate::reflect::ReflectValueBox; |
| use crate::reflect::ReflectValueRef; |
| use crate::reflect::RuntimeFieldType; |
| use crate::reflect::Syntax; |
| use crate::rt::bytes_size; |
| use crate::rt::compute_raw_varint32_size; |
| use crate::rt::compute_raw_varint64_size; |
| use crate::rt::int32_size; |
| use crate::rt::int64_size; |
| use crate::rt::map::read_map_template; |
| use crate::rt::sint32_size; |
| use crate::rt::sint64_size; |
| use crate::rt::string_size; |
| use crate::rt::tag_size; |
| use crate::rt::uint32_size; |
| use crate::rt::uint64_size; |
| use crate::rt::unknown_fields_size; |
| use crate::rt::unknown_or_group::read_unknown_or_skip_group_with_tag_unpacked; |
| use crate::rt::vec_packed_bool_size; |
| use crate::rt::vec_packed_double_size; |
| use crate::rt::vec_packed_fixed32_size; |
| use crate::rt::vec_packed_fixed64_size; |
| use crate::rt::vec_packed_float_size; |
| use crate::rt::vec_packed_int32_size; |
| use crate::rt::vec_packed_int64_size; |
| use crate::rt::vec_packed_sfixed32_size; |
| use crate::rt::vec_packed_sfixed64_size; |
| use crate::rt::vec_packed_sint32_size; |
| use crate::rt::vec_packed_sint64_size; |
| use crate::rt::vec_packed_uint32_size; |
| use crate::rt::vec_packed_uint64_size; |
| use crate::text_format; |
| use crate::wire_format::WireType; |
| use crate::CodedInputStream; |
| use crate::CodedOutputStream; |
| use crate::SpecialFields; |
| use crate::UnknownFields; |
| |
| pub(crate) mod map; |
| pub(crate) mod optional; |
| pub(crate) mod repeated; |
| |
| #[derive(Debug, Clone)] |
| enum DynamicFieldValue { |
| Singular(DynamicOptional), |
| Repeated(DynamicRepeated), |
| Map(DynamicMap), |
| } |
| |
| impl DynamicFieldValue { |
| fn as_ref(&self) -> ReflectFieldRef { |
| match self { |
| DynamicFieldValue::Singular(v) => ReflectFieldRef::Optional(v.reflect_singlar_ref()), |
| DynamicFieldValue::Repeated(r) => ReflectFieldRef::Repeated(ReflectRepeatedRef::new(r)), |
| DynamicFieldValue::Map(m) => ReflectFieldRef::Map(ReflectMapRef::new(m)), |
| } |
| } |
| |
| fn clear(&mut self) { |
| match self { |
| DynamicFieldValue::Singular(o) => o.clear(), |
| DynamicFieldValue::Repeated(r) => r.clear(), |
| DynamicFieldValue::Map(m) => m.clear(), |
| } |
| } |
| } |
| |
| impl DynamicFieldValue { |
| fn default_for_field(field: &FieldDescriptor) -> DynamicFieldValue { |
| match field.runtime_field_type() { |
| RuntimeFieldType::Singular(s) => DynamicFieldValue::Singular(DynamicOptional::none(s)), |
| RuntimeFieldType::Repeated(r) => DynamicFieldValue::Repeated(DynamicRepeated::new(r)), |
| RuntimeFieldType::Map(k, v) => DynamicFieldValue::Map(DynamicMap::new(k, v)), |
| } |
| } |
| } |
| |
| #[derive(Debug, Clone)] |
| pub(crate) struct DynamicMessage { |
| descriptor: MessageDescriptor, |
| /// Fields by index in the description. |
| /// This field is lazy-init: it is empty when created. |
| fields: Box<[DynamicFieldValue]>, |
| special_fields: SpecialFields, |
| } |
| |
| impl DynamicMessage { |
| pub(crate) fn new(descriptor: MessageDescriptor) -> DynamicMessage { |
| DynamicMessage { |
| descriptor, |
| fields: Vec::new().into_boxed_slice(), |
| special_fields: SpecialFields::new(), |
| } |
| } |
| |
| pub(crate) fn descriptor(&self) -> &MessageDescriptor { |
| &self.descriptor |
| } |
| |
| fn init_fields(&mut self) { |
| if self.fields.is_empty() { |
| self.fields = self |
| .descriptor |
| .fields() |
| .map(|f| DynamicFieldValue::default_for_field(&f)) |
| .collect(); |
| } |
| } |
| |
| pub(crate) fn get_reflect<'a>(&'a self, field: &FieldDescriptor) -> ReflectFieldRef<'a> { |
| let (descriptor, index) = field.regular(); |
| assert_eq!(self.descriptor, descriptor); |
| if self.fields.is_empty() { |
| ReflectFieldRef::default_for_field(field) |
| } else { |
| self.fields[index].as_ref() |
| } |
| } |
| |
| pub fn clear_field(&mut self, field: &FieldDescriptor) { |
| let (descriptor, index) = field.regular(); |
| assert_eq!(self.descriptor, descriptor); |
| if self.fields.is_empty() { |
| return; |
| } |
| |
| self.fields[index].clear(); |
| } |
| |
| fn clear_oneof_group_fields_except(&mut self, field: &FieldDescriptor) { |
| if let Some(oneof) = field.containing_oneof_including_synthetic() { |
| for next in oneof.fields() { |
| if &next == field { |
| continue; |
| } |
| self.clear_field(&next); |
| } |
| } |
| } |
| |
| pub(crate) fn mut_singular_field_or_default<'a>( |
| &'a mut self, |
| field: &FieldDescriptor, |
| ) -> ReflectValueMut<'a> { |
| let (descriptor, index) = field.regular(); |
| assert_eq!(self.descriptor, descriptor); |
| self.init_fields(); |
| self.clear_oneof_group_fields_except(field); |
| match &mut self.fields[index] { |
| DynamicFieldValue::Singular(f) => f.mut_or_default(), |
| _ => panic!("Not a singular field"), |
| } |
| } |
| |
| pub(crate) fn mut_repeated<'a>( |
| &'a mut self, |
| field: &FieldDescriptor, |
| ) -> ReflectRepeatedMut<'a> { |
| let (descriptor, index) = field.regular(); |
| assert_eq!(self.descriptor, descriptor); |
| self.init_fields(); |
| self.clear_oneof_group_fields_except(field); |
| match &mut self.fields[index] { |
| DynamicFieldValue::Repeated(r) => ReflectRepeatedMut::new(r), |
| _ => panic!("Not a repeated field: {}", field), |
| } |
| } |
| |
| pub(crate) fn mut_map<'a>(&'a mut self, field: &FieldDescriptor) -> ReflectMapMut<'a> { |
| let (descriptor, index) = field.regular(); |
| assert_eq!(self.descriptor, descriptor); |
| self.init_fields(); |
| self.clear_oneof_group_fields_except(field); |
| match &mut self.fields[index] { |
| DynamicFieldValue::Map(m) => ReflectMapMut::new(m), |
| _ => panic!("Not a map field: {}", field), |
| } |
| } |
| |
| pub(crate) fn set_field(&mut self, field: &FieldDescriptor, value: ReflectValueBox) { |
| let (descriptor, index) = field.regular(); |
| assert_eq!(self.descriptor, descriptor); |
| self.init_fields(); |
| self.clear_oneof_group_fields_except(field); |
| match &mut self.fields[index] { |
| DynamicFieldValue::Singular(s) => s.set(value), |
| _ => panic!("Not a singular field: {}", field), |
| } |
| } |
| |
| pub(crate) fn downcast_ref(message: &dyn MessageDyn) -> &DynamicMessage { |
| assert!(Any::type_id(&*message) == TypeId::of::<DynamicMessage>()); |
| unsafe { &*(message as *const dyn MessageDyn as *const DynamicMessage) } |
| } |
| |
| pub(crate) fn downcast_mut(message: &mut dyn MessageDyn) -> &mut DynamicMessage { |
| assert!(Any::type_id(&*message) == TypeId::of::<DynamicMessage>()); |
| unsafe { &mut *(message as *mut dyn MessageDyn as *mut DynamicMessage) } |
| } |
| |
| fn for_each_field_to_write( |
| &self, |
| handler: &mut impl ForEachSingularFieldToWrite, |
| ) -> crate::Result<()> { |
| let is_proto3 = self.descriptor.file_descriptor().syntax() == Syntax::Proto3; |
| for field_desc in self.descriptor.fields() { |
| let field_number = field_desc.proto().number() as u32; |
| match field_desc.runtime_field_type() { |
| RuntimeFieldType::Singular(..) => { |
| if let Some(v) = field_desc.get_singular(self) { |
| // Ignore default value for proto3. |
| if !is_proto3 || v.is_non_zero() { |
| handler.field(field_desc.proto().type_(), field_number, &v)?; |
| } |
| } |
| } |
| RuntimeFieldType::Repeated(..) => { |
| let repeated = field_desc.get_repeated(self); |
| if field_desc.proto().options.get_or_default().packed() { |
| handler.repeated_packed( |
| field_desc.proto().type_(), |
| field_number, |
| &repeated, |
| )?; |
| } else { |
| for i in 0..repeated.len() { |
| let v = repeated.get(i); |
| handler.field(field_desc.proto().type_(), field_number, &v)?; |
| } |
| } |
| } |
| RuntimeFieldType::Map(_, _) => { |
| let map = field_desc.get_map(self); |
| let (key_type, value_type) = field_desc.map_proto_type(); |
| for (k, v) in &map { |
| handler.map_field_entry( |
| field_number, |
| &k, |
| key_type.t(), |
| &v, |
| value_type.t(), |
| )?; |
| } |
| } |
| } |
| } |
| |
| handler.unknown_fields(&self.special_fields.unknown_fields())?; |
| Ok(()) |
| } |
| } |
| |
| trait ForEachSingularFieldToWrite { |
| fn field(&mut self, t: Type, number: u32, value: &ReflectValueRef) -> crate::Result<()>; |
| fn repeated_packed( |
| &mut self, |
| t: Type, |
| number: u32, |
| value: &ReflectRepeatedRef, |
| ) -> crate::Result<()>; |
| fn map_field_entry( |
| &mut self, |
| number: u32, |
| key: &ReflectValueRef, |
| kt: Type, |
| value: &ReflectValueRef, |
| vt: Type, |
| ) -> crate::Result<()>; |
| fn unknown_fields(&mut self, unknown_fields: &UnknownFields) -> crate::Result<()>; |
| } |
| |
| impl fmt::Display for DynamicMessage { |
| fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| text_format::fmt(self, f) |
| } |
| } |
| |
| impl MessageDyn for DynamicMessage { |
| fn descriptor_dyn(&self) -> MessageDescriptor { |
| self.descriptor.clone() |
| } |
| |
| fn is_initialized_dyn(&self) -> bool { |
| if self.descriptor.is_initialized_is_always_true() { |
| return true; |
| } |
| |
| for f in self.descriptor.fields() { |
| let fv = self.get_reflect(&f); |
| match fv { |
| ReflectFieldRef::Optional(s) => match s.value() { |
| None => { |
| if f.is_required() { |
| return false; |
| } |
| } |
| Some(v) => { |
| if !v.is_initialized() { |
| return false; |
| } |
| } |
| }, |
| ReflectFieldRef::Repeated(r) => { |
| for v in &r { |
| if !v.is_initialized() { |
| return false; |
| } |
| } |
| } |
| ReflectFieldRef::Map(m) => { |
| for (_k, v) in &m { |
| // Keys cannot be messages, so only check values. |
| if !v.is_initialized() { |
| return false; |
| } |
| } |
| } |
| } |
| } |
| true |
| } |
| |
| fn merge_from_dyn(&mut self, is: &mut CodedInputStream) -> crate::Result<()> { |
| while !is.eof()? { |
| let (field, wire_type) = is.read_tag_unpack()?; |
| let field_desc = match self.descriptor.field_by_number(field) { |
| Some(f) => f, |
| None => { |
| read_unknown_or_skip_group_with_tag_unpacked( |
| field, |
| wire_type, |
| is, |
| &mut self.special_fields.mut_unknown_fields(), |
| )?; |
| continue; |
| } |
| }; |
| match field_desc.runtime_field_type() { |
| RuntimeFieldType::Singular(rtb) => { |
| let pt = ProtobufType::new(rtb, field_desc.proto().type_())?; |
| let value = pt.read(is, wire_type)?; |
| self.set_field(&field_desc, value); |
| } |
| RuntimeFieldType::Repeated(rtb) => { |
| let pt = ProtobufType::new(rtb, field_desc.proto().type_())?; |
| let mut repeated = self.mut_repeated(&field_desc); |
| pt.read_repeated_into(is, wire_type, &mut repeated)?; |
| } |
| RuntimeFieldType::Map(..) => { |
| let (key_type, value_type) = field_desc.map_proto_type(); |
| let mut map = self.mut_map(&field_desc); |
| let mut key = key_type.runtime().default_value_box(); |
| let mut value = value_type.runtime().default_value_box(); |
| read_map_template( |
| wire_type, |
| is, |
| |wire_type, is| { |
| key = key_type.read(is, wire_type)?; |
| Ok(()) |
| }, |
| |wire_type, is| { |
| value = value_type.read(is, wire_type)?; |
| Ok(()) |
| }, |
| )?; |
| map.insert(key, value); |
| } |
| } |
| } |
| Ok(()) |
| } |
| |
| fn write_to_with_cached_sizes_dyn(&self, os: &mut CodedOutputStream) -> crate::Result<()> { |
| struct Handler<'a, 'o> { |
| os: &'a mut CodedOutputStream<'o>, |
| } |
| |
| impl<'a, 'o> ForEachSingularFieldToWrite for Handler<'a, 'o> { |
| fn field( |
| &mut self, |
| t: Type, |
| number: u32, |
| value: &ReflectValueRef, |
| ) -> crate::Result<()> { |
| singular_write_to(t, number, value, self.os) |
| } |
| |
| fn repeated_packed( |
| &mut self, |
| t: Type, |
| number: u32, |
| value: &ReflectRepeatedRef, |
| ) -> crate::Result<()> { |
| repeated_write_to(t, number, value, self.os) |
| } |
| |
| fn map_field_entry( |
| &mut self, |
| number: u32, |
| key: &ReflectValueRef, |
| kt: Type, |
| value: &ReflectValueRef, |
| vt: Type, |
| ) -> crate::Result<()> { |
| let entry_data_size = compute_map_entry_field_data_size(key, kt, value, vt); |
| self.os.write_tag(number, WireType::LengthDelimited)?; |
| self.os.write_raw_varint32(entry_data_size as u32)?; |
| singular_write_to(kt, 1, key, self.os)?; |
| singular_write_to(vt, 2, value, self.os)?; |
| Ok(()) |
| } |
| |
| fn unknown_fields(&mut self, unknown_fields: &UnknownFields) -> crate::Result<()> { |
| self.os.write_unknown_fields(unknown_fields) |
| } |
| } |
| |
| let mut handler = Handler { os }; |
| |
| self.for_each_field_to_write(&mut handler) |
| } |
| |
| fn compute_size_dyn(&self) -> u64 { |
| struct Handler { |
| m_size: u64, |
| } |
| |
| impl ForEachSingularFieldToWrite for Handler { |
| fn field( |
| &mut self, |
| t: Type, |
| number: u32, |
| value: &ReflectValueRef, |
| ) -> crate::Result<()> { |
| self.m_size += compute_singular_size(t, number, value); |
| Ok(()) |
| } |
| |
| fn repeated_packed( |
| &mut self, |
| t: Type, |
| number: u32, |
| value: &ReflectRepeatedRef, |
| ) -> crate::Result<()> { |
| self.m_size += compute_repeated_packed_size(t, number, value); |
| Ok(()) |
| } |
| |
| fn map_field_entry( |
| &mut self, |
| number: u32, |
| key: &ReflectValueRef, |
| kt: Type, |
| value: &ReflectValueRef, |
| vt: Type, |
| ) -> crate::Result<()> { |
| let entry_data_size = compute_map_entry_field_data_size(key, kt, value, vt); |
| self.m_size += tag_size(number) |
| + compute_raw_varint32_size(entry_data_size as u32) |
| + entry_data_size; |
| Ok(()) |
| } |
| |
| fn unknown_fields(&mut self, unknown_fields: &UnknownFields) -> crate::Result<()> { |
| self.m_size += unknown_fields_size(unknown_fields); |
| Ok(()) |
| } |
| } |
| |
| let mut handler = Handler { m_size: 0 }; |
| |
| self.for_each_field_to_write(&mut handler) |
| .expect("compute_size should not fail"); |
| |
| handler.m_size |
| } |
| |
| fn special_fields_dyn(&self) -> &SpecialFields { |
| &self.special_fields |
| } |
| |
| fn mut_special_fields_dyn(&mut self) -> &mut SpecialFields { |
| &mut self.special_fields |
| } |
| } |
| |
| /// Write singular field to output stream |
| fn singular_write_to( |
| proto_type: Type, |
| field_number: u32, |
| v: &ReflectValueRef, |
| os: &mut CodedOutputStream, |
| ) -> crate::Result<()> { |
| match proto_type { |
| Type::TYPE_ENUM => { |
| let enum_v = v.to_enum_value().unwrap(); |
| os.write_enum(field_number, enum_v) |
| } |
| Type::TYPE_MESSAGE => { |
| let msg_v = v.to_message().unwrap(); |
| os.write_message_dyn(field_number, &*msg_v) |
| } |
| Type::TYPE_GROUP => { |
| unimplemented!() |
| } |
| Type::TYPE_UINT32 => os.write_uint32(field_number, v.to_u32().unwrap()), |
| Type::TYPE_UINT64 => os.write_uint64(field_number, v.to_u64().unwrap()), |
| Type::TYPE_INT32 => os.write_int32(field_number, v.to_i32().unwrap()), |
| Type::TYPE_INT64 => os.write_int64(field_number, v.to_i64().unwrap()), |
| Type::TYPE_SINT32 => os.write_sint32(field_number, v.to_i32().unwrap()), |
| Type::TYPE_SINT64 => os.write_sint64(field_number, v.to_i64().unwrap()), |
| Type::TYPE_FIXED32 => os.write_fixed32(field_number, v.to_u32().unwrap()), |
| Type::TYPE_FIXED64 => os.write_fixed64(field_number, v.to_u64().unwrap()), |
| Type::TYPE_SFIXED64 => os.write_sfixed64(field_number, v.to_i64().unwrap()), |
| Type::TYPE_SFIXED32 => os.write_sfixed32(field_number, v.to_i32().unwrap()), |
| Type::TYPE_BOOL => os.write_bool(field_number, v.to_bool().unwrap()), |
| Type::TYPE_STRING => os.write_string(field_number, v.to_str().unwrap()), |
| Type::TYPE_BYTES => os.write_bytes(field_number, v.to_bytes().unwrap()), |
| Type::TYPE_FLOAT => os.write_float(field_number, v.to_f32().unwrap()), |
| Type::TYPE_DOUBLE => os.write_double(field_number, v.to_f64().unwrap()), |
| } |
| } |
| |
| /// Compute singular field size |
| fn compute_singular_size(proto_type: Type, field_number: u32, v: &ReflectValueRef) -> u64 { |
| match proto_type { |
| Type::TYPE_ENUM => { |
| let enum_v = v.to_enum_value().unwrap(); |
| int32_size(field_number, enum_v) |
| } |
| Type::TYPE_MESSAGE => { |
| let msg_v = v.to_message().unwrap(); |
| let len = msg_v.compute_size_dyn(); |
| tag_size(field_number) + compute_raw_varint64_size(len) + len |
| } |
| Type::TYPE_GROUP => { |
| unimplemented!() |
| } |
| Type::TYPE_UINT32 => { |
| let typed_v = v.to_u32().unwrap(); |
| uint32_size(field_number, typed_v) |
| } |
| Type::TYPE_UINT64 => { |
| let typed_v = v.to_u64().unwrap(); |
| uint64_size(field_number, typed_v) |
| } |
| Type::TYPE_INT32 => { |
| let typed_v = v.to_i32().unwrap(); |
| int32_size(field_number, typed_v) |
| } |
| Type::TYPE_INT64 => { |
| let typed_v = v.to_i64().unwrap(); |
| int64_size(field_number, typed_v) |
| } |
| Type::TYPE_SINT32 => { |
| let typed_v = v.to_i32().unwrap(); |
| sint32_size(field_number, typed_v) |
| } |
| Type::TYPE_SINT64 => { |
| let typed_v = v.to_i64().unwrap(); |
| sint64_size(field_number, typed_v) |
| } |
| Type::TYPE_FIXED32 => tag_size(field_number) + 4, |
| Type::TYPE_FIXED64 => tag_size(field_number) + 8, |
| Type::TYPE_SFIXED32 => tag_size(field_number) + 4, |
| Type::TYPE_SFIXED64 => tag_size(field_number) + 8, |
| Type::TYPE_BOOL => tag_size(field_number) + 1, |
| Type::TYPE_STRING => { |
| let typed_v = v.to_str().unwrap(); |
| string_size(field_number, typed_v) |
| } |
| Type::TYPE_BYTES => { |
| let typed_v = v.to_bytes().unwrap(); |
| bytes_size(field_number, typed_v) |
| } |
| Type::TYPE_FLOAT => tag_size(field_number) + 4, |
| Type::TYPE_DOUBLE => tag_size(field_number) + 8, |
| } |
| } |
| |
| fn compute_repeated_packed_size( |
| proto_type: Type, |
| field_number: u32, |
| v: &ReflectRepeatedRef, |
| ) -> u64 { |
| match proto_type { |
| Type::TYPE_INT32 => vec_packed_int32_size(field_number, v.data_i32()), |
| Type::TYPE_INT64 => vec_packed_int64_size(field_number, v.data_i64()), |
| Type::TYPE_UINT32 => vec_packed_uint32_size(field_number, v.data_u32()), |
| Type::TYPE_UINT64 => vec_packed_uint64_size(field_number, v.data_u64()), |
| Type::TYPE_SINT32 => vec_packed_sint32_size(field_number, v.data_i32()), |
| Type::TYPE_SINT64 => vec_packed_sint64_size(field_number, v.data_i64()), |
| Type::TYPE_FIXED32 => vec_packed_fixed32_size(field_number, v.data_u32()), |
| Type::TYPE_FIXED64 => vec_packed_fixed64_size(field_number, v.data_u64()), |
| Type::TYPE_SFIXED32 => vec_packed_sfixed32_size(field_number, v.data_i32()), |
| Type::TYPE_SFIXED64 => vec_packed_sfixed64_size(field_number, v.data_i64()), |
| Type::TYPE_FLOAT => vec_packed_float_size(field_number, v.data_f32()), |
| Type::TYPE_DOUBLE => vec_packed_double_size(field_number, v.data_f64()), |
| Type::TYPE_BOOL => vec_packed_bool_size(field_number, v.data_bool()), |
| Type::TYPE_STRING => panic!("strings cannot be packed"), |
| Type::TYPE_BYTES => panic!("bytes cannot be packed"), |
| Type::TYPE_ENUM => vec_packed_int32_size(field_number, v.data_enum_values()), |
| Type::TYPE_MESSAGE => panic!("messages cannot be packed"), |
| Type::TYPE_GROUP => panic!("groups cannot be packed"), |
| } |
| } |
| |
| fn repeated_write_to( |
| proto_type: Type, |
| field_number: u32, |
| v: &ReflectRepeatedRef, |
| os: &mut CodedOutputStream, |
| ) -> crate::Result<()> { |
| match proto_type { |
| Type::TYPE_INT32 => os.write_repeated_packed_int32(field_number, v.data_i32()), |
| Type::TYPE_INT64 => os.write_repeated_packed_int64(field_number, v.data_i64()), |
| Type::TYPE_UINT64 => os.write_repeated_packed_uint64(field_number, v.data_u64()), |
| Type::TYPE_FIXED64 => os.write_repeated_packed_fixed64(field_number, v.data_u64()), |
| Type::TYPE_FIXED32 => os.write_repeated_packed_fixed32(field_number, v.data_u32()), |
| Type::TYPE_UINT32 => os.write_repeated_packed_uint32(field_number, v.data_u32()), |
| Type::TYPE_SINT32 => os.write_repeated_packed_sint32(field_number, v.data_i32()), |
| Type::TYPE_SINT64 => os.write_repeated_packed_sint64(field_number, v.data_i64()), |
| Type::TYPE_SFIXED32 => os.write_repeated_packed_sfixed32(field_number, v.data_i32()), |
| Type::TYPE_SFIXED64 => os.write_repeated_packed_sfixed64(field_number, v.data_i64()), |
| Type::TYPE_BOOL => os.write_repeated_packed_bool(field_number, v.data_bool()), |
| Type::TYPE_FLOAT => os.write_repeated_packed_float(field_number, v.data_f32()), |
| Type::TYPE_DOUBLE => os.write_repeated_packed_double(field_number, v.data_f64()), |
| Type::TYPE_ENUM => os.write_repeated_packed_int32(field_number, v.data_enum_values()), |
| Type::TYPE_STRING => panic!("strings cannot be packed"), |
| Type::TYPE_BYTES => panic!("bytes cannot be packed"), |
| Type::TYPE_GROUP => panic!("groups cannot be packed"), |
| Type::TYPE_MESSAGE => panic!("messages cannot be packed"), |
| } |
| } |
| |
| fn compute_map_entry_field_data_size( |
| key: &ReflectValueRef, |
| kt: Type, |
| value: &ReflectValueRef, |
| vt: Type, |
| ) -> u64 { |
| let key_size = compute_singular_size(kt, 1, key); |
| let value_size = compute_singular_size(vt, 2, value); |
| key_size + value_size |
| } |