initial commit
This commit is contained in:
.gitignoreMakefile
cmd
connector
example
glide.lockglide.yamlglide_test.goserver
doc.gohandlers.gohandlers_test.gooauth2.gooauth2_test.gorotation.gorotation_test.goserver.goserver_test.gotemplates.gotemplates_test.go
storage
doc.go
kubernetes
memory
storage.gostoragetest
vendor
github.com
ericchiang
oidc
LICENSEREADME.mddoc.go
examples
internal
jwks.gojwks_test.gononce.gooidc.gooidc_test.gooidcproxy
testdata
golang
protobuf
.gitignoreAUTHORSCONTRIBUTORSLICENSEMake.protobufMakefileREADME.md
jsonpb
proto
Makefileall_test.goany_test.goclone.goclone_test.godecode.goencode.goequal.goequal_test.goextensions.goextensions_test.golib.gomessage_set.gomessage_set_test.gopointer_reflect.gopointer_unsafe.goproperties.go
proto3_proto
proto3_test.gosize2_test.gosize_test.gotestdata
text.gotext_parser.gotext_parser_test.gotext_test.goprotoc-gen-go
ptypes
gorilla
context
mux
gtank
cryptopasta
inconshreveable
mitchellh
pquerna
cachecontrol
spf13
cobra
.gitignore.mailmap.travis.ymlLICENSE.txtREADME.mdbash_completions.gobash_completions.mdbash_completions_test.gocobra.go
cobra
cobra_test.gocommand.gocommand_notwin.gocommand_test.gocommand_win.godoc
pflag
.travis.ymlLICENSEREADME.mdbool.gobool_test.gocount.gocount_test.goduration.goexample_test.goexport_test.goflag.goflag_test.gofloat32.gofloat64.gogolangflag.gogolangflag_test.goint.goint32.goint64.goint8.goint_slice.goint_slice_test.goip.goip_test.goipmask.goipnet.goipnet_test.gostring.gostring_slice.gostring_slice_test.gouint.gouint16.gouint32.gouint64.gouint8.go
verify
golang.org
x
crypto
.gitattributes.gitignoreAUTHORSCONTRIBUTING.mdCONTRIBUTORSLICENSEPATENTSREADME
acme
internal
bcrypt
blowfish
bn256
cast5
codereview.cfgcurve25519
const_amd64.scswap_amd64.scurve25519.gocurve25519_test.godoc.gofreeze_amd64.sladderstep_amd64.smont25519_amd64.gomul_amd64.ssquare_amd64.s
ed25519
hkdf
md4
nacl
ocsp
openpgp
armor
canonical_text.gocanonical_text_test.goclearsign
elgamal
errors
keys.gokeys_test.gopacket
compressed.gocompressed_test.goconfig.goencrypted_key.goencrypted_key_test.goliteral.goocfb.goocfb_test.goone_pass_signature.goopaque.goopaque_test.gopacket.gopacket_test.goprivate_key.goprivate_key_test.gopublic_key.gopublic_key_test.gopublic_key_v3.gopublic_key_v3_test.goreader.gosignature.gosignature_test.gosignature_v3.gosignature_v3_test.gosymmetric_key_encrypted.gosymmetric_key_encrypted_test.gosymmetrically_encrypted.gosymmetrically_encrypted_test.gouserattribute.gouserattribute_test.gouserid.gouserid_test.go
read.goread_test.gos2k
write.gowrite_test.gootr
pbkdf2
pkcs12
bmp-string.gobmp-string_test.gocrypto.gocrypto_test.goerrors.go
internal
mac.gomac_test.gopbkdf.gopbkdf_test.gopkcs12.gopkcs12_test.gosafebags.gopoly1305
const_amd64.spoly1305.gopoly1305_amd64.spoly1305_arm.spoly1305_test.gosum_amd64.gosum_arm.gosum_ref.go
ripemd160
salsa20
scrypt
sha3
doc.gohashes.gokeccakf.goregister.gosha3.gosha3_test.goshake.go
testdata
xor.goxor_generic.goxor_unaligned.gossh
agent
client.goclient_test.goexample_test.goforward.gokeyring.gokeyring_test.goserver.goserver_test.gotestdata_test.go
benchmark_test.gobuffer.gobuffer_test.gocerts.gocerts_test.gochannel.gocipher.gocipher_test.goclient.goclient_auth.goclient_auth_test.goclient_test.gocommon.goconnection.godoc.goexample_test.gohandshake.gohandshake_test.gokex.gokex_test.gokeys.gokeys_test.gomac.gomempipe_test.gomessages.gomessages_test.gomux.gomux_test.goserver.gosession.gosession_test.gotcpip.gotcpip_test.goterminal
test
agent_unix_test.gocert_test.godoc.goforward_unix_test.gosession_test.gotcpip_test.gotest_unix_test.gotestdata_test.go
testdata
testdata_test.gotransport.gotransport_test.gotea
twofish
xtea
xts
net
.gitattributes.gitignoreAUTHORSCONTRIBUTING.mdCONTRIBUTORSLICENSEPATENTSREADME
bpf
codereview.cfgcontext
dict
html
atom
charset
const.godoc.godoctype.goentity.goentity_test.goescape.goescape_test.goexample_test.goforeign.gonode.gonode_test.goparse.goparse_test.gorender.gorender_test.gotestdata
go1.html
token.gotoken_test.gowebkit
READMEadoption01.datadoption02.datcomments01.datdoctype01.datentities01.datentities02.dathtml5test-com.datinbody01.datisindex.datpending-spec-changes-plain-text-unsafe.datpending-spec-changes.datplain-text-unsafe.datscriptdata01.dat
scripted
tables01.dattests1.dattests10.dattests11.dattests12.dattests14.dattests15.dattests16.dattests17.dattests18.dattests19.dattests2.dattests20.dattests21.dattests22.dattests23.dattests24.dattests25.dattests26.dattests3.dattests4.dattests5.dattests6.dattests7.dattests8.dattests9.dattests_innerHTML_1.dattricky01.datwebkit01.datwebkit02.dathttp2
.gitignoreDockerfileMakefileREADMEclient_conn_pool.goconfigure_transport.goerrors.goerrors_test.gofixed_buffer.gofixed_buffer_test.goflow.goflow_test.goframe.goframe_test.gogo16.gogo17.gogotrack.gogotrack_test.go
h2demo
h2i
headermap.gohpack
http2.gohttp2_test.gonot_go16.gonot_go17.gopipe.gopipe_test.gopriority_test.goserver.goserver_test.gotestdata
transport.gotransport_test.gowrite.gowritesched.goz_spec_test.goicmp
dstunreach.goecho.goendpoint.goexample_test.goextension.goextension_test.gohelper.gohelper_posix.gointerface.goipv4.goipv4_test.goipv6.golisten_posix.golisten_stub.gomessage.gomessage_test.gomessagebody.gompls.gomultipart.gomultipart_test.gopackettoobig.goparamprob.goping_test.gosys_freebsd.gotimeexceeded.go
idna
internal
iana
nettest
error_posix.goerror_stub.gointerface.gorlimit.gorlimit_stub.gorlimit_unix.gorlimit_windows.gostack.gostack_stub.gostack_unix.gostack_windows.go
timeseries
ipv4
bpf_test.gobpfopt_linux.gobpfopt_stub.gocontrol.gocontrol_bsd.gocontrol_pktinfo.gocontrol_stub.gocontrol_unix.gocontrol_windows.godefs_darwin.godefs_dragonfly.godefs_freebsd.godefs_linux.godefs_netbsd.godefs_openbsd.godefs_solaris.godgramopt_posix.godgramopt_stub.godoc.goendpoint.goexample_test.gogen.gogenericopt_posix.gogenericopt_stub.goheader.goheader_test.gohelper.gohelper_stub.gohelper_unix.gohelper_windows.goiana.goicmp.goicmp_linux.goicmp_stub.goicmp_test.gomocktransponder_test.gomulticast_test.gomulticastlistener_test.gomulticastsockopt_test.gopacket.gopayload.gopayload_cmsg.gopayload_nocmsg.goreadwrite_test.gosockopt.gosockopt_asmreq.gosockopt_asmreq_stub.gosockopt_asmreq_unix.gosockopt_asmreq_windows.gosockopt_asmreqn_stub.gosockopt_asmreqn_unix.gosockopt_ssmreq_stub.gosockopt_ssmreq_unix.gosockopt_stub.gosockopt_unix.gosockopt_windows.gosys_bsd.gosys_darwin.gosys_freebsd.gosys_linux.gosys_openbsd.gosys_stub.gosys_windows.gosyscall_linux_386.gosyscall_unix.gothunk_linux_386.sunicast_test.gounicastsockopt_test.gozsys_darwin.gozsys_dragonfly.gozsys_freebsd_386.gozsys_freebsd_amd64.gozsys_freebsd_arm.gozsys_linux_386.gozsys_linux_amd64.gozsys_linux_arm.gozsys_linux_arm64.gozsys_linux_mips64.gozsys_linux_mips64le.gozsys_linux_ppc64.gozsys_linux_ppc64le.gozsys_linux_s390x.gozsys_netbsd.gozsys_openbsd.gozsys_solaris.go
ipv6
bpf_test.gobpfopt_linux.gobpfopt_stub.gocontrol.gocontrol_rfc2292_unix.gocontrol_rfc3542_unix.gocontrol_stub.gocontrol_unix.gocontrol_windows.godefs_darwin.godefs_dragonfly.godefs_freebsd.godefs_linux.godefs_netbsd.godefs_openbsd.godefs_solaris.godgramopt_posix.godgramopt_stub.godoc.goendpoint.goexample_test.gogen.gogenericopt_posix.gogenericopt_stub.goheader.goheader_test.gohelper.gohelper_stub.gohelper_unix.gohelper_windows.goiana.goicmp.goicmp_bsd.goicmp_linux.goicmp_solaris.goicmp_stub.goicmp_test.goicmp_windows.gomocktransponder_test.gomulticast_test.gomulticastlistener_test.gomulticastsockopt_test.gopayload.gopayload_cmsg.gopayload_nocmsg.goreadwrite_test.gosockopt.gosockopt_asmreq_unix.gosockopt_asmreq_windows.gosockopt_ssmreq_stub.gosockopt_ssmreq_unix.gosockopt_stub.gosockopt_test.gosockopt_unix.gosockopt_windows.gosys_bsd.gosys_darwin.gosys_freebsd.gosys_linux.gosys_stub.gosys_windows.gosyscall_linux_386.gosyscall_unix.gothunk_linux_386.sunicast_test.gounicastsockopt_test.gozsys_darwin.gozsys_dragonfly.gozsys_freebsd_386.gozsys_freebsd_amd64.gozsys_freebsd_arm.gozsys_linux_386.gozsys_linux_amd64.gozsys_linux_arm.gozsys_linux_arm64.gozsys_linux_mips64.gozsys_linux_mips64le.gozsys_linux_ppc64.gozsys_linux_ppc64le.gozsys_linux_s390x.gozsys_netbsd.gozsys_openbsd.gozsys_solaris.go
lex
httplex
netutil
proxy
publicsuffix
route
address.goaddress_darwin_test.goaddress_test.gobinary.godefs_darwin.godefs_dragonfly.godefs_freebsd.godefs_netbsd.godefs_openbsd.gointerface.gointerface_announce.gointerface_classic.gointerface_freebsd.gointerface_multicast.gointerface_openbsd.gomessage.gomessage_darwin_test.gomessage_freebsd_test.gomessage_test.goroute.goroute_classic.goroute_openbsd.goroute_test.gosys.gosys_darwin.gosys_dragonfly.gosys_freebsd.gosys_netbsd.gosys_openbsd.gosyscall.gosyscall.szsys_darwin.gozsys_dragonfly.gozsys_freebsd_386.gozsys_freebsd_amd64.gozsys_freebsd_arm.gozsys_netbsd.gozsys_openbsd.go
trace
webdav
file.gofile_test.goif.goif_test.golitmus_test_server.golock.golock_test.goprop.goprop_test.gowebdav.gowebdav_test.goxml.goxml_test.go
internal
xml
websocket
client.goexampledial_test.goexamplehandler_test.gohybi.gohybi_test.goserver.gowebsocket.gowebsocket_test.go
xsrftoken
oauth2
.travis.ymlAUTHORSCONTRIBUTING.mdCONTRIBUTORSLICENSEREADME.md
bitbucket
client_appengine.goclientcredentials
example_test.gofacebook
fitbit
github
google
appengine.goappengine_hook.goappenginevm_hook.godefault.goexample_test.gogoogle.gogoogle_test.gojwt.gojwt_test.gosdk.gosdk_test.go
testdata
gcloud
hipchat
internal
jws
jwt
linkedin
microsoft
oauth2.gooauth2_test.goodnoklassniki
paypal
slack
token.gotoken_test.gotransport.gotransport_test.govk
google.golang.org
appengine
.travis.ymlLICENSEREADME.mderrors.go
aetest
appengine.goappengine_test.goappengine_vm.goblobstore
capability
channel
cloudsql
cmd
datastore
datastore.godatastore_test.godoc.gokey.gokey_test.goload.gometadata.goprop.goprop_test.goquery.goquery_test.gosave.gotime_test.gotransaction.go
delay
demos
guestbook
helloworld
file
identity.goimage
internal
aetesting
api.goapi_classic.goapi_common.goapi_race_test.goapi_test.goapp_id.goapp_id_test.goapp_identity
base
blobstore
capability
channel
datastore
identity.goidentity_classic.goidentity_vm.goimage
internal.gointernal_test.golog
mail
memcache
metadata.gomodules
net.gonet_test.goregen.shremote_api
search
socket
system
taskqueue
transaction.gourlfetch
user
xmpp
log
mail
memcache
module
namespace.gonamespace_test.goremote_api
runtime
search
socket
taskqueue
timeout.gourlfetch
user
xmpp
gopkg.in
asn1-ber.v1
.travis.ymlLICENSEREADME.mdber.gober_test.gocontent_int.goheader.goheader_test.goidentifier.goidentifier_test.golength.golength_test.gosuite_test.go
tests
tc1.bertc10.bertc11.bertc12.bertc13.bertc14.bertc15.bertc16.bertc17.bertc18.bertc19.bertc2.bertc20.bertc21.bertc22.bertc23.bertc24.bertc25.bertc26.bertc27.bertc28.bertc29.bertc3.bertc30.bertc31.bertc32.bertc33.bertc34.bertc35.bertc36.bertc37.bertc38.bertc39.bertc4.bertc40.bertc41.bertc42.bertc43.bertc44.bertc45.bertc46.bertc47.bertc48.bertc5.bertc6.bertc7.bertc8.bertc9.ber
util.goldap.v2
.gitignore.travis.ymlLICENSEREADME.mdadd.gobind.goclient.gocompare.goconn.goconn_test.gocontrol.godebug.godel.godn.godn_test.godoc.goerror.goerror_test.goexample_test.gofilter.gofilter_test.goldap.goldap_test.gomodify.gopasswdmodify.gosearch.gosearch_test.go
square
go-jose.v1
.gitcookies.sh.enc.gitignore.travis.ymlBUG-BOUNTY.mdCONTRIBUTING.mdLICENSEREADME.mdasymmetric.goasymmetric_test.go
cipher
cbc_hmac.gocbc_hmac_test.goconcat_kdf.goconcat_kdf_test.goecdh_es.goecdh_es_test.gokey_wrap.gokey_wrap_test.go
crypter.gocrypter_test.godoc.godoc_test.goencoding.goencoding_test.gojose-util
json
LICENSEREADME.mdbench_test.godecode.godecode_test.goencode.goencode_test.goindent.gonumber_test.goscanner.goscanner_test.gostream.gostream_test.gotagkey_test.gotags.gotags_test.go
json_fork.gojson_fork_test.gojson_std.gojson_std_test.gojwe.gojwe_test.gojwk.gojwk_test.gojws.gojws_test.goshared.gosigning.gosigning_test.gosymmetric.gosymmetric_test.goutils.goutils_test.gotestdata
go-jose.v2
.gitcookies.sh.enc.gitignore.travis.ymlBUG-BOUNTY.mdCONTRIBUTING.mdLICENSEREADME.mdasymmetric.goasymmetric_test.go
cipher
cbc_hmac.gocbc_hmac_test.goconcat_kdf.goconcat_kdf_test.goecdh_es.goecdh_es_test.gokey_wrap.gokey_wrap_test.go
crypter.gocrypter_test.godoc.godoc_test.goencoding.goencoding_test.gojose-util
json
LICENSEREADME.mdbench_test.godecode.godecode_test.goencode.goencode_test.goindent.gonumber_test.goscanner.goscanner_test.gostream.gostream_test.gotagkey_test.gotags.gotags_test.go
json_fork.gojson_fork_test.gojson_std.gojson_std_test.gojwe.gojwe_test.gojwk.gojwk_test.gojws.gojws_test.gotestdata
jwt
shared.gosigning.gosigning_test.gosymmetric.gosymmetric_test.goutils_test.goyaml.v2
version
296
vendor/github.com/golang/protobuf/proto/equal.go
generated
vendored
Normal file
296
vendor/github.com/golang/protobuf/proto/equal.go
generated
vendored
Normal file
@@ -0,0 +1,296 @@
|
||||
// Go support for Protocol Buffers - Google's data interchange format
|
||||
//
|
||||
// Copyright 2011 The Go Authors. All rights reserved.
|
||||
// https://github.com/golang/protobuf
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Protocol buffer comparison.
|
||||
|
||||
package proto
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"log"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
/*
|
||||
Equal returns true iff protocol buffers a and b are equal.
|
||||
The arguments must both be pointers to protocol buffer structs.
|
||||
|
||||
Equality is defined in this way:
|
||||
- Two messages are equal iff they are the same type,
|
||||
corresponding fields are equal, unknown field sets
|
||||
are equal, and extensions sets are equal.
|
||||
- Two set scalar fields are equal iff their values are equal.
|
||||
If the fields are of a floating-point type, remember that
|
||||
NaN != x for all x, including NaN. If the message is defined
|
||||
in a proto3 .proto file, fields are not "set"; specifically,
|
||||
zero length proto3 "bytes" fields are equal (nil == {}).
|
||||
- Two repeated fields are equal iff their lengths are the same,
|
||||
and their corresponding elements are equal (a "bytes" field,
|
||||
although represented by []byte, is not a repeated field)
|
||||
- Two unset fields are equal.
|
||||
- Two unknown field sets are equal if their current
|
||||
encoded state is equal.
|
||||
- Two extension sets are equal iff they have corresponding
|
||||
elements that are pairwise equal.
|
||||
- Every other combination of things are not equal.
|
||||
|
||||
The return value is undefined if a and b are not protocol buffers.
|
||||
*/
|
||||
func Equal(a, b Message) bool {
|
||||
if a == nil || b == nil {
|
||||
return a == b
|
||||
}
|
||||
v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b)
|
||||
if v1.Type() != v2.Type() {
|
||||
return false
|
||||
}
|
||||
if v1.Kind() == reflect.Ptr {
|
||||
if v1.IsNil() {
|
||||
return v2.IsNil()
|
||||
}
|
||||
if v2.IsNil() {
|
||||
return false
|
||||
}
|
||||
v1, v2 = v1.Elem(), v2.Elem()
|
||||
}
|
||||
if v1.Kind() != reflect.Struct {
|
||||
return false
|
||||
}
|
||||
return equalStruct(v1, v2)
|
||||
}
|
||||
|
||||
// v1 and v2 are known to have the same type.
|
||||
func equalStruct(v1, v2 reflect.Value) bool {
|
||||
sprop := GetProperties(v1.Type())
|
||||
for i := 0; i < v1.NumField(); i++ {
|
||||
f := v1.Type().Field(i)
|
||||
if strings.HasPrefix(f.Name, "XXX_") {
|
||||
continue
|
||||
}
|
||||
f1, f2 := v1.Field(i), v2.Field(i)
|
||||
if f.Type.Kind() == reflect.Ptr {
|
||||
if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 {
|
||||
// both unset
|
||||
continue
|
||||
} else if n1 != n2 {
|
||||
// set/unset mismatch
|
||||
return false
|
||||
}
|
||||
b1, ok := f1.Interface().(raw)
|
||||
if ok {
|
||||
b2 := f2.Interface().(raw)
|
||||
// RawMessage
|
||||
if !bytes.Equal(b1.Bytes(), b2.Bytes()) {
|
||||
return false
|
||||
}
|
||||
continue
|
||||
}
|
||||
f1, f2 = f1.Elem(), f2.Elem()
|
||||
}
|
||||
if !equalAny(f1, f2, sprop.Prop[i]) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() {
|
||||
em2 := v2.FieldByName("XXX_InternalExtensions")
|
||||
if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() {
|
||||
em2 := v2.FieldByName("XXX_extensions")
|
||||
if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
uf := v1.FieldByName("XXX_unrecognized")
|
||||
if !uf.IsValid() {
|
||||
return true
|
||||
}
|
||||
|
||||
u1 := uf.Bytes()
|
||||
u2 := v2.FieldByName("XXX_unrecognized").Bytes()
|
||||
if !bytes.Equal(u1, u2) {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// v1 and v2 are known to have the same type.
|
||||
// prop may be nil.
|
||||
func equalAny(v1, v2 reflect.Value, prop *Properties) bool {
|
||||
if v1.Type() == protoMessageType {
|
||||
m1, _ := v1.Interface().(Message)
|
||||
m2, _ := v2.Interface().(Message)
|
||||
return Equal(m1, m2)
|
||||
}
|
||||
switch v1.Kind() {
|
||||
case reflect.Bool:
|
||||
return v1.Bool() == v2.Bool()
|
||||
case reflect.Float32, reflect.Float64:
|
||||
return v1.Float() == v2.Float()
|
||||
case reflect.Int32, reflect.Int64:
|
||||
return v1.Int() == v2.Int()
|
||||
case reflect.Interface:
|
||||
// Probably a oneof field; compare the inner values.
|
||||
n1, n2 := v1.IsNil(), v2.IsNil()
|
||||
if n1 || n2 {
|
||||
return n1 == n2
|
||||
}
|
||||
e1, e2 := v1.Elem(), v2.Elem()
|
||||
if e1.Type() != e2.Type() {
|
||||
return false
|
||||
}
|
||||
return equalAny(e1, e2, nil)
|
||||
case reflect.Map:
|
||||
if v1.Len() != v2.Len() {
|
||||
return false
|
||||
}
|
||||
for _, key := range v1.MapKeys() {
|
||||
val2 := v2.MapIndex(key)
|
||||
if !val2.IsValid() {
|
||||
// This key was not found in the second map.
|
||||
return false
|
||||
}
|
||||
if !equalAny(v1.MapIndex(key), val2, nil) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
case reflect.Ptr:
|
||||
// Maps may have nil values in them, so check for nil.
|
||||
if v1.IsNil() && v2.IsNil() {
|
||||
return true
|
||||
}
|
||||
if v1.IsNil() != v2.IsNil() {
|
||||
return false
|
||||
}
|
||||
return equalAny(v1.Elem(), v2.Elem(), prop)
|
||||
case reflect.Slice:
|
||||
if v1.Type().Elem().Kind() == reflect.Uint8 {
|
||||
// short circuit: []byte
|
||||
|
||||
// Edge case: if this is in a proto3 message, a zero length
|
||||
// bytes field is considered the zero value.
|
||||
if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 {
|
||||
return true
|
||||
}
|
||||
if v1.IsNil() != v2.IsNil() {
|
||||
return false
|
||||
}
|
||||
return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte))
|
||||
}
|
||||
|
||||
if v1.Len() != v2.Len() {
|
||||
return false
|
||||
}
|
||||
for i := 0; i < v1.Len(); i++ {
|
||||
if !equalAny(v1.Index(i), v2.Index(i), prop) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
case reflect.String:
|
||||
return v1.Interface().(string) == v2.Interface().(string)
|
||||
case reflect.Struct:
|
||||
return equalStruct(v1, v2)
|
||||
case reflect.Uint32, reflect.Uint64:
|
||||
return v1.Uint() == v2.Uint()
|
||||
}
|
||||
|
||||
// unknown type, so not a protocol buffer
|
||||
log.Printf("proto: don't know how to compare %v", v1)
|
||||
return false
|
||||
}
|
||||
|
||||
// base is the struct type that the extensions are based on.
|
||||
// x1 and x2 are InternalExtensions.
|
||||
func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool {
|
||||
em1, _ := x1.extensionsRead()
|
||||
em2, _ := x2.extensionsRead()
|
||||
return equalExtMap(base, em1, em2)
|
||||
}
|
||||
|
||||
func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool {
|
||||
if len(em1) != len(em2) {
|
||||
return false
|
||||
}
|
||||
|
||||
for extNum, e1 := range em1 {
|
||||
e2, ok := em2[extNum]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
m1, m2 := e1.value, e2.value
|
||||
|
||||
if m1 != nil && m2 != nil {
|
||||
// Both are unencoded.
|
||||
if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) {
|
||||
return false
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
// At least one is encoded. To do a semantically correct comparison
|
||||
// we need to unmarshal them first.
|
||||
var desc *ExtensionDesc
|
||||
if m := extensionMaps[base]; m != nil {
|
||||
desc = m[extNum]
|
||||
}
|
||||
if desc == nil {
|
||||
log.Printf("proto: don't know how to compare extension %d of %v", extNum, base)
|
||||
continue
|
||||
}
|
||||
var err error
|
||||
if m1 == nil {
|
||||
m1, err = decodeExtension(e1.enc, desc)
|
||||
}
|
||||
if m2 == nil && err == nil {
|
||||
m2, err = decodeExtension(e2.enc, desc)
|
||||
}
|
||||
if err != nil {
|
||||
// The encoded form is invalid.
|
||||
log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err)
|
||||
return false
|
||||
}
|
||||
if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
Reference in New Issue
Block a user