protobuf-go/runtime/protoiface/methods.go
Damien Neil 0d3e8cc096 proto, runtime/protoiface: add support for fast-path marshaling
Allow message implementations to provide optimized versions of standard
operations. Generated messages now include a ProtoReflectMethods method,
returning a protoiface.Methods struct containing pointers to assorted
optional functions.

The Methods struct also includes a Flags field indicating support for
optional features such as deterministic marshaling.

Implementation of the fast paths (and tests) will come in later CLs.

Change-Id: Idd1beed0ecf43ec5e5e7b8da2ee1e08d3ce32213
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/170340
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
2019-04-02 21:23:04 +00:00

67 lines
2.0 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 protoiface
import (
"github.com/golang/protobuf/v2/internal/pragma"
"github.com/golang/protobuf/v2/reflect/protoreflect"
)
// Methoder is an optional interface implemented by generated messages to
// provide fast-path implementations of various operations.
type Methoder interface {
XXX_Methods() *Methods // may return nil
}
// Methods is a set of optional fast-path implementations of various operations.
type Methods struct {
// Flags indicate support for optional features.
Flags MethodFlag
// MarshalAppend appends the wire-format encoding of m to b, returning the result.
MarshalAppend func(b []byte, m protoreflect.ProtoMessage, opts MarshalOptions) ([]byte, error)
// Size returns the size in bytes of the wire-format encoding of m.
Size func(m protoreflect.ProtoMessage) int
// CachedSize returns the result of the last call to Size.
// It must not be called if the message has been changed since the last call to Size.
CachedSize func(m protoreflect.ProtoMessage) int
// Unmarshal parses the wire-format message in b and places the result in m.
// It does not reset m.
Unmarshal func(b []byte, m protoreflect.ProtoMessage, opts UnmarshalOptions) error
pragma.NoUnkeyedLiterals
}
// MethodFlag indicates support for optional fast-path features.
type MethodFlag int64
const (
// MethodFlagDeterministicMarshal indicates support for deterministic marshaling.
MethodFlagDeterministicMarshal MethodFlag = 1 << iota
)
// MarshalOptions configure the marshaler.
//
// This type is identical to the one in package proto.
type MarshalOptions struct {
Deterministic bool
Reflection bool
pragma.NoUnkeyedLiterals
}
// UnmarshalOptions configures the unmarshaler.
//
// This type is identical to the one in package proto.
type UnmarshalOptions struct {
DiscardUnknown bool
Reflection bool
pragma.NoUnkeyedLiterals
}