readSameType handles deserialization of sets where all elements share the same type
(ctx *ReadContext, buf *ByteBuffer, value reflect.Value, typeInfo *TypeInfo, flag int8, length int)
| 374 | |
| 375 | // readSameType handles deserialization of sets where all elements share the same type |
| 376 | func (s setSerializer) readSameType(ctx *ReadContext, buf *ByteBuffer, value reflect.Value, typeInfo *TypeInfo, flag int8, length int) { |
| 377 | // Determine if reference tracking is enabled |
| 378 | trackRefs := (flag & CollectionTrackingRef) != 0 |
| 379 | declaredGenerics := (flag & CollectionIsDeclElementType) != 0 |
| 380 | hasNull := (flag & CollectionHasNull) != 0 |
| 381 | serializer := s.elemSerializer |
| 382 | keyType := value.Type().Key() |
| 383 | elemType := keyType |
| 384 | if !declaredGenerics && typeInfo != nil && typeInfo.Serializer != nil { |
| 385 | serializer = typeInfo.Serializer |
| 386 | if typeInfo.Type != nil { |
| 387 | elemType, serializer = wrapMapSerializerIfNeeded(keyType, typeInfo.Type, serializer) |
| 388 | } |
| 389 | } |
| 390 | if keyType.Kind() != reflect.Ptr { |
| 391 | if ptrSer, ok := serializer.(*ptrToValueSerializer); ok { |
| 392 | serializer = ptrSer.valueSerializer |
| 393 | } |
| 394 | } |
| 395 | declaredGenericDispatch := declaredGenerics && serializerNeedsGenericDispatch(serializer) |
| 396 | |
| 397 | elemRefMode := RefModeNone |
| 398 | if trackRefs { |
| 399 | elemRefMode = RefModeTracking |
| 400 | } |
| 401 | |
| 402 | for i := 0; i < length; i++ { |
| 403 | elem := reflect.New(elemType).Elem() |
| 404 | if trackRefs { |
| 405 | serializer.Read(ctx, elemRefMode, false, declaredGenericDispatch, elem) |
| 406 | if ctx.HasError() { |
| 407 | return |
| 408 | } |
| 409 | if isNull(elem) { |
| 410 | continue |
| 411 | } |
| 412 | } else if hasNull { |
| 413 | refFlag := buf.ReadInt8(ctx.Err()) |
| 414 | if refFlag == NullFlag { |
| 415 | continue |
| 416 | } |
| 417 | readSerializerData(ctx, serializer, declaredGenericDispatch, elem) |
| 418 | if ctx.HasError() { |
| 419 | return |
| 420 | } |
| 421 | } else { |
| 422 | readSerializerData(ctx, serializer, declaredGenericDispatch, elem) |
| 423 | if ctx.HasError() { |
| 424 | return |
| 425 | } |
| 426 | } |
| 427 | // Add element to set |
| 428 | setMapKey(value, elem, keyType) |
| 429 | } |
| 430 | } |
| 431 | |
| 432 | // readDifferentTypes handles deserialization of sets with mixed element types |
| 433 | func (s setSerializer) readDifferentTypes(ctx *ReadContext, buf *ByteBuffer, value reflect.Value, length int, flag int8) { |
no test coverage detected