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

     1  package reflection
     2  
     3  import (
     4  	"github.com/batchcorp/thrift-iterator/spi"
     5  	"reflect"
     6  	"unsafe"
     7  )
     8  
     9  type mapDecoder struct {
    10  	mapType      reflect.Type
    11  	mapInterface emptyInterface
    12  	keyType      reflect.Type
    13  	keyDecoder   internalDecoder
    14  	elemType     reflect.Type
    15  	elemDecoder  internalDecoder
    16  }
    17  
    18  func (decoder *mapDecoder) decode(ptr unsafe.Pointer, iter spi.Iterator) {
    19  	mapInterface := decoder.mapInterface
    20  	mapInterface.word = ptr
    21  	realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
    22  	mapVal := reflect.ValueOf(*realInterface).Elem()
    23  	if mapVal.IsNil() {
    24  		mapVal.Set(reflect.MakeMap(decoder.mapType))
    25  	}
    26  	_, _, length := iter.ReadMapHeader()
    27  	for i := 0; i < length; i++ {
    28  		keyVal := reflect.New(decoder.keyType)
    29  		decoder.keyDecoder.decode(unsafe.Pointer(keyVal.Pointer()), iter)
    30  		elemVal := reflect.New(decoder.elemType)
    31  		decoder.elemDecoder.decode(unsafe.Pointer(elemVal.Pointer()), iter)
    32  		mapVal.SetMapIndex(keyVal.Elem(), elemVal.Elem())
    33  	}
    34  }