Home | History | Annotate | Download | only in go
      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