1// Protocol Buffers for Go with Gadgets 2// 3// Copyright (c) 2013, The GoGo Authors. All rights reserved. 4// http://github.com/gogo/protobuf 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// 17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29package proto 30 31import ( 32 "fmt" 33 "os" 34 "reflect" 35) 36 37func (p *Properties) setCustomEncAndDec(typ reflect.Type) { 38 p.ctype = typ 39 if p.Repeated { 40 p.enc = (*Buffer).enc_custom_slice_bytes 41 p.dec = (*Buffer).dec_custom_slice_bytes 42 p.size = size_custom_slice_bytes 43 } else if typ.Kind() == reflect.Ptr { 44 p.enc = (*Buffer).enc_custom_bytes 45 p.dec = (*Buffer).dec_custom_bytes 46 p.size = size_custom_bytes 47 } else { 48 p.enc = (*Buffer).enc_custom_ref_bytes 49 p.dec = (*Buffer).dec_custom_ref_bytes 50 p.size = size_custom_ref_bytes 51 } 52} 53 54func (p *Properties) setSliceOfNonPointerStructs(typ reflect.Type) { 55 t2 := typ.Elem() 56 p.sstype = typ 57 p.stype = t2 58 p.isMarshaler = isMarshaler(t2) 59 p.isUnmarshaler = isUnmarshaler(t2) 60 p.enc = (*Buffer).enc_slice_ref_struct_message 61 p.dec = (*Buffer).dec_slice_ref_struct_message 62 p.size = size_slice_ref_struct_message 63 if p.Wire != "bytes" { 64 fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T \n", typ, t2) 65 } 66} 67