Austin Schuh | e89fa2d | 2019-08-14 20:24:23 -0700 | [diff] [blame] | 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 | _ = buf[1] // Force one bounds check. See: golang.org/issue/14808 |
| 40 | n |= uint16(buf[0]) |
| 41 | n |= uint16(buf[1]) << 8 |
| 42 | return |
| 43 | } |
| 44 | |
| 45 | // GetUint32 decodes a little-endian uint32 from a byte slice. |
| 46 | func GetUint32(buf []byte) (n uint32) { |
| 47 | _ = buf[3] // Force one bounds check. See: golang.org/issue/14808 |
| 48 | n |= uint32(buf[0]) |
| 49 | n |= uint32(buf[1]) << 8 |
| 50 | n |= uint32(buf[2]) << 16 |
| 51 | n |= uint32(buf[3]) << 24 |
| 52 | return |
| 53 | } |
| 54 | |
| 55 | // GetUint64 decodes a little-endian uint64 from a byte slice. |
| 56 | func GetUint64(buf []byte) (n uint64) { |
| 57 | _ = buf[7] // Force one bounds check. See: golang.org/issue/14808 |
| 58 | n |= uint64(buf[0]) |
| 59 | n |= uint64(buf[1]) << 8 |
| 60 | n |= uint64(buf[2]) << 16 |
| 61 | n |= uint64(buf[3]) << 24 |
| 62 | n |= uint64(buf[4]) << 32 |
| 63 | n |= uint64(buf[5]) << 40 |
| 64 | n |= uint64(buf[6]) << 48 |
| 65 | n |= uint64(buf[7]) << 56 |
| 66 | return |
| 67 | } |
| 68 | |
| 69 | // GetInt8 decodes a little-endian int8 from a byte slice. |
| 70 | func GetInt8(buf []byte) (n int8) { |
| 71 | n = int8(buf[0]) |
| 72 | return |
| 73 | } |
| 74 | |
| 75 | // GetInt16 decodes a little-endian int16 from a byte slice. |
| 76 | func GetInt16(buf []byte) (n int16) { |
| 77 | _ = buf[1] // Force one bounds check. See: golang.org/issue/14808 |
| 78 | n |= int16(buf[0]) |
| 79 | n |= int16(buf[1]) << 8 |
| 80 | return |
| 81 | } |
| 82 | |
| 83 | // GetInt32 decodes a little-endian int32 from a byte slice. |
| 84 | func GetInt32(buf []byte) (n int32) { |
| 85 | _ = buf[3] // Force one bounds check. See: golang.org/issue/14808 |
| 86 | n |= int32(buf[0]) |
| 87 | n |= int32(buf[1]) << 8 |
| 88 | n |= int32(buf[2]) << 16 |
| 89 | n |= int32(buf[3]) << 24 |
| 90 | return |
| 91 | } |
| 92 | |
| 93 | // GetInt64 decodes a little-endian int64 from a byte slice. |
| 94 | func GetInt64(buf []byte) (n int64) { |
| 95 | _ = buf[7] // Force one bounds check. See: golang.org/issue/14808 |
| 96 | n |= int64(buf[0]) |
| 97 | n |= int64(buf[1]) << 8 |
| 98 | n |= int64(buf[2]) << 16 |
| 99 | n |= int64(buf[3]) << 24 |
| 100 | n |= int64(buf[4]) << 32 |
| 101 | n |= int64(buf[5]) << 40 |
| 102 | n |= int64(buf[6]) << 48 |
| 103 | n |= int64(buf[7]) << 56 |
| 104 | return |
| 105 | } |
| 106 | |
| 107 | // GetFloat32 decodes a little-endian float32 from a byte slice. |
| 108 | func GetFloat32(buf []byte) float32 { |
| 109 | x := GetUint32(buf) |
| 110 | return math.Float32frombits(x) |
| 111 | } |
| 112 | |
| 113 | // GetFloat64 decodes a little-endian float64 from a byte slice. |
| 114 | func GetFloat64(buf []byte) float64 { |
| 115 | x := GetUint64(buf) |
| 116 | return math.Float64frombits(x) |
| 117 | } |
| 118 | |
| 119 | // GetUOffsetT decodes a little-endian UOffsetT from a byte slice. |
| 120 | func GetUOffsetT(buf []byte) UOffsetT { |
James Kuszmaul | 8e62b02 | 2022-03-22 09:33:25 -0700 | [diff] [blame] | 121 | return UOffsetT(GetUint32(buf)) |
Austin Schuh | e89fa2d | 2019-08-14 20:24:23 -0700 | [diff] [blame] | 122 | } |
| 123 | |
| 124 | // GetSOffsetT decodes a little-endian SOffsetT from a byte slice. |
| 125 | func GetSOffsetT(buf []byte) SOffsetT { |
| 126 | return SOffsetT(GetInt32(buf)) |
| 127 | } |
| 128 | |
| 129 | // GetVOffsetT decodes a little-endian VOffsetT from a byte slice. |
| 130 | func GetVOffsetT(buf []byte) VOffsetT { |
| 131 | return VOffsetT(GetUint16(buf)) |
| 132 | } |
| 133 | |
| 134 | // WriteByte encodes a little-endian uint8 into a byte slice. |
| 135 | func WriteByte(buf []byte, n byte) { |
| 136 | WriteUint8(buf, uint8(n)) |
| 137 | } |
| 138 | |
| 139 | // WriteBool encodes a little-endian bool into a byte slice. |
| 140 | func WriteBool(buf []byte, b bool) { |
| 141 | buf[0] = 0 |
| 142 | if b { |
| 143 | buf[0] = 1 |
| 144 | } |
| 145 | } |
| 146 | |
| 147 | // WriteUint8 encodes a little-endian uint8 into a byte slice. |
| 148 | func WriteUint8(buf []byte, n uint8) { |
| 149 | buf[0] = byte(n) |
| 150 | } |
| 151 | |
| 152 | // WriteUint16 encodes a little-endian uint16 into a byte slice. |
| 153 | func WriteUint16(buf []byte, n uint16) { |
| 154 | _ = buf[1] // Force one bounds check. See: golang.org/issue/14808 |
| 155 | buf[0] = byte(n) |
| 156 | buf[1] = byte(n >> 8) |
| 157 | } |
| 158 | |
| 159 | // WriteUint32 encodes a little-endian uint32 into a byte slice. |
| 160 | func WriteUint32(buf []byte, n uint32) { |
| 161 | _ = buf[3] // Force one bounds check. See: golang.org/issue/14808 |
| 162 | buf[0] = byte(n) |
| 163 | buf[1] = byte(n >> 8) |
| 164 | buf[2] = byte(n >> 16) |
| 165 | buf[3] = byte(n >> 24) |
| 166 | } |
| 167 | |
| 168 | // WriteUint64 encodes a little-endian uint64 into a byte slice. |
| 169 | func WriteUint64(buf []byte, n uint64) { |
| 170 | _ = buf[7] // Force one bounds check. See: golang.org/issue/14808 |
| 171 | buf[0] = byte(n) |
| 172 | buf[1] = byte(n >> 8) |
| 173 | buf[2] = byte(n >> 16) |
| 174 | buf[3] = byte(n >> 24) |
| 175 | buf[4] = byte(n >> 32) |
| 176 | buf[5] = byte(n >> 40) |
| 177 | buf[6] = byte(n >> 48) |
| 178 | buf[7] = byte(n >> 56) |
| 179 | } |
| 180 | |
| 181 | // WriteInt8 encodes a little-endian int8 into a byte slice. |
| 182 | func WriteInt8(buf []byte, n int8) { |
| 183 | buf[0] = byte(n) |
| 184 | } |
| 185 | |
| 186 | // WriteInt16 encodes a little-endian int16 into a byte slice. |
| 187 | func WriteInt16(buf []byte, n int16) { |
| 188 | _ = buf[1] // Force one bounds check. See: golang.org/issue/14808 |
| 189 | buf[0] = byte(n) |
| 190 | buf[1] = byte(n >> 8) |
| 191 | } |
| 192 | |
| 193 | // WriteInt32 encodes a little-endian int32 into a byte slice. |
| 194 | func WriteInt32(buf []byte, n int32) { |
| 195 | _ = buf[3] // Force one bounds check. See: golang.org/issue/14808 |
| 196 | buf[0] = byte(n) |
| 197 | buf[1] = byte(n >> 8) |
| 198 | buf[2] = byte(n >> 16) |
| 199 | buf[3] = byte(n >> 24) |
| 200 | } |
| 201 | |
| 202 | // WriteInt64 encodes a little-endian int64 into a byte slice. |
| 203 | func WriteInt64(buf []byte, n int64) { |
| 204 | _ = buf[7] // Force one bounds check. See: golang.org/issue/14808 |
| 205 | buf[0] = byte(n) |
| 206 | buf[1] = byte(n >> 8) |
| 207 | buf[2] = byte(n >> 16) |
| 208 | buf[3] = byte(n >> 24) |
| 209 | buf[4] = byte(n >> 32) |
| 210 | buf[5] = byte(n >> 40) |
| 211 | buf[6] = byte(n >> 48) |
| 212 | buf[7] = byte(n >> 56) |
| 213 | } |
| 214 | |
| 215 | // WriteFloat32 encodes a little-endian float32 into a byte slice. |
| 216 | func WriteFloat32(buf []byte, n float32) { |
| 217 | WriteUint32(buf, math.Float32bits(n)) |
| 218 | } |
| 219 | |
| 220 | // WriteFloat64 encodes a little-endian float64 into a byte slice. |
| 221 | func WriteFloat64(buf []byte, n float64) { |
| 222 | WriteUint64(buf, math.Float64bits(n)) |
| 223 | } |
| 224 | |
| 225 | // WriteVOffsetT encodes a little-endian VOffsetT into a byte slice. |
| 226 | func WriteVOffsetT(buf []byte, n VOffsetT) { |
| 227 | WriteUint16(buf, uint16(n)) |
| 228 | } |
| 229 | |
| 230 | // WriteSOffsetT encodes a little-endian SOffsetT into a byte slice. |
| 231 | func WriteSOffsetT(buf []byte, n SOffsetT) { |
| 232 | WriteInt32(buf, int32(n)) |
| 233 | } |
| 234 | |
| 235 | // WriteUOffsetT encodes a little-endian UOffsetT into a byte slice. |
| 236 | func WriteUOffsetT(buf []byte, n UOffsetT) { |
| 237 | WriteUint32(buf, uint32(n)) |
| 238 | } |