vendor/google.golang.org/protobuf/internal/impl/weak.go
changeset 256 6d9efbef00a9
child 260 445e01aede7e
equal deleted inserted replaced
255:4f153a23adab 256:6d9efbef00a9
       
     1 // Copyright 2019 The Go Authors. All rights reserved.
       
     2 // Use of this source code is governed by a BSD-style
       
     3 // license that can be found in the LICENSE file.
       
     4 
       
     5 package impl
       
     6 
       
     7 import (
       
     8 	"fmt"
       
     9 
       
    10 	pref "google.golang.org/protobuf/reflect/protoreflect"
       
    11 	"google.golang.org/protobuf/reflect/protoregistry"
       
    12 )
       
    13 
       
    14 // weakFields adds methods to the exported WeakFields type for internal use.
       
    15 //
       
    16 // The exported type is an alias to an unnamed type, so methods can't be
       
    17 // defined directly on it.
       
    18 type weakFields WeakFields
       
    19 
       
    20 func (w weakFields) get(num pref.FieldNumber) (pref.ProtoMessage, bool) {
       
    21 	m, ok := w[int32(num)]
       
    22 	return m, ok
       
    23 }
       
    24 
       
    25 func (w *weakFields) set(num pref.FieldNumber, m pref.ProtoMessage) {
       
    26 	if *w == nil {
       
    27 		*w = make(weakFields)
       
    28 	}
       
    29 	(*w)[int32(num)] = m
       
    30 }
       
    31 
       
    32 func (w *weakFields) clear(num pref.FieldNumber) {
       
    33 	delete(*w, int32(num))
       
    34 }
       
    35 
       
    36 func (Export) HasWeak(w WeakFields, num pref.FieldNumber) bool {
       
    37 	_, ok := w[int32(num)]
       
    38 	return ok
       
    39 }
       
    40 
       
    41 func (Export) ClearWeak(w *WeakFields, num pref.FieldNumber) {
       
    42 	delete(*w, int32(num))
       
    43 }
       
    44 
       
    45 func (Export) GetWeak(w WeakFields, num pref.FieldNumber, name pref.FullName) pref.ProtoMessage {
       
    46 	if m, ok := w[int32(num)]; ok {
       
    47 		return m
       
    48 	}
       
    49 	mt, _ := protoregistry.GlobalTypes.FindMessageByName(name)
       
    50 	if mt == nil {
       
    51 		panic(fmt.Sprintf("message %v for weak field is not linked in", name))
       
    52 	}
       
    53 	return mt.Zero().Interface()
       
    54 }
       
    55 
       
    56 func (Export) SetWeak(w *WeakFields, num pref.FieldNumber, name pref.FullName, m pref.ProtoMessage) {
       
    57 	if m != nil {
       
    58 		mt, _ := protoregistry.GlobalTypes.FindMessageByName(name)
       
    59 		if mt == nil {
       
    60 			panic(fmt.Sprintf("message %v for weak field is not linked in", name))
       
    61 		}
       
    62 		if mt != m.ProtoReflect().Type() {
       
    63 			panic(fmt.Sprintf("invalid message type for weak field: got %T, want %T", m, mt.Zero().Interface()))
       
    64 		}
       
    65 	}
       
    66 	if m == nil || !m.ProtoReflect().IsValid() {
       
    67 		delete(*w, int32(num))
       
    68 		return
       
    69 	}
       
    70 	if *w == nil {
       
    71 		*w = make(weakFields)
       
    72 	}
       
    73 	(*w)[int32(num)] = m
       
    74 }