package impl
import (
)
func ( protoiface.EqualInput) protoiface.EqualOutput {
return protoiface.EqualOutput{Equal: equalMessage(.MessageA, .MessageB)}
}
func (, protoreflect.Message) bool {
if == nil || == nil {
return ==
}
if .Descriptor() != .Descriptor() {
return false
}
, := .(*messageState)
if ! {
return protoreflect.ValueOfMessage().Equal(protoreflect.ValueOfMessage())
}
, := .(*messageState)
if ! {
return protoreflect.ValueOfMessage().Equal(protoreflect.ValueOfMessage())
}
:= .messageInfo()
:= .messageInfo()
if != {
return protoreflect.ValueOfMessage().Equal(protoreflect.ValueOfMessage())
}
.init()
for , := range .rangeInfos {
var protoreflect.FieldDescriptor
var , protoreflect.Value
switch ri := .(type) {
case *fieldInfo:
:= .has(.pointer())
:= .has(.pointer())
if != {
return false
}
if ! {
continue
}
= .fieldDesc
= .get(.pointer())
= .get(.pointer())
case *oneofInfo:
:= .which(.pointer())
:= .which(.pointer())
if != {
return false
}
if <= 0 {
continue
}
:= .fields[]
= .fieldDesc
= .get(.pointer())
= .get(.pointer())
}
if !equalValue(, , ) {
return false
}
}
:= .extensionMap(.pointer())
:= .extensionMap(.pointer())
if != nil {
for , := range * {
:= .Type().TypeDescriptor()
:= .Value()
var ExtensionField
:= false
if != nil {
, = (*)[]
}
if == nil || ! {
if .IsList() && .List().Len() == 0 {
continue
}
return false
}
if !equalValue(, , .Value()) {
return false
}
}
}
if != nil {
for , := range * {
if != nil {
if , := (*)[]; {
continue
}
}
if .Type().TypeDescriptor().IsList() && .Value().List().Len() == 0 {
continue
}
return false
}
}
return equalUnknown(.GetUnknown(), .GetUnknown())
}
func ( protoreflect.FieldDescriptor, , protoreflect.Value) bool {
if .Kind() != protoreflect.MessageKind {
return .Equal()
}
if .IsMap() {
if .MapValue().Kind() == protoreflect.MessageKind {
return equalMessageMap(.Map(), .Map())
}
return .Equal()
}
if .IsList() {
return equalMessageList(.List(), .List())
}
return equalMessage(.Message(), .Message())
}
func (, protoreflect.Map) bool {
if .Len() != .Len() {
return false
}
:= true
.Range(func( protoreflect.MapKey, protoreflect.Value) bool {
if !.Has() {
= false
return false
}
:= .Get()
= equalMessage(.Message(), .Message())
return
})
return
}
func (, protoreflect.List) bool {
if .Len() != .Len() {
return false
}
for := 0; < .Len(); ++ {
if !equalMessage(.Get().Message(), .Get().Message()) {
return false
}
}
return true
}
func (, protoreflect.RawFields) bool {
if len() != len() {
return false
}
if bytes.Equal([]byte(), []byte()) {
return true
}
:= make(map[protoreflect.FieldNumber]protoreflect.RawFields)
:= make(map[protoreflect.FieldNumber]protoreflect.RawFields)
for len() > 0 {
, , := protowire.ConsumeField()
[] = append([], [:]...)
= [:]
}
for len() > 0 {
, , := protowire.ConsumeField()
[] = append([], [:]...)
= [:]
}
if len() != len() {
return false
}
for , := range {
if , := []; ! || !bytes.Equal([]byte(), []byte()) {
return false
}
}
return true
}