MCPcopy Create free account
hub / github.com/apache/fory / write_map_data

Function write_map_data

rust/fory-core/src/serializer/map.rs:48–154  ·  view source on GitHub ↗
(
    iter: I,
    length: usize,
    context: &mut WriteContext,
    has_generics: bool,
)

Source from the content-addressed store, hash-verified

46}
47
48pub fn write_map_data<'a, K, V, I>(
49 iter: I,
50 length: usize,
51 context: &mut WriteContext,
52 has_generics: bool,
53) -> Result<(), Error>
54where
55 K: Serializer,
56 V: Serializer,
57 I: Iterator<Item = (&'a K, &'a V)>,
58{
59 context.writer.write_var_u32(length as u32);
60 if length == 0 {
61 return Ok(());
62 }
63 let reserved_space = (K::fory_reserved_space() + SIZE_OF_REF_AND_TYPE) * length
64 + (V::fory_reserved_space() + SIZE_OF_REF_AND_TYPE) * length;
65 context.writer.reserve(reserved_space);
66
67 if K::fory_is_polymorphic()
68 || K::fory_is_shared_ref()
69 || V::fory_is_polymorphic()
70 || V::fory_is_shared_ref()
71 {
72 return write_map_data_dyn_ref(iter, context, has_generics);
73 }
74 let mut header_offset = 0;
75 let mut pair_counter: u8 = 0;
76 let mut need_write_header = true;
77 let key_static_type_id = K::fory_static_type_id();
78 let val_static_type_id = V::fory_static_type_id();
79 let is_key_declared = has_generics && !need_to_write_type_for_field(key_static_type_id);
80 let is_val_declared = has_generics && !need_to_write_type_for_field(val_static_type_id);
81 for (key, value) in iter {
82 let key_is_none = key.fory_is_none();
83 let value_is_none = value.fory_is_none();
84
85 if key_is_none || value_is_none {
86 if !need_write_header && pair_counter > 0 {
87 write_chunk_size(context, header_offset, pair_counter);
88 pair_counter = 0;
89 need_write_header = true;
90 }
91
92 if key_is_none && value_is_none {
93 context.writer.write_u8(KEY_NULL | VALUE_NULL);
94 continue;
95 }
96
97 if value_is_none {
98 let mut chunk_header = VALUE_NULL;
99 if is_key_declared {
100 chunk_header |= DECL_KEY_TYPE;
101 context.writer.write_u8(chunk_header);
102 } else {
103 context.writer.write_u8(chunk_header);
104 K::fory_write_type_info(context)?;
105 }

Callers 2

fory_write_dataMethod · 0.85

Calls 13

fory_reserved_spaceFunction · 0.85
write_map_data_dyn_refFunction · 0.85
fory_write_type_infoFunction · 0.85
write_var_u32Method · 0.80
write_u8Method · 0.80
lenMethod · 0.80
write_i16Method · 0.80
set_bytesMethod · 0.80
write_chunk_sizeFunction · 0.70
reserveMethod · 0.45
fory_is_noneMethod · 0.45

Tested by

no test coverage detected