internal/impl: add fast-path for IsInitialized

This currently returns uninformative errors from the fast path and then
consults the slow, reflection-based path only when an error is detected.
Perhaps it's worth going through the effort of producing better errors
directly on the fast path.

Change-Id: I68536e9438010dbd97dbaff4f47b78430221d94b
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/171462
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/impl/encode_reflect.go b/internal/impl/encode_reflect.go
index 6e172d9..05ceb33 100644
--- a/internal/impl/encode_reflect.go
+++ b/internal/impl/encode_reflect.go
@@ -22,7 +22,10 @@
 	return b, nil
 }
 
-var coderEnum = pointerCoderFuncs{sizeEnum, appendEnum}
+var coderEnum = pointerCoderFuncs{
+	size:    sizeEnum,
+	marshal: appendEnum,
+}
 
 func sizeEnumNoZero(p pointer, tagsize int, opts marshalOptions) (size int) {
 	if p.v.Elem().Int() == 0 {
@@ -38,7 +41,10 @@
 	return appendEnum(b, p, wiretag, opts)
 }
 
-var coderEnumNoZero = pointerCoderFuncs{sizeEnumNoZero, appendEnumNoZero}
+var coderEnumNoZero = pointerCoderFuncs{
+	size:    sizeEnumNoZero,
+	marshal: appendEnumNoZero,
+}
 
 func sizeEnumPtr(p pointer, tagsize int, opts marshalOptions) (size int) {
 	return sizeEnum(pointer{p.v.Elem()}, tagsize, opts)
@@ -48,7 +54,10 @@
 	return appendEnum(b, pointer{p.v.Elem()}, wiretag, opts)
 }
 
-var coderEnumPtr = pointerCoderFuncs{sizeEnumPtr, appendEnumPtr}
+var coderEnumPtr = pointerCoderFuncs{
+	size:    sizeEnumPtr,
+	marshal: appendEnumPtr,
+}
 
 func sizeEnumSlice(p pointer, tagsize int, opts marshalOptions) (size int) {
 	return sizeEnumSliceReflect(p.v.Elem(), tagsize, opts)
@@ -58,7 +67,10 @@
 	return appendEnumSliceReflect(b, p.v.Elem(), wiretag, opts)
 }
 
-var coderEnumSlice = pointerCoderFuncs{sizeEnumSlice, appendEnumSlice}
+var coderEnumSlice = pointerCoderFuncs{
+	size:    sizeEnumSlice,
+	marshal: appendEnumSlice,
+}
 
 func sizeEnumPackedSlice(p pointer, tagsize int, _ marshalOptions) (size int) {
 	s := p.v.Elem()
@@ -91,4 +103,7 @@
 	return b, nil
 }
 
-var coderEnumPackedSlice = pointerCoderFuncs{sizeEnumPackedSlice, appendEnumPackedSlice}
+var coderEnumPackedSlice = pointerCoderFuncs{
+	size:    sizeEnumPackedSlice,
+	marshal: appendEnumPackedSlice,
+}