github.com/chrislusf/greenpack@v3.7.1-0.20170911073826-ad5bd10b7c47+incompatible/msgp/elsize.go (about) 1 package msgp 2 3 // size of every object on the wire, 4 // plus type information. gives us 5 // constant-time type information 6 // for traversing composite objects. 7 // 8 var sizes = [256]bytespec{ 9 mnil: {size: 1, extra: constsize, typ: NilType}, 10 mfalse: {size: 1, extra: constsize, typ: BoolType}, 11 mtrue: {size: 1, extra: constsize, typ: BoolType}, 12 mbin8: {size: 2, extra: extra8, typ: BinType}, 13 mbin16: {size: 3, extra: extra16, typ: BinType}, 14 mbin32: {size: 5, extra: extra32, typ: BinType}, 15 mext8: {size: 3, extra: extra8, typ: ExtensionType}, 16 mext16: {size: 4, extra: extra16, typ: ExtensionType}, 17 mext32: {size: 6, extra: extra32, typ: ExtensionType}, 18 mfloat32: {size: 5, extra: constsize, typ: Float32Type}, 19 mfloat64: {size: 9, extra: constsize, typ: Float64Type}, 20 muint8: {size: 2, extra: constsize, typ: UintType}, 21 muint16: {size: 3, extra: constsize, typ: UintType}, 22 muint32: {size: 5, extra: constsize, typ: UintType}, 23 muint64: {size: 9, extra: constsize, typ: UintType}, 24 mint8: {size: 2, extra: constsize, typ: IntType}, 25 mint16: {size: 3, extra: constsize, typ: IntType}, 26 mint32: {size: 5, extra: constsize, typ: IntType}, 27 mint64: {size: 9, extra: constsize, typ: IntType}, 28 mfixext1: {size: 3, extra: constsize, typ: ExtensionType}, 29 mfixext2: {size: 4, extra: constsize, typ: ExtensionType}, 30 mfixext4: {size: 6, extra: constsize, typ: ExtensionType}, 31 mfixext8: {size: 10, extra: constsize, typ: ExtensionType}, 32 mfixext16: {size: 18, extra: constsize, typ: ExtensionType}, 33 mstr8: {size: 2, extra: extra8, typ: StrType}, 34 mstr16: {size: 3, extra: extra16, typ: StrType}, 35 mstr32: {size: 5, extra: extra32, typ: StrType}, 36 marray16: {size: 3, extra: array16v, typ: ArrayType}, 37 marray32: {size: 5, extra: array32v, typ: ArrayType}, 38 mmap16: {size: 3, extra: map16v, typ: MapType}, 39 mmap32: {size: 5, extra: map32v, typ: MapType}, 40 } 41 42 func init() { 43 // set up fixed fields 44 45 // fixint 46 for i := mfixint; i < 0x80; i++ { 47 sizes[i] = bytespec{size: 1, extra: constsize, typ: IntType} 48 } 49 50 // nfixint 51 for i := uint16(mnfixint); i < 0x100; i++ { 52 sizes[uint8(i)] = bytespec{size: 1, extra: constsize, typ: IntType} 53 } 54 55 // fixstr gets constsize, 56 // since the prefix yields the size 57 for i := mfixstr; i < 0xc0; i++ { 58 sizes[i] = bytespec{size: 1 + rfixstr(i), extra: constsize, typ: StrType} 59 } 60 61 // fixmap 62 for i := mfixmap; i < 0x90; i++ { 63 sizes[i] = bytespec{size: 1, extra: varmode(2 * rfixmap(i)), typ: MapType} 64 } 65 66 // fixarray 67 for i := mfixarray; i < 0xa0; i++ { 68 sizes[i] = bytespec{size: 1, extra: varmode(rfixarray(i)), typ: ArrayType} 69 } 70 } 71 72 // a valid bytespsec has 73 // non-zero 'size' and 74 // non-zero 'typ' 75 type bytespec struct { 76 size uint8 // prefix size information 77 extra varmode // extra size information 78 typ Type // type 79 _ byte // makes bytespec 4 bytes (yes, this matters) 80 } 81 82 // size mode 83 // if positive, # elements for composites 84 type varmode int8 85 86 const ( 87 constsize varmode = 0 // constant size (size bytes + uint8(varmode) objects) 88 extra8 = -1 // has uint8(p[1]) extra bytes 89 extra16 = -2 // has be16(p[1:]) extra bytes 90 extra32 = -3 // has be32(p[1:]) extra bytes 91 map16v = -4 // use map16 92 map32v = -5 // use map32 93 array16v = -6 // use array16 94 array32v = -7 // use array32 95 ) 96 97 func getType(v byte) Type { 98 return sizes[v].typ 99 }