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

Function skip_map

rust/fory-core/src/serializer/skip.rs:257–379  ·  view source on GitHub ↗
(context: &mut ReadContext, field_type: &FieldType)

Source from the content-addressed store, hash-verified

255#[cold]
256#[inline(never)]
257fn skip_map(context: &mut ReadContext, field_type: &FieldType) -> Result<(), Error> {
258 let length = context.reader.read_var_u32()?;
259 if length == 0 {
260 return Ok(());
261 }
262 let mut len_counter = 0;
263 if field_type.generics.len() < 2 {
264 return Err(Error::invalid_data("map must have at least 2 generics"));
265 }
266 let default_key_type = field_type.generics.first().unwrap();
267 let default_value_type = field_type.generics.get(1).unwrap();
268 loop {
269 if len_counter == length {
270 break;
271 }
272 let header = context.reader.read_u8()?;
273 if header & crate::serializer::map::KEY_NULL != 0
274 && header & crate::serializer::map::VALUE_NULL != 0
275 {
276 len_counter += 1;
277 continue;
278 }
279 if header & crate::serializer::map::KEY_NULL != 0 {
280 // Read value type info if not declared
281 let value_declared = (header & crate::serializer::map::DECL_VALUE_TYPE) != 0;
282 let (value_type_info, value_field_type);
283 let value_type = if !value_declared {
284 let type_info = context.read_any_type_info()?;
285 value_field_type = FieldType::new_with_user_type_id(
286 type_info.get_type_id() as u32,
287 type_info.get_user_type_id(),
288 true,
289 false,
290 Vec::new(),
291 );
292 value_type_info = Some(type_info);
293 &value_field_type
294 } else {
295 value_type_info = None;
296 default_value_type
297 };
298 context.inc_depth()?;
299 skip_value(context, value_type, false, false, &value_type_info)?;
300 context.dec_depth();
301 len_counter += 1;
302 continue;
303 }
304 if header & crate::serializer::map::VALUE_NULL != 0 {
305 // Read key type info if not declared
306 let key_declared = (header & crate::serializer::map::DECL_KEY_TYPE) != 0;
307 let (key_type_info, key_field_type);
308 let key_type = if !key_declared {
309 let type_info = context.read_any_type_info()?;
310 key_field_type = FieldType::new_with_user_type_id(
311 type_info.get_type_id() as u32,
312 type_info.get_user_type_id(),
313 true,
314 false,

Callers 1

skip_valueFunction · 0.70

Calls 12

SomeFunction · 0.85
skip_valueFunction · 0.85
read_var_u32Method · 0.80
lenMethod · 0.80
read_u8Method · 0.80
inc_depthMethod · 0.80
dec_depthMethod · 0.80
getMethod · 0.65
unwrapMethod · 0.45
read_any_type_infoMethod · 0.45
get_type_idMethod · 0.45
get_user_type_idMethod · 0.45

Tested by

no test coverage detected