mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-01-09 03:39:24 +00:00
a9940822d4
Len looks like it should be O(1), but the need to check for non-zero-length repeated fields makes it at minimum O(n) where n is the number of repeated fields. In practice, it's O(n) where n is the number of fields altogether. The Len function is not especially useful, easily duplicated with Range and a counter, and can be surprisingly inefficient. Drop it. Change-Id: I24b27433217e131e842bd18dd58475bcdf62ef97 Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/183678 Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
113 lines
2.7 KiB
Go
113 lines
2.7 KiB
Go
// Copyright 2019 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package irregular
|
|
|
|
import (
|
|
"google.golang.org/protobuf/encoding/prototext"
|
|
"google.golang.org/protobuf/reflect/protodesc"
|
|
pref "google.golang.org/protobuf/reflect/protoreflect"
|
|
"google.golang.org/protobuf/types/descriptorpb"
|
|
)
|
|
|
|
type IrregularMessage struct {
|
|
set bool
|
|
value string
|
|
}
|
|
|
|
func (m *IrregularMessage) ProtoReflect() pref.Message { return (*message)(m) }
|
|
|
|
type message IrregularMessage
|
|
|
|
func (m *message) Descriptor() pref.MessageDescriptor { return descriptor.Messages().Get(0) }
|
|
func (m *message) New() pref.Message { return &message{} }
|
|
func (m *message) Interface() pref.ProtoMessage { return (*IrregularMessage)(m) }
|
|
|
|
var fieldDescS = descriptor.Messages().Get(0).Fields().Get(0)
|
|
|
|
func (m *message) Range(f func(pref.FieldDescriptor, pref.Value) bool) {
|
|
if m.set {
|
|
f(fieldDescS, pref.ValueOf(m.value))
|
|
}
|
|
}
|
|
|
|
func (m *message) Has(fd pref.FieldDescriptor) bool {
|
|
if fd == fieldDescS {
|
|
return m.set
|
|
}
|
|
panic("invalid field descriptor")
|
|
}
|
|
|
|
func (m *message) Clear(fd pref.FieldDescriptor) {
|
|
if fd == fieldDescS {
|
|
m.value = ""
|
|
m.set = false
|
|
return
|
|
}
|
|
panic("invalid field descriptor")
|
|
}
|
|
|
|
func (m *message) Get(fd pref.FieldDescriptor) pref.Value {
|
|
if fd == fieldDescS {
|
|
return pref.ValueOf(m.value)
|
|
}
|
|
panic("invalid field descriptor")
|
|
}
|
|
|
|
func (m *message) Set(fd pref.FieldDescriptor, v pref.Value) {
|
|
if fd == fieldDescS {
|
|
m.value = v.String()
|
|
m.set = true
|
|
return
|
|
}
|
|
panic("invalid field descriptor")
|
|
}
|
|
|
|
func (m *message) Mutable(pref.FieldDescriptor) pref.Value {
|
|
panic("invalid field descriptor")
|
|
}
|
|
|
|
func (m *message) NewMessage(pref.FieldDescriptor) pref.Message {
|
|
panic("invalid field descriptor")
|
|
}
|
|
|
|
func (m *message) WhichOneof(pref.OneofDescriptor) pref.FieldDescriptor {
|
|
panic("invalid oneof descriptor")
|
|
}
|
|
|
|
func (m *message) GetUnknown() pref.RawFields { return nil }
|
|
func (m *message) SetUnknown(pref.RawFields) { return }
|
|
|
|
var descriptor = func() pref.FileDescriptor {
|
|
p := &descriptorpb.FileDescriptorProto{}
|
|
if err := prototext.Unmarshal([]byte(descriptorText), p); err != nil {
|
|
panic(err)
|
|
}
|
|
file, err := protodesc.NewFile(p, nil)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return file
|
|
}()
|
|
|
|
func file_irregular_irregular_proto_init() { _ = descriptor }
|
|
|
|
const descriptorText = `
|
|
name: "internal/testprotos/irregular/irregular.proto"
|
|
package: "goproto.proto.thirdparty"
|
|
message_type {
|
|
name: "IrregularMessage"
|
|
field {
|
|
name: "s"
|
|
number: 1
|
|
label: LABEL_OPTIONAL
|
|
type: TYPE_STRING
|
|
json_name: "s"
|
|
}
|
|
}
|
|
options {
|
|
go_package: "google.golang.org/protobuf/internal/testprotos/irregular"
|
|
}
|
|
`
|