vendor/google.golang.org/protobuf/internal/impl/codec_map.go
changeset 260 445e01aede7e
parent 256 6d9efbef00a9
equal deleted inserted replaced
259:db4911b0c721 260:445e01aede7e
     8 	"reflect"
     8 	"reflect"
     9 	"sort"
     9 	"sort"
    10 
    10 
    11 	"google.golang.org/protobuf/encoding/protowire"
    11 	"google.golang.org/protobuf/encoding/protowire"
    12 	"google.golang.org/protobuf/internal/genid"
    12 	"google.golang.org/protobuf/internal/genid"
    13 	pref "google.golang.org/protobuf/reflect/protoreflect"
    13 	"google.golang.org/protobuf/reflect/protoreflect"
    14 )
    14 )
    15 
    15 
    16 type mapInfo struct {
    16 type mapInfo struct {
    17 	goType     reflect.Type
    17 	goType     reflect.Type
    18 	keyWiretag uint64
    18 	keyWiretag uint64
    19 	valWiretag uint64
    19 	valWiretag uint64
    20 	keyFuncs   valueCoderFuncs
    20 	keyFuncs   valueCoderFuncs
    21 	valFuncs   valueCoderFuncs
    21 	valFuncs   valueCoderFuncs
    22 	keyZero    pref.Value
    22 	keyZero    protoreflect.Value
    23 	keyKind    pref.Kind
    23 	keyKind    protoreflect.Kind
    24 	conv       *mapConverter
    24 	conv       *mapConverter
    25 }
    25 }
    26 
    26 
    27 func encoderFuncsForMap(fd pref.FieldDescriptor, ft reflect.Type) (valueMessage *MessageInfo, funcs pointerCoderFuncs) {
    27 func encoderFuncsForMap(fd protoreflect.FieldDescriptor, ft reflect.Type) (valueMessage *MessageInfo, funcs pointerCoderFuncs) {
    28 	// TODO: Consider generating specialized map coders.
    28 	// TODO: Consider generating specialized map coders.
    29 	keyField := fd.MapKey()
    29 	keyField := fd.MapKey()
    30 	valField := fd.MapValue()
    30 	valField := fd.MapValue()
    31 	keyWiretag := protowire.EncodeTag(1, wireTypes[keyField.Kind()])
    31 	keyWiretag := protowire.EncodeTag(1, wireTypes[keyField.Kind()])
    32 	valWiretag := protowire.EncodeTag(2, wireTypes[valField.Kind()])
    32 	valWiretag := protowire.EncodeTag(2, wireTypes[valField.Kind()])
    42 		valFuncs:   valFuncs,
    42 		valFuncs:   valFuncs,
    43 		keyZero:    keyField.Default(),
    43 		keyZero:    keyField.Default(),
    44 		keyKind:    keyField.Kind(),
    44 		keyKind:    keyField.Kind(),
    45 		conv:       conv,
    45 		conv:       conv,
    46 	}
    46 	}
    47 	if valField.Kind() == pref.MessageKind {
    47 	if valField.Kind() == protoreflect.MessageKind {
    48 		valueMessage = getMessageInfo(ft.Elem())
    48 		valueMessage = getMessageInfo(ft.Elem())
    49 	}
    49 	}
    50 
    50 
    51 	funcs = pointerCoderFuncs{
    51 	funcs = pointerCoderFuncs{
    52 		size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int {
    52 		size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int {
    66 				return consumeMapOfMessage(b, mp.Elem(), wtyp, mapi, f, opts)
    66 				return consumeMapOfMessage(b, mp.Elem(), wtyp, mapi, f, opts)
    67 			}
    67 			}
    68 		},
    68 		},
    69 	}
    69 	}
    70 	switch valField.Kind() {
    70 	switch valField.Kind() {
    71 	case pref.MessageKind:
    71 	case protoreflect.MessageKind:
    72 		funcs.merge = mergeMapOfMessage
    72 		funcs.merge = mergeMapOfMessage
    73 	case pref.BytesKind:
    73 	case protoreflect.BytesKind:
    74 		funcs.merge = mergeMapOfBytes
    74 		funcs.merge = mergeMapOfBytes
    75 	default:
    75 	default:
    76 		funcs.merge = mergeMap
    76 		funcs.merge = mergeMap
    77 	}
    77 	}
    78 	if valFuncs.isInit != nil {
    78 	if valFuncs.isInit != nil {
   133 		}
   133 		}
   134 		b = b[n:]
   134 		b = b[n:]
   135 		err := errUnknown
   135 		err := errUnknown
   136 		switch num {
   136 		switch num {
   137 		case genid.MapEntry_Key_field_number:
   137 		case genid.MapEntry_Key_field_number:
   138 			var v pref.Value
   138 			var v protoreflect.Value
   139 			var o unmarshalOutput
   139 			var o unmarshalOutput
   140 			v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts)
   140 			v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts)
   141 			if err != nil {
   141 			if err != nil {
   142 				break
   142 				break
   143 			}
   143 			}
   144 			key = v
   144 			key = v
   145 			n = o.n
   145 			n = o.n
   146 		case genid.MapEntry_Value_field_number:
   146 		case genid.MapEntry_Value_field_number:
   147 			var v pref.Value
   147 			var v protoreflect.Value
   148 			var o unmarshalOutput
   148 			var o unmarshalOutput
   149 			v, o, err = mapi.valFuncs.unmarshal(b, val, num, wtyp, opts)
   149 			v, o, err = mapi.valFuncs.unmarshal(b, val, num, wtyp, opts)
   150 			if err != nil {
   150 			if err != nil {
   151 				break
   151 				break
   152 			}
   152 			}
   190 		}
   190 		}
   191 		b = b[n:]
   191 		b = b[n:]
   192 		err := errUnknown
   192 		err := errUnknown
   193 		switch num {
   193 		switch num {
   194 		case 1:
   194 		case 1:
   195 			var v pref.Value
   195 			var v protoreflect.Value
   196 			var o unmarshalOutput
   196 			var o unmarshalOutput
   197 			v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts)
   197 			v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts)
   198 			if err != nil {
   198 			if err != nil {
   199 				break
   199 				break
   200 			}
   200 			}