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 }