1*890232f2SAndroid Build Coastguard Workerpackage flatbuffers 2*890232f2SAndroid Build Coastguard Worker 3*890232f2SAndroid Build Coastguard Workerimport ( 4*890232f2SAndroid Build Coastguard Worker "math" 5*890232f2SAndroid Build Coastguard Worker) 6*890232f2SAndroid Build Coastguard Worker 7*890232f2SAndroid Build Coastguard Workertype ( 8*890232f2SAndroid Build Coastguard Worker // A SOffsetT stores a signed offset into arbitrary data. 9*890232f2SAndroid Build Coastguard Worker SOffsetT int32 10*890232f2SAndroid Build Coastguard Worker // A UOffsetT stores an unsigned offset into vector data. 11*890232f2SAndroid Build Coastguard Worker UOffsetT uint32 12*890232f2SAndroid Build Coastguard Worker // A VOffsetT stores an unsigned offset in a vtable. 13*890232f2SAndroid Build Coastguard Worker VOffsetT uint16 14*890232f2SAndroid Build Coastguard Worker) 15*890232f2SAndroid Build Coastguard Worker 16*890232f2SAndroid Build Coastguard Workerconst ( 17*890232f2SAndroid Build Coastguard Worker // VtableMetadataFields is the count of metadata fields in each vtable. 18*890232f2SAndroid Build Coastguard Worker VtableMetadataFields = 2 19*890232f2SAndroid Build Coastguard Worker) 20*890232f2SAndroid Build Coastguard Worker 21*890232f2SAndroid Build Coastguard Worker// GetByte decodes a little-endian byte from a byte slice. 22*890232f2SAndroid Build Coastguard Workerfunc GetByte(buf []byte) byte { 23*890232f2SAndroid Build Coastguard Worker return byte(GetUint8(buf)) 24*890232f2SAndroid Build Coastguard Worker} 25*890232f2SAndroid Build Coastguard Worker 26*890232f2SAndroid Build Coastguard Worker// GetBool decodes a little-endian bool from a byte slice. 27*890232f2SAndroid Build Coastguard Workerfunc GetBool(buf []byte) bool { 28*890232f2SAndroid Build Coastguard Worker return buf[0] == 1 29*890232f2SAndroid Build Coastguard Worker} 30*890232f2SAndroid Build Coastguard Worker 31*890232f2SAndroid Build Coastguard Worker// GetUint8 decodes a little-endian uint8 from a byte slice. 32*890232f2SAndroid Build Coastguard Workerfunc GetUint8(buf []byte) (n uint8) { 33*890232f2SAndroid Build Coastguard Worker n = uint8(buf[0]) 34*890232f2SAndroid Build Coastguard Worker return 35*890232f2SAndroid Build Coastguard Worker} 36*890232f2SAndroid Build Coastguard Worker 37*890232f2SAndroid Build Coastguard Worker// GetUint16 decodes a little-endian uint16 from a byte slice. 38*890232f2SAndroid Build Coastguard Workerfunc GetUint16(buf []byte) (n uint16) { 39*890232f2SAndroid Build Coastguard Worker _ = buf[1] // Force one bounds check. See: golang.org/issue/14808 40*890232f2SAndroid Build Coastguard Worker n |= uint16(buf[0]) 41*890232f2SAndroid Build Coastguard Worker n |= uint16(buf[1]) << 8 42*890232f2SAndroid Build Coastguard Worker return 43*890232f2SAndroid Build Coastguard Worker} 44*890232f2SAndroid Build Coastguard Worker 45*890232f2SAndroid Build Coastguard Worker// GetUint32 decodes a little-endian uint32 from a byte slice. 46*890232f2SAndroid Build Coastguard Workerfunc GetUint32(buf []byte) (n uint32) { 47*890232f2SAndroid Build Coastguard Worker _ = buf[3] // Force one bounds check. See: golang.org/issue/14808 48*890232f2SAndroid Build Coastguard Worker n |= uint32(buf[0]) 49*890232f2SAndroid Build Coastguard Worker n |= uint32(buf[1]) << 8 50*890232f2SAndroid Build Coastguard Worker n |= uint32(buf[2]) << 16 51*890232f2SAndroid Build Coastguard Worker n |= uint32(buf[3]) << 24 52*890232f2SAndroid Build Coastguard Worker return 53*890232f2SAndroid Build Coastguard Worker} 54*890232f2SAndroid Build Coastguard Worker 55*890232f2SAndroid Build Coastguard Worker// GetUint64 decodes a little-endian uint64 from a byte slice. 56*890232f2SAndroid Build Coastguard Workerfunc GetUint64(buf []byte) (n uint64) { 57*890232f2SAndroid Build Coastguard Worker _ = buf[7] // Force one bounds check. See: golang.org/issue/14808 58*890232f2SAndroid Build Coastguard Worker n |= uint64(buf[0]) 59*890232f2SAndroid Build Coastguard Worker n |= uint64(buf[1]) << 8 60*890232f2SAndroid Build Coastguard Worker n |= uint64(buf[2]) << 16 61*890232f2SAndroid Build Coastguard Worker n |= uint64(buf[3]) << 24 62*890232f2SAndroid Build Coastguard Worker n |= uint64(buf[4]) << 32 63*890232f2SAndroid Build Coastguard Worker n |= uint64(buf[5]) << 40 64*890232f2SAndroid Build Coastguard Worker n |= uint64(buf[6]) << 48 65*890232f2SAndroid Build Coastguard Worker n |= uint64(buf[7]) << 56 66*890232f2SAndroid Build Coastguard Worker return 67*890232f2SAndroid Build Coastguard Worker} 68*890232f2SAndroid Build Coastguard Worker 69*890232f2SAndroid Build Coastguard Worker// GetInt8 decodes a little-endian int8 from a byte slice. 70*890232f2SAndroid Build Coastguard Workerfunc GetInt8(buf []byte) (n int8) { 71*890232f2SAndroid Build Coastguard Worker n = int8(buf[0]) 72*890232f2SAndroid Build Coastguard Worker return 73*890232f2SAndroid Build Coastguard Worker} 74*890232f2SAndroid Build Coastguard Worker 75*890232f2SAndroid Build Coastguard Worker// GetInt16 decodes a little-endian int16 from a byte slice. 76*890232f2SAndroid Build Coastguard Workerfunc GetInt16(buf []byte) (n int16) { 77*890232f2SAndroid Build Coastguard Worker _ = buf[1] // Force one bounds check. See: golang.org/issue/14808 78*890232f2SAndroid Build Coastguard Worker n |= int16(buf[0]) 79*890232f2SAndroid Build Coastguard Worker n |= int16(buf[1]) << 8 80*890232f2SAndroid Build Coastguard Worker return 81*890232f2SAndroid Build Coastguard Worker} 82*890232f2SAndroid Build Coastguard Worker 83*890232f2SAndroid Build Coastguard Worker// GetInt32 decodes a little-endian int32 from a byte slice. 84*890232f2SAndroid Build Coastguard Workerfunc GetInt32(buf []byte) (n int32) { 85*890232f2SAndroid Build Coastguard Worker _ = buf[3] // Force one bounds check. See: golang.org/issue/14808 86*890232f2SAndroid Build Coastguard Worker n |= int32(buf[0]) 87*890232f2SAndroid Build Coastguard Worker n |= int32(buf[1]) << 8 88*890232f2SAndroid Build Coastguard Worker n |= int32(buf[2]) << 16 89*890232f2SAndroid Build Coastguard Worker n |= int32(buf[3]) << 24 90*890232f2SAndroid Build Coastguard Worker return 91*890232f2SAndroid Build Coastguard Worker} 92*890232f2SAndroid Build Coastguard Worker 93*890232f2SAndroid Build Coastguard Worker// GetInt64 decodes a little-endian int64 from a byte slice. 94*890232f2SAndroid Build Coastguard Workerfunc GetInt64(buf []byte) (n int64) { 95*890232f2SAndroid Build Coastguard Worker _ = buf[7] // Force one bounds check. See: golang.org/issue/14808 96*890232f2SAndroid Build Coastguard Worker n |= int64(buf[0]) 97*890232f2SAndroid Build Coastguard Worker n |= int64(buf[1]) << 8 98*890232f2SAndroid Build Coastguard Worker n |= int64(buf[2]) << 16 99*890232f2SAndroid Build Coastguard Worker n |= int64(buf[3]) << 24 100*890232f2SAndroid Build Coastguard Worker n |= int64(buf[4]) << 32 101*890232f2SAndroid Build Coastguard Worker n |= int64(buf[5]) << 40 102*890232f2SAndroid Build Coastguard Worker n |= int64(buf[6]) << 48 103*890232f2SAndroid Build Coastguard Worker n |= int64(buf[7]) << 56 104*890232f2SAndroid Build Coastguard Worker return 105*890232f2SAndroid Build Coastguard Worker} 106*890232f2SAndroid Build Coastguard Worker 107*890232f2SAndroid Build Coastguard Worker// GetFloat32 decodes a little-endian float32 from a byte slice. 108*890232f2SAndroid Build Coastguard Workerfunc GetFloat32(buf []byte) float32 { 109*890232f2SAndroid Build Coastguard Worker x := GetUint32(buf) 110*890232f2SAndroid Build Coastguard Worker return math.Float32frombits(x) 111*890232f2SAndroid Build Coastguard Worker} 112*890232f2SAndroid Build Coastguard Worker 113*890232f2SAndroid Build Coastguard Worker// GetFloat64 decodes a little-endian float64 from a byte slice. 114*890232f2SAndroid Build Coastguard Workerfunc GetFloat64(buf []byte) float64 { 115*890232f2SAndroid Build Coastguard Worker x := GetUint64(buf) 116*890232f2SAndroid Build Coastguard Worker return math.Float64frombits(x) 117*890232f2SAndroid Build Coastguard Worker} 118*890232f2SAndroid Build Coastguard Worker 119*890232f2SAndroid Build Coastguard Worker// GetUOffsetT decodes a little-endian UOffsetT from a byte slice. 120*890232f2SAndroid Build Coastguard Workerfunc GetUOffsetT(buf []byte) UOffsetT { 121*890232f2SAndroid Build Coastguard Worker return UOffsetT(GetUint32(buf)) 122*890232f2SAndroid Build Coastguard Worker} 123*890232f2SAndroid Build Coastguard Worker 124*890232f2SAndroid Build Coastguard Worker// GetSOffsetT decodes a little-endian SOffsetT from a byte slice. 125*890232f2SAndroid Build Coastguard Workerfunc GetSOffsetT(buf []byte) SOffsetT { 126*890232f2SAndroid Build Coastguard Worker return SOffsetT(GetInt32(buf)) 127*890232f2SAndroid Build Coastguard Worker} 128*890232f2SAndroid Build Coastguard Worker 129*890232f2SAndroid Build Coastguard Worker// GetVOffsetT decodes a little-endian VOffsetT from a byte slice. 130*890232f2SAndroid Build Coastguard Workerfunc GetVOffsetT(buf []byte) VOffsetT { 131*890232f2SAndroid Build Coastguard Worker return VOffsetT(GetUint16(buf)) 132*890232f2SAndroid Build Coastguard Worker} 133*890232f2SAndroid Build Coastguard Worker 134*890232f2SAndroid Build Coastguard Worker// WriteByte encodes a little-endian uint8 into a byte slice. 135*890232f2SAndroid Build Coastguard Workerfunc WriteByte(buf []byte, n byte) { 136*890232f2SAndroid Build Coastguard Worker WriteUint8(buf, uint8(n)) 137*890232f2SAndroid Build Coastguard Worker} 138*890232f2SAndroid Build Coastguard Worker 139*890232f2SAndroid Build Coastguard Worker// WriteBool encodes a little-endian bool into a byte slice. 140*890232f2SAndroid Build Coastguard Workerfunc WriteBool(buf []byte, b bool) { 141*890232f2SAndroid Build Coastguard Worker buf[0] = 0 142*890232f2SAndroid Build Coastguard Worker if b { 143*890232f2SAndroid Build Coastguard Worker buf[0] = 1 144*890232f2SAndroid Build Coastguard Worker } 145*890232f2SAndroid Build Coastguard Worker} 146*890232f2SAndroid Build Coastguard Worker 147*890232f2SAndroid Build Coastguard Worker// WriteUint8 encodes a little-endian uint8 into a byte slice. 148*890232f2SAndroid Build Coastguard Workerfunc WriteUint8(buf []byte, n uint8) { 149*890232f2SAndroid Build Coastguard Worker buf[0] = byte(n) 150*890232f2SAndroid Build Coastguard Worker} 151*890232f2SAndroid Build Coastguard Worker 152*890232f2SAndroid Build Coastguard Worker// WriteUint16 encodes a little-endian uint16 into a byte slice. 153*890232f2SAndroid Build Coastguard Workerfunc WriteUint16(buf []byte, n uint16) { 154*890232f2SAndroid Build Coastguard Worker _ = buf[1] // Force one bounds check. See: golang.org/issue/14808 155*890232f2SAndroid Build Coastguard Worker buf[0] = byte(n) 156*890232f2SAndroid Build Coastguard Worker buf[1] = byte(n >> 8) 157*890232f2SAndroid Build Coastguard Worker} 158*890232f2SAndroid Build Coastguard Worker 159*890232f2SAndroid Build Coastguard Worker// WriteUint32 encodes a little-endian uint32 into a byte slice. 160*890232f2SAndroid Build Coastguard Workerfunc WriteUint32(buf []byte, n uint32) { 161*890232f2SAndroid Build Coastguard Worker _ = buf[3] // Force one bounds check. See: golang.org/issue/14808 162*890232f2SAndroid Build Coastguard Worker buf[0] = byte(n) 163*890232f2SAndroid Build Coastguard Worker buf[1] = byte(n >> 8) 164*890232f2SAndroid Build Coastguard Worker buf[2] = byte(n >> 16) 165*890232f2SAndroid Build Coastguard Worker buf[3] = byte(n >> 24) 166*890232f2SAndroid Build Coastguard Worker} 167*890232f2SAndroid Build Coastguard Worker 168*890232f2SAndroid Build Coastguard Worker// WriteUint64 encodes a little-endian uint64 into a byte slice. 169*890232f2SAndroid Build Coastguard Workerfunc WriteUint64(buf []byte, n uint64) { 170*890232f2SAndroid Build Coastguard Worker _ = buf[7] // Force one bounds check. See: golang.org/issue/14808 171*890232f2SAndroid Build Coastguard Worker buf[0] = byte(n) 172*890232f2SAndroid Build Coastguard Worker buf[1] = byte(n >> 8) 173*890232f2SAndroid Build Coastguard Worker buf[2] = byte(n >> 16) 174*890232f2SAndroid Build Coastguard Worker buf[3] = byte(n >> 24) 175*890232f2SAndroid Build Coastguard Worker buf[4] = byte(n >> 32) 176*890232f2SAndroid Build Coastguard Worker buf[5] = byte(n >> 40) 177*890232f2SAndroid Build Coastguard Worker buf[6] = byte(n >> 48) 178*890232f2SAndroid Build Coastguard Worker buf[7] = byte(n >> 56) 179*890232f2SAndroid Build Coastguard Worker} 180*890232f2SAndroid Build Coastguard Worker 181*890232f2SAndroid Build Coastguard Worker// WriteInt8 encodes a little-endian int8 into a byte slice. 182*890232f2SAndroid Build Coastguard Workerfunc WriteInt8(buf []byte, n int8) { 183*890232f2SAndroid Build Coastguard Worker buf[0] = byte(n) 184*890232f2SAndroid Build Coastguard Worker} 185*890232f2SAndroid Build Coastguard Worker 186*890232f2SAndroid Build Coastguard Worker// WriteInt16 encodes a little-endian int16 into a byte slice. 187*890232f2SAndroid Build Coastguard Workerfunc WriteInt16(buf []byte, n int16) { 188*890232f2SAndroid Build Coastguard Worker _ = buf[1] // Force one bounds check. See: golang.org/issue/14808 189*890232f2SAndroid Build Coastguard Worker buf[0] = byte(n) 190*890232f2SAndroid Build Coastguard Worker buf[1] = byte(n >> 8) 191*890232f2SAndroid Build Coastguard Worker} 192*890232f2SAndroid Build Coastguard Worker 193*890232f2SAndroid Build Coastguard Worker// WriteInt32 encodes a little-endian int32 into a byte slice. 194*890232f2SAndroid Build Coastguard Workerfunc WriteInt32(buf []byte, n int32) { 195*890232f2SAndroid Build Coastguard Worker _ = buf[3] // Force one bounds check. See: golang.org/issue/14808 196*890232f2SAndroid Build Coastguard Worker buf[0] = byte(n) 197*890232f2SAndroid Build Coastguard Worker buf[1] = byte(n >> 8) 198*890232f2SAndroid Build Coastguard Worker buf[2] = byte(n >> 16) 199*890232f2SAndroid Build Coastguard Worker buf[3] = byte(n >> 24) 200*890232f2SAndroid Build Coastguard Worker} 201*890232f2SAndroid Build Coastguard Worker 202*890232f2SAndroid Build Coastguard Worker// WriteInt64 encodes a little-endian int64 into a byte slice. 203*890232f2SAndroid Build Coastguard Workerfunc WriteInt64(buf []byte, n int64) { 204*890232f2SAndroid Build Coastguard Worker _ = buf[7] // Force one bounds check. See: golang.org/issue/14808 205*890232f2SAndroid Build Coastguard Worker buf[0] = byte(n) 206*890232f2SAndroid Build Coastguard Worker buf[1] = byte(n >> 8) 207*890232f2SAndroid Build Coastguard Worker buf[2] = byte(n >> 16) 208*890232f2SAndroid Build Coastguard Worker buf[3] = byte(n >> 24) 209*890232f2SAndroid Build Coastguard Worker buf[4] = byte(n >> 32) 210*890232f2SAndroid Build Coastguard Worker buf[5] = byte(n >> 40) 211*890232f2SAndroid Build Coastguard Worker buf[6] = byte(n >> 48) 212*890232f2SAndroid Build Coastguard Worker buf[7] = byte(n >> 56) 213*890232f2SAndroid Build Coastguard Worker} 214*890232f2SAndroid Build Coastguard Worker 215*890232f2SAndroid Build Coastguard Worker// WriteFloat32 encodes a little-endian float32 into a byte slice. 216*890232f2SAndroid Build Coastguard Workerfunc WriteFloat32(buf []byte, n float32) { 217*890232f2SAndroid Build Coastguard Worker WriteUint32(buf, math.Float32bits(n)) 218*890232f2SAndroid Build Coastguard Worker} 219*890232f2SAndroid Build Coastguard Worker 220*890232f2SAndroid Build Coastguard Worker// WriteFloat64 encodes a little-endian float64 into a byte slice. 221*890232f2SAndroid Build Coastguard Workerfunc WriteFloat64(buf []byte, n float64) { 222*890232f2SAndroid Build Coastguard Worker WriteUint64(buf, math.Float64bits(n)) 223*890232f2SAndroid Build Coastguard Worker} 224*890232f2SAndroid Build Coastguard Worker 225*890232f2SAndroid Build Coastguard Worker// WriteVOffsetT encodes a little-endian VOffsetT into a byte slice. 226*890232f2SAndroid Build Coastguard Workerfunc WriteVOffsetT(buf []byte, n VOffsetT) { 227*890232f2SAndroid Build Coastguard Worker WriteUint16(buf, uint16(n)) 228*890232f2SAndroid Build Coastguard Worker} 229*890232f2SAndroid Build Coastguard Worker 230*890232f2SAndroid Build Coastguard Worker// WriteSOffsetT encodes a little-endian SOffsetT into a byte slice. 231*890232f2SAndroid Build Coastguard Workerfunc WriteSOffsetT(buf []byte, n SOffsetT) { 232*890232f2SAndroid Build Coastguard Worker WriteInt32(buf, int32(n)) 233*890232f2SAndroid Build Coastguard Worker} 234*890232f2SAndroid Build Coastguard Worker 235*890232f2SAndroid Build Coastguard Worker// WriteUOffsetT encodes a little-endian UOffsetT into a byte slice. 236*890232f2SAndroid Build Coastguard Workerfunc WriteUOffsetT(buf []byte, n UOffsetT) { 237*890232f2SAndroid Build Coastguard Worker WriteUint32(buf, uint32(n)) 238*890232f2SAndroid Build Coastguard Worker} 239