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