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 }