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

Function readExactFixedPrimitiveRun

go/fory/struct.go:2468–2590  ·  view source on GitHub ↗
(ctx *ReadContext, fields []FieldInfo, start int, ptr unsafe.Pointer)

Source from the content-addressed store, hash-verified

2466}
2467
2468func readExactFixedPrimitiveRun(ctx *ReadContext, fields []FieldInfo, start int, ptr unsafe.Pointer) int {
2469 end := start
2470 size := 0
2471 for end < len(fields) {
2472 field := &fields[end]
2473 if !canReadFixedRun(field) {
2474 break
2475 }
2476 size += getFixedSizeByDispatchId(field.DispatchId)
2477 end++
2478 }
2479 buf := ctx.Buffer()
2480 var errOut Error
2481 if !buf.CheckReadable(size, &errOut) {
2482 ctx.SetError(errOut)
2483 return end
2484 }
2485 baseOffset := buf.ReaderIndex()
2486 data := buf.GetData()
2487 bufOffset := baseOffset
2488 for i := start; i < end; i++ {
2489 field := &fields[i]
2490 fieldPtr := unsafe.Add(ptr, field.Offset)
2491 optInfo := optionalInfo{}
2492 if field.Kind == FieldKindOptional {
2493 optInfo = field.Meta.OptionalInfo
2494 }
2495 switch field.DispatchId {
2496 case PrimitiveBoolDispatchId:
2497 storeFieldValue(field.Kind, fieldPtr, optInfo, data[bufOffset] != 0)
2498 bufOffset++
2499 case PrimitiveInt8DispatchId:
2500 storeFieldValue(field.Kind, fieldPtr, optInfo, int8(data[bufOffset]))
2501 bufOffset++
2502 case PrimitiveUint8DispatchId:
2503 storeFieldValue(field.Kind, fieldPtr, optInfo, data[bufOffset])
2504 bufOffset++
2505 case PrimitiveInt16DispatchId:
2506 var v int16
2507 if isLittleEndian {
2508 v = *(*int16)(unsafe.Pointer(&data[bufOffset]))
2509 } else {
2510 v = int16(binary.LittleEndian.Uint16(data[bufOffset:]))
2511 }
2512 storeFieldValue(field.Kind, fieldPtr, optInfo, v)
2513 bufOffset += 2
2514 case PrimitiveUint16DispatchId:
2515 var v uint16
2516 if isLittleEndian {
2517 v = *(*uint16)(unsafe.Pointer(&data[bufOffset]))
2518 } else {
2519 v = binary.LittleEndian.Uint16(data[bufOffset:])
2520 }
2521 storeFieldValue(field.Kind, fieldPtr, optInfo, v)
2522 bufOffset += 2
2523 case PrimitiveInt32DispatchId:
2524 var v int32
2525 if isLittleEndian {

Callers 1

readFieldsInOrderMethod · 0.85

Calls 14

canReadFixedRunFunction · 0.85
getFixedSizeByDispatchIdFunction · 0.85
storeFieldValueFunction · 0.85
CheckReadableMethod · 0.80
ReaderIndexMethod · 0.80
GetDataMethod · 0.80
SetReaderIndexMethod · 0.80
int8Function · 0.50
int16Function · 0.50
int32Function · 0.50
int64Function · 0.50
BufferMethod · 0.45

Tested by

no test coverage detected