github.com/batchcorp/thrift-iterator@v0.0.0-20220918180557-4c4a158fc6e9/binding/reflection/encode_slice.go (about)

     1  package reflection
     2  
     3  import (
     4  	"unsafe"
     5  	"github.com/batchcorp/thrift-iterator/spi"
     6  	"reflect"
     7  	"github.com/batchcorp/thrift-iterator/protocol"
     8  )
     9  
    10  type sliceEncoder struct {
    11  	sliceType   reflect.Type
    12  	elemType    reflect.Type
    13  	elemEncoder internalEncoder
    14  }
    15  
    16  func (encoder *sliceEncoder) encode(ptr unsafe.Pointer, stream spi.Stream) {
    17  	slice := (*sliceHeader)(ptr)
    18  	stream.WriteListHeader(encoder.elemEncoder.thriftType(), slice.Len)
    19  	offset := uintptr(slice.Data)
    20  	var addr unsafe.Pointer
    21  	for i := 0; i < slice.Len; i++ {
    22  		addr = unsafe.Pointer(offset)
    23  		if encoder.elemType.Kind() == reflect.Map {
    24  			addr = unsafe.Pointer((uintptr)(*(*uint64)(addr)))
    25  		}
    26  		encoder.elemEncoder.encode(addr, stream)
    27  		offset += encoder.elemType.Size()
    28  	}
    29  }
    30  
    31  func (encoder *sliceEncoder) thriftType() protocol.TType {
    32  	return protocol.TypeList
    33  }