github.com/asifdxtreme/cli@v6.1.3-0.20150123051144-9ead8700b4ae+incompatible/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto/encode.go (about)

     1  // Go support for Protocol Buffers - Google's data interchange format
     2  //
     3  // Copyright 2010 The Go Authors.  All rights reserved.
     4  // http://code.google.com/p/goprotobuf/
     5  //
     6  // Redistribution and use in source and binary forms, with or without
     7  // modification, are permitted provided that the following conditions are
     8  // met:
     9  //
    10  //     * Redistributions of source code must retain the above copyright
    11  // notice, this list of conditions and the following disclaimer.
    12  //     * Redistributions in binary form must reproduce the above
    13  // copyright notice, this list of conditions and the following disclaimer
    14  // in the documentation and/or other materials provided with the
    15  // distribution.
    16  //     * Neither the name of Google Inc. nor the names of its
    17  // contributors may be used to endorse or promote products derived from
    18  // this software without specific prior written permission.
    19  //
    20  // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    21  // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    22  // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    23  // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    24  // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    25  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    26  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    27  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    28  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    29  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    30  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    31  
    32  package proto
    33  
    34  /*
    35   * Routines for encoding data into the wire format for protocol buffers.
    36   */
    37  
    38  import (
    39  	"errors"
    40  	"fmt"
    41  	"reflect"
    42  	"sort"
    43  )
    44  
    45  // RequiredNotSetError is the error returned if Marshal is called with
    46  // a protocol buffer struct whose required fields have not
    47  // all been initialized. It is also the error returned if Unmarshal is
    48  // called with an encoded protocol buffer that does not include all the
    49  // required fields.
    50  //
    51  // When printed, RequiredNotSetError reports the first unset required field in a
    52  // message. If the field cannot be precisely determined, it is reported as
    53  // "{Unknown}".
    54  type RequiredNotSetError struct {
    55  	field string
    56  }
    57  
    58  func (e *RequiredNotSetError) Error() string {
    59  	return fmt.Sprintf("proto: required field %q not set", e.field)
    60  }
    61  
    62  var (
    63  	// ErrRepeatedHasNil is the error returned if Marshal is called with
    64  	// a struct with a repeated field containing a nil element.
    65  	ErrRepeatedHasNil = errors.New("proto: repeated field has nil element")
    66  
    67  	// ErrNil is the error returned if Marshal is called with nil.
    68  	ErrNil = errors.New("proto: Marshal called with nil")
    69  )
    70  
    71  // The fundamental encoders that put bytes on the wire.
    72  // Those that take integer types all accept uint64 and are
    73  // therefore of type valueEncoder.
    74  
    75  const maxVarintBytes = 10 // maximum length of a varint
    76  
    77  // EncodeVarint returns the varint encoding of x.
    78  // This is the format for the
    79  // int32, int64, uint32, uint64, bool, and enum
    80  // protocol buffer types.
    81  // Not used by the package itself, but helpful to clients
    82  // wishing to use the same encoding.
    83  func EncodeVarint(x uint64) []byte {
    84  	var buf [maxVarintBytes]byte
    85  	var n int
    86  	for n = 0; x > 127; n++ {
    87  		buf[n] = 0x80 | uint8(x&0x7F)
    88  		x >>= 7
    89  	}
    90  	buf[n] = uint8(x)
    91  	n++
    92  	return buf[0:n]
    93  }
    94  
    95  // EncodeVarint writes a varint-encoded integer to the Buffer.
    96  // This is the format for the
    97  // int32, int64, uint32, uint64, bool, and enum
    98  // protocol buffer types.
    99  func (p *Buffer) EncodeVarint(x uint64) error {
   100  	for x >= 1<<7 {
   101  		p.buf = append(p.buf, uint8(x&0x7f|0x80))
   102  		x >>= 7
   103  	}
   104  	p.buf = append(p.buf, uint8(x))
   105  	return nil
   106  }
   107  
   108  func sizeVarint(x uint64) (n int) {
   109  	for {
   110  		n++
   111  		x >>= 7
   112  		if x == 0 {
   113  			break
   114  		}
   115  	}
   116  	return n
   117  }
   118  
   119  // EncodeFixed64 writes a 64-bit integer to the Buffer.
   120  // This is the format for the
   121  // fixed64, sfixed64, and double protocol buffer types.
   122  func (p *Buffer) EncodeFixed64(x uint64) error {
   123  	p.buf = append(p.buf,
   124  		uint8(x),
   125  		uint8(x>>8),
   126  		uint8(x>>16),
   127  		uint8(x>>24),
   128  		uint8(x>>32),
   129  		uint8(x>>40),
   130  		uint8(x>>48),
   131  		uint8(x>>56))
   132  	return nil
   133  }
   134  
   135  func sizeFixed64(x uint64) int {
   136  	return 8
   137  }
   138  
   139  // EncodeFixed32 writes a 32-bit integer to the Buffer.
   140  // This is the format for the
   141  // fixed32, sfixed32, and float protocol buffer types.
   142  func (p *Buffer) EncodeFixed32(x uint64) error {
   143  	p.buf = append(p.buf,
   144  		uint8(x),
   145  		uint8(x>>8),
   146  		uint8(x>>16),
   147  		uint8(x>>24))
   148  	return nil
   149  }
   150  
   151  func sizeFixed32(x uint64) int {
   152  	return 4
   153  }
   154  
   155  // EncodeZigzag64 writes a zigzag-encoded 64-bit integer
   156  // to the Buffer.
   157  // This is the format used for the sint64 protocol buffer type.
   158  func (p *Buffer) EncodeZigzag64(x uint64) error {
   159  	// use signed number to get arithmetic right shift.
   160  	return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63))))
   161  }
   162  
   163  func sizeZigzag64(x uint64) int {
   164  	return sizeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63))))
   165  }
   166  
   167  // EncodeZigzag32 writes a zigzag-encoded 32-bit integer
   168  // to the Buffer.
   169  // This is the format used for the sint32 protocol buffer type.
   170  func (p *Buffer) EncodeZigzag32(x uint64) error {
   171  	// use signed number to get arithmetic right shift.
   172  	return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31))))
   173  }
   174  
   175  func sizeZigzag32(x uint64) int {
   176  	return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31))))
   177  }
   178  
   179  // EncodeRawBytes writes a count-delimited byte buffer to the Buffer.
   180  // This is the format used for the bytes protocol buffer
   181  // type and for embedded messages.
   182  func (p *Buffer) EncodeRawBytes(b []byte) error {
   183  	p.EncodeVarint(uint64(len(b)))
   184  	p.buf = append(p.buf, b...)
   185  	return nil
   186  }
   187  
   188  func sizeRawBytes(b []byte) int {
   189  	return sizeVarint(uint64(len(b))) +
   190  		len(b)
   191  }
   192  
   193  // EncodeStringBytes writes an encoded string to the Buffer.
   194  // This is the format used for the proto2 string type.
   195  func (p *Buffer) EncodeStringBytes(s string) error {
   196  	p.EncodeVarint(uint64(len(s)))
   197  	p.buf = append(p.buf, s...)
   198  	return nil
   199  }
   200  
   201  func sizeStringBytes(s string) int {
   202  	return sizeVarint(uint64(len(s))) +
   203  		len(s)
   204  }
   205  
   206  // Marshaler is the interface representing objects that can marshal themselves.
   207  type Marshaler interface {
   208  	Marshal() ([]byte, error)
   209  }
   210  
   211  // Marshal takes the protocol buffer
   212  // and encodes it into the wire format, returning the data.
   213  func Marshal(pb Message) ([]byte, error) {
   214  	// Can the object marshal itself?
   215  	if m, ok := pb.(Marshaler); ok {
   216  		return m.Marshal()
   217  	}
   218  	p := NewBuffer(nil)
   219  	err := p.Marshal(pb)
   220  	var state errorState
   221  	if err != nil && !state.shouldContinue(err, nil) {
   222  		return nil, err
   223  	}
   224  	if p.buf == nil && err == nil {
   225  		// Return a non-nil slice on success.
   226  		return []byte{}, nil
   227  	}
   228  	return p.buf, err
   229  }
   230  
   231  // Marshal takes the protocol buffer
   232  // and encodes it into the wire format, writing the result to the
   233  // Buffer.
   234  func (p *Buffer) Marshal(pb Message) error {
   235  	// Can the object marshal itself?
   236  	if m, ok := pb.(Marshaler); ok {
   237  		data, err := m.Marshal()
   238  		if err != nil {
   239  			return err
   240  		}
   241  		p.buf = append(p.buf, data...)
   242  		return nil
   243  	}
   244  
   245  	t, base, err := getbase(pb)
   246  	if structPointer_IsNil(base) {
   247  		return ErrNil
   248  	}
   249  	if err == nil {
   250  		err = p.enc_struct(t.Elem(), GetProperties(t.Elem()), base)
   251  	}
   252  
   253  	if collectStats {
   254  		stats.Encode++
   255  	}
   256  
   257  	return err
   258  }
   259  
   260  // Size returns the encoded size of a protocol buffer.
   261  func Size(pb Message) (n int) {
   262  	// Can the object marshal itself?  If so, Size is slow.
   263  	// TODO: add Size to Marshaler, or add a Sizer interface.
   264  	if m, ok := pb.(Marshaler); ok {
   265  		b, _ := m.Marshal()
   266  		return len(b)
   267  	}
   268  
   269  	t, base, err := getbase(pb)
   270  	if structPointer_IsNil(base) {
   271  		return 0
   272  	}
   273  	if err == nil {
   274  		n = size_struct(t.Elem(), GetProperties(t.Elem()), base)
   275  	}
   276  
   277  	if collectStats {
   278  		stats.Size++
   279  	}
   280  
   281  	return
   282  }
   283  
   284  // Individual type encoders.
   285  
   286  // Encode a bool.
   287  func (o *Buffer) enc_bool(p *Properties, base structPointer) error {
   288  	v := *structPointer_Bool(base, p.field)
   289  	if v == nil {
   290  		return ErrNil
   291  	}
   292  	x := 0
   293  	if *v {
   294  		x = 1
   295  	}
   296  	o.buf = append(o.buf, p.tagcode...)
   297  	p.valEnc(o, uint64(x))
   298  	return nil
   299  }
   300  
   301  func size_bool(p *Properties, base structPointer) int {
   302  	v := *structPointer_Bool(base, p.field)
   303  	if v == nil {
   304  		return 0
   305  	}
   306  	return len(p.tagcode) + 1 // each bool takes exactly one byte
   307  }
   308  
   309  // Encode an int32.
   310  func (o *Buffer) enc_int32(p *Properties, base structPointer) error {
   311  	v := structPointer_Word32(base, p.field)
   312  	if word32_IsNil(v) {
   313  		return ErrNil
   314  	}
   315  	x := word32_Get(v)
   316  	o.buf = append(o.buf, p.tagcode...)
   317  	p.valEnc(o, uint64(x))
   318  	return nil
   319  }
   320  
   321  func size_int32(p *Properties, base structPointer) (n int) {
   322  	v := structPointer_Word32(base, p.field)
   323  	if word32_IsNil(v) {
   324  		return 0
   325  	}
   326  	x := word32_Get(v)
   327  	n += len(p.tagcode)
   328  	n += p.valSize(uint64(x))
   329  	return
   330  }
   331  
   332  // Encode an int64.
   333  func (o *Buffer) enc_int64(p *Properties, base structPointer) error {
   334  	v := structPointer_Word64(base, p.field)
   335  	if word64_IsNil(v) {
   336  		return ErrNil
   337  	}
   338  	x := word64_Get(v)
   339  	o.buf = append(o.buf, p.tagcode...)
   340  	p.valEnc(o, x)
   341  	return nil
   342  }
   343  
   344  func size_int64(p *Properties, base structPointer) (n int) {
   345  	v := structPointer_Word64(base, p.field)
   346  	if word64_IsNil(v) {
   347  		return 0
   348  	}
   349  	x := word64_Get(v)
   350  	n += len(p.tagcode)
   351  	n += p.valSize(x)
   352  	return
   353  }
   354  
   355  // Encode a string.
   356  func (o *Buffer) enc_string(p *Properties, base structPointer) error {
   357  	v := *structPointer_String(base, p.field)
   358  	if v == nil {
   359  		return ErrNil
   360  	}
   361  	x := *v
   362  	o.buf = append(o.buf, p.tagcode...)
   363  	o.EncodeStringBytes(x)
   364  	return nil
   365  }
   366  
   367  func size_string(p *Properties, base structPointer) (n int) {
   368  	v := *structPointer_String(base, p.field)
   369  	if v == nil {
   370  		return 0
   371  	}
   372  	x := *v
   373  	n += len(p.tagcode)
   374  	n += sizeStringBytes(x)
   375  	return
   376  }
   377  
   378  // All protocol buffer fields are nillable, but be careful.
   379  func isNil(v reflect.Value) bool {
   380  	switch v.Kind() {
   381  	case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
   382  		return v.IsNil()
   383  	}
   384  	return false
   385  }
   386  
   387  // Encode a message struct.
   388  func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error {
   389  	var state errorState
   390  	structp := structPointer_GetStructPointer(base, p.field)
   391  	if structPointer_IsNil(structp) {
   392  		return ErrNil
   393  	}
   394  
   395  	// Can the object marshal itself?
   396  	if p.isMarshaler {
   397  		m := structPointer_Interface(structp, p.stype).(Marshaler)
   398  		data, err := m.Marshal()
   399  		if err != nil && !state.shouldContinue(err, nil) {
   400  			return err
   401  		}
   402  		o.buf = append(o.buf, p.tagcode...)
   403  		o.EncodeRawBytes(data)
   404  		return nil
   405  	}
   406  
   407  	o.buf = append(o.buf, p.tagcode...)
   408  	return o.enc_len_struct(p.stype, p.sprop, structp, &state)
   409  }
   410  
   411  func size_struct_message(p *Properties, base structPointer) int {
   412  	structp := structPointer_GetStructPointer(base, p.field)
   413  	if structPointer_IsNil(structp) {
   414  		return 0
   415  	}
   416  
   417  	// Can the object marshal itself?
   418  	if p.isMarshaler {
   419  		m := structPointer_Interface(structp, p.stype).(Marshaler)
   420  		data, _ := m.Marshal()
   421  		n0 := len(p.tagcode)
   422  		n1 := sizeRawBytes(data)
   423  		return n0 + n1
   424  	}
   425  
   426  	n0 := len(p.tagcode)
   427  	n1 := size_struct(p.stype, p.sprop, structp)
   428  	n2 := sizeVarint(uint64(n1)) // size of encoded length
   429  	return n0 + n1 + n2
   430  }
   431  
   432  // Encode a group struct.
   433  func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error {
   434  	var state errorState
   435  	b := structPointer_GetStructPointer(base, p.field)
   436  	if structPointer_IsNil(b) {
   437  		return ErrNil
   438  	}
   439  
   440  	o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup))
   441  	err := o.enc_struct(p.stype, p.sprop, b)
   442  	if err != nil && !state.shouldContinue(err, nil) {
   443  		return err
   444  	}
   445  	o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup))
   446  	return state.err
   447  }
   448  
   449  func size_struct_group(p *Properties, base structPointer) (n int) {
   450  	b := structPointer_GetStructPointer(base, p.field)
   451  	if structPointer_IsNil(b) {
   452  		return 0
   453  	}
   454  
   455  	n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup))
   456  	n += size_struct(p.stype, p.sprop, b)
   457  	n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup))
   458  	return
   459  }
   460  
   461  // Encode a slice of bools ([]bool).
   462  func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error {
   463  	s := *structPointer_BoolSlice(base, p.field)
   464  	l := len(s)
   465  	if l == 0 {
   466  		return ErrNil
   467  	}
   468  	for _, x := range s {
   469  		o.buf = append(o.buf, p.tagcode...)
   470  		v := uint64(0)
   471  		if x {
   472  			v = 1
   473  		}
   474  		p.valEnc(o, v)
   475  	}
   476  	return nil
   477  }
   478  
   479  func size_slice_bool(p *Properties, base structPointer) int {
   480  	s := *structPointer_BoolSlice(base, p.field)
   481  	l := len(s)
   482  	if l == 0 {
   483  		return 0
   484  	}
   485  	return l * (len(p.tagcode) + 1) // each bool takes exactly one byte
   486  }
   487  
   488  // Encode a slice of bools ([]bool) in packed format.
   489  func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error {
   490  	s := *structPointer_BoolSlice(base, p.field)
   491  	l := len(s)
   492  	if l == 0 {
   493  		return ErrNil
   494  	}
   495  	o.buf = append(o.buf, p.tagcode...)
   496  	o.EncodeVarint(uint64(l)) // each bool takes exactly one byte
   497  	for _, x := range s {
   498  		v := uint64(0)
   499  		if x {
   500  			v = 1
   501  		}
   502  		p.valEnc(o, v)
   503  	}
   504  	return nil
   505  }
   506  
   507  func size_slice_packed_bool(p *Properties, base structPointer) (n int) {
   508  	s := *structPointer_BoolSlice(base, p.field)
   509  	l := len(s)
   510  	if l == 0 {
   511  		return 0
   512  	}
   513  	n += len(p.tagcode)
   514  	n += sizeVarint(uint64(l))
   515  	n += l // each bool takes exactly one byte
   516  	return
   517  }
   518  
   519  // Encode a slice of bytes ([]byte).
   520  func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error {
   521  	s := *structPointer_Bytes(base, p.field)
   522  	if s == nil {
   523  		return ErrNil
   524  	}
   525  	o.buf = append(o.buf, p.tagcode...)
   526  	o.EncodeRawBytes(s)
   527  	return nil
   528  }
   529  
   530  func size_slice_byte(p *Properties, base structPointer) (n int) {
   531  	s := *structPointer_Bytes(base, p.field)
   532  	if s == nil {
   533  		return 0
   534  	}
   535  	n += len(p.tagcode)
   536  	n += sizeRawBytes(s)
   537  	return
   538  }
   539  
   540  // Encode a slice of int32s ([]int32).
   541  func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error {
   542  	s := structPointer_Word32Slice(base, p.field)
   543  	l := s.Len()
   544  	if l == 0 {
   545  		return ErrNil
   546  	}
   547  	for i := 0; i < l; i++ {
   548  		o.buf = append(o.buf, p.tagcode...)
   549  		x := s.Index(i)
   550  		p.valEnc(o, uint64(x))
   551  	}
   552  	return nil
   553  }
   554  
   555  func size_slice_int32(p *Properties, base structPointer) (n int) {
   556  	s := structPointer_Word32Slice(base, p.field)
   557  	l := s.Len()
   558  	if l == 0 {
   559  		return 0
   560  	}
   561  	for i := 0; i < l; i++ {
   562  		n += len(p.tagcode)
   563  		x := s.Index(i)
   564  		n += p.valSize(uint64(x))
   565  	}
   566  	return
   567  }
   568  
   569  // Encode a slice of int32s ([]int32) in packed format.
   570  func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error {
   571  	s := structPointer_Word32Slice(base, p.field)
   572  	l := s.Len()
   573  	if l == 0 {
   574  		return ErrNil
   575  	}
   576  	// TODO: Reuse a Buffer.
   577  	buf := NewBuffer(nil)
   578  	for i := 0; i < l; i++ {
   579  		p.valEnc(buf, uint64(s.Index(i)))
   580  	}
   581  
   582  	o.buf = append(o.buf, p.tagcode...)
   583  	o.EncodeVarint(uint64(len(buf.buf)))
   584  	o.buf = append(o.buf, buf.buf...)
   585  	return nil
   586  }
   587  
   588  func size_slice_packed_int32(p *Properties, base structPointer) (n int) {
   589  	s := structPointer_Word32Slice(base, p.field)
   590  	l := s.Len()
   591  	if l == 0 {
   592  		return 0
   593  	}
   594  	var bufSize int
   595  	for i := 0; i < l; i++ {
   596  		bufSize += p.valSize(uint64(s.Index(i)))
   597  	}
   598  
   599  	n += len(p.tagcode)
   600  	n += sizeVarint(uint64(bufSize))
   601  	n += bufSize
   602  	return
   603  }
   604  
   605  // Encode a slice of int64s ([]int64).
   606  func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error {
   607  	s := structPointer_Word64Slice(base, p.field)
   608  	l := s.Len()
   609  	if l == 0 {
   610  		return ErrNil
   611  	}
   612  	for i := 0; i < l; i++ {
   613  		o.buf = append(o.buf, p.tagcode...)
   614  		p.valEnc(o, s.Index(i))
   615  	}
   616  	return nil
   617  }
   618  
   619  func size_slice_int64(p *Properties, base structPointer) (n int) {
   620  	s := structPointer_Word64Slice(base, p.field)
   621  	l := s.Len()
   622  	if l == 0 {
   623  		return 0
   624  	}
   625  	for i := 0; i < l; i++ {
   626  		n += len(p.tagcode)
   627  		n += p.valSize(s.Index(i))
   628  	}
   629  	return
   630  }
   631  
   632  // Encode a slice of int64s ([]int64) in packed format.
   633  func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error {
   634  	s := structPointer_Word64Slice(base, p.field)
   635  	l := s.Len()
   636  	if l == 0 {
   637  		return ErrNil
   638  	}
   639  	// TODO: Reuse a Buffer.
   640  	buf := NewBuffer(nil)
   641  	for i := 0; i < l; i++ {
   642  		p.valEnc(buf, s.Index(i))
   643  	}
   644  
   645  	o.buf = append(o.buf, p.tagcode...)
   646  	o.EncodeVarint(uint64(len(buf.buf)))
   647  	o.buf = append(o.buf, buf.buf...)
   648  	return nil
   649  }
   650  
   651  func size_slice_packed_int64(p *Properties, base structPointer) (n int) {
   652  	s := structPointer_Word64Slice(base, p.field)
   653  	l := s.Len()
   654  	if l == 0 {
   655  		return 0
   656  	}
   657  	var bufSize int
   658  	for i := 0; i < l; i++ {
   659  		bufSize += p.valSize(s.Index(i))
   660  	}
   661  
   662  	n += len(p.tagcode)
   663  	n += sizeVarint(uint64(bufSize))
   664  	n += bufSize
   665  	return
   666  }
   667  
   668  // Encode a slice of slice of bytes ([][]byte).
   669  func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error {
   670  	ss := *structPointer_BytesSlice(base, p.field)
   671  	l := len(ss)
   672  	if l == 0 {
   673  		return ErrNil
   674  	}
   675  	for i := 0; i < l; i++ {
   676  		o.buf = append(o.buf, p.tagcode...)
   677  		o.EncodeRawBytes(ss[i])
   678  	}
   679  	return nil
   680  }
   681  
   682  func size_slice_slice_byte(p *Properties, base structPointer) (n int) {
   683  	ss := *structPointer_BytesSlice(base, p.field)
   684  	l := len(ss)
   685  	if l == 0 {
   686  		return 0
   687  	}
   688  	n += l * len(p.tagcode)
   689  	for i := 0; i < l; i++ {
   690  		n += sizeRawBytes(ss[i])
   691  	}
   692  	return
   693  }
   694  
   695  // Encode a slice of strings ([]string).
   696  func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error {
   697  	ss := *structPointer_StringSlice(base, p.field)
   698  	l := len(ss)
   699  	for i := 0; i < l; i++ {
   700  		o.buf = append(o.buf, p.tagcode...)
   701  		o.EncodeStringBytes(ss[i])
   702  	}
   703  	return nil
   704  }
   705  
   706  func size_slice_string(p *Properties, base structPointer) (n int) {
   707  	ss := *structPointer_StringSlice(base, p.field)
   708  	l := len(ss)
   709  	n += l * len(p.tagcode)
   710  	for i := 0; i < l; i++ {
   711  		n += sizeStringBytes(ss[i])
   712  	}
   713  	return
   714  }
   715  
   716  // Encode a slice of message structs ([]*struct).
   717  func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error {
   718  	var state errorState
   719  	s := structPointer_StructPointerSlice(base, p.field)
   720  	l := s.Len()
   721  
   722  	for i := 0; i < l; i++ {
   723  		structp := s.Index(i)
   724  		if structPointer_IsNil(structp) {
   725  			return ErrRepeatedHasNil
   726  		}
   727  
   728  		// Can the object marshal itself?
   729  		if p.isMarshaler {
   730  			m := structPointer_Interface(structp, p.stype).(Marshaler)
   731  			data, err := m.Marshal()
   732  			if err != nil && !state.shouldContinue(err, nil) {
   733  				return err
   734  			}
   735  			o.buf = append(o.buf, p.tagcode...)
   736  			o.EncodeRawBytes(data)
   737  			continue
   738  		}
   739  
   740  		o.buf = append(o.buf, p.tagcode...)
   741  		err := o.enc_len_struct(p.stype, p.sprop, structp, &state)
   742  		if err != nil && !state.shouldContinue(err, nil) {
   743  			if err == ErrNil {
   744  				return ErrRepeatedHasNil
   745  			}
   746  			return err
   747  		}
   748  	}
   749  	return state.err
   750  }
   751  
   752  func size_slice_struct_message(p *Properties, base structPointer) (n int) {
   753  	s := structPointer_StructPointerSlice(base, p.field)
   754  	l := s.Len()
   755  	n += l * len(p.tagcode)
   756  	for i := 0; i < l; i++ {
   757  		structp := s.Index(i)
   758  		if structPointer_IsNil(structp) {
   759  			return // return the size up to this point
   760  		}
   761  
   762  		// Can the object marshal itself?
   763  		if p.isMarshaler {
   764  			m := structPointer_Interface(structp, p.stype).(Marshaler)
   765  			data, _ := m.Marshal()
   766  			n += len(p.tagcode)
   767  			n += sizeRawBytes(data)
   768  			continue
   769  		}
   770  
   771  		n0 := size_struct(p.stype, p.sprop, structp)
   772  		n1 := sizeVarint(uint64(n0)) // size of encoded length
   773  		n += n0 + n1
   774  	}
   775  	return
   776  }
   777  
   778  // Encode a slice of group structs ([]*struct).
   779  func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error {
   780  	var state errorState
   781  	s := structPointer_StructPointerSlice(base, p.field)
   782  	l := s.Len()
   783  
   784  	for i := 0; i < l; i++ {
   785  		b := s.Index(i)
   786  		if structPointer_IsNil(b) {
   787  			return ErrRepeatedHasNil
   788  		}
   789  
   790  		o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup))
   791  
   792  		err := o.enc_struct(p.stype, p.sprop, b)
   793  
   794  		if err != nil && !state.shouldContinue(err, nil) {
   795  			if err == ErrNil {
   796  				return ErrRepeatedHasNil
   797  			}
   798  			return err
   799  		}
   800  
   801  		o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup))
   802  	}
   803  	return state.err
   804  }
   805  
   806  func size_slice_struct_group(p *Properties, base structPointer) (n int) {
   807  	s := structPointer_StructPointerSlice(base, p.field)
   808  	l := s.Len()
   809  
   810  	n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup))
   811  	n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup))
   812  	for i := 0; i < l; i++ {
   813  		b := s.Index(i)
   814  		if structPointer_IsNil(b) {
   815  			return // return size up to this point
   816  		}
   817  
   818  		n += size_struct(p.stype, p.sprop, b)
   819  	}
   820  	return
   821  }
   822  
   823  // Encode an extension map.
   824  func (o *Buffer) enc_map(p *Properties, base structPointer) error {
   825  	v := *structPointer_ExtMap(base, p.field)
   826  	if err := encodeExtensionMap(v); err != nil {
   827  		return err
   828  	}
   829  	// Fast-path for common cases: zero or one extensions.
   830  	if len(v) <= 1 {
   831  		for _, e := range v {
   832  			o.buf = append(o.buf, e.enc...)
   833  		}
   834  		return nil
   835  	}
   836  
   837  	// Sort keys to provide a deterministic encoding.
   838  	keys := make([]int, 0, len(v))
   839  	for k := range v {
   840  		keys = append(keys, int(k))
   841  	}
   842  	sort.Ints(keys)
   843  
   844  	for _, k := range keys {
   845  		o.buf = append(o.buf, v[int32(k)].enc...)
   846  	}
   847  	return nil
   848  }
   849  
   850  func size_map(p *Properties, base structPointer) int {
   851  	v := *structPointer_ExtMap(base, p.field)
   852  	return sizeExtensionMap(v)
   853  }
   854  
   855  // Encode a struct.
   856  func (o *Buffer) enc_struct(t reflect.Type, prop *StructProperties, base structPointer) error {
   857  	var state errorState
   858  	// Encode fields in tag order so that decoders may use optimizations
   859  	// that depend on the ordering.
   860  	// http://code.google.com/apis/protocolbuffers/docs/encoding.html#order
   861  	for _, i := range prop.order {
   862  		p := prop.Prop[i]
   863  		if p.enc != nil {
   864  			err := p.enc(o, p, base)
   865  			if err != nil {
   866  				if err == ErrNil {
   867  					if p.Required && state.err == nil {
   868  						state.err = &RequiredNotSetError{p.Name}
   869  					}
   870  				} else if !state.shouldContinue(err, p) {
   871  					return err
   872  				}
   873  			}
   874  		}
   875  	}
   876  
   877  	// Add unrecognized fields at the end.
   878  	if prop.unrecField.IsValid() {
   879  		v := *structPointer_Bytes(base, prop.unrecField)
   880  		if len(v) > 0 {
   881  			o.buf = append(o.buf, v...)
   882  		}
   883  	}
   884  
   885  	return state.err
   886  }
   887  
   888  func size_struct(t reflect.Type, prop *StructProperties, base structPointer) (n int) {
   889  	for _, i := range prop.order {
   890  		p := prop.Prop[i]
   891  		if p.size != nil {
   892  			n += p.size(p, base)
   893  		}
   894  	}
   895  
   896  	// Add unrecognized fields at the end.
   897  	if prop.unrecField.IsValid() {
   898  		v := *structPointer_Bytes(base, prop.unrecField)
   899  		n += len(v)
   900  	}
   901  
   902  	return
   903  }
   904  
   905  var zeroes [20]byte // longer than any conceivable sizeVarint
   906  
   907  // Encode a struct, preceded by its encoded length (as a varint).
   908  func (o *Buffer) enc_len_struct(t reflect.Type, prop *StructProperties, base structPointer, state *errorState) error {
   909  	iLen := len(o.buf)
   910  	o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length
   911  	iMsg := len(o.buf)
   912  	err := o.enc_struct(t, prop, base)
   913  	if err != nil && !state.shouldContinue(err, nil) {
   914  		return err
   915  	}
   916  	lMsg := len(o.buf) - iMsg
   917  	lLen := sizeVarint(uint64(lMsg))
   918  	switch x := lLen - (iMsg - iLen); {
   919  	case x > 0: // actual length is x bytes larger than the space we reserved
   920  		// Move msg x bytes right.
   921  		o.buf = append(o.buf, zeroes[:x]...)
   922  		copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg])
   923  	case x < 0: // actual length is x bytes smaller than the space we reserved
   924  		// Move msg x bytes left.
   925  		copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg])
   926  		o.buf = o.buf[:len(o.buf)+x] // x is negative
   927  	}
   928  	// Encode the length in the reserved space.
   929  	o.buf = o.buf[:iLen]
   930  	o.EncodeVarint(uint64(lMsg))
   931  	o.buf = o.buf[:len(o.buf)+lMsg]
   932  	return state.err
   933  }
   934  
   935  // errorState maintains the first error that occurs and updates that error
   936  // with additional context.
   937  type errorState struct {
   938  	err error
   939  }
   940  
   941  // shouldContinue reports whether encoding should continue upon encountering the
   942  // given error. If the error is RequiredNotSetError, shouldContinue returns true
   943  // and, if this is the first appearance of that error, remembers it for future
   944  // reporting.
   945  //
   946  // If prop is not nil, it may update any error with additional context about the
   947  // field with the error.
   948  func (s *errorState) shouldContinue(err error, prop *Properties) bool {
   949  	// Ignore unset required fields.
   950  	reqNotSet, ok := err.(*RequiredNotSetError)
   951  	if !ok {
   952  		return false
   953  	}
   954  	if s.err == nil {
   955  		if prop != nil {
   956  			err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field}
   957  		}
   958  		s.err = err
   959  	}
   960  	return true
   961  }