github.com/lirm/aeron-go@v0.0.0-20230415210743-920325491dc4/cluster/codecs/SbeMarshalling.go (about) 1 // Copyright (C) 2017 MarketFactory, Inc 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at: 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 // 15 // This file provides a simple bespoke marshalling layer for the 16 // standard binary encoding golang backend and is part of: 17 // 18 // https://github.com/real-logic/simple-binary-encoding 19 20 package codecs 21 22 import ( 23 "io" 24 "math" 25 ) 26 27 // Allocate via NewSbeGoMarshaller to initialize 28 type SbeGoMarshaller struct { 29 b8 []byte // statically allocated tmp space to avoid alloc 30 b1 []byte // previously created slice into b to save time 31 b2 []byte // previously created slice into b to save time 32 b4 []byte // previously created slice into b to save time 33 } 34 35 func NewSbeGoMarshaller() *SbeGoMarshaller { 36 var m SbeGoMarshaller 37 m.b8 = make([]byte, 8) 38 m.b1 = m.b8[:1] 39 m.b2 = m.b8[:2] 40 m.b4 = m.b8[:4] 41 return &m 42 } 43 44 // The "standard" MessageHeader. 45 // 46 // Most applications will use this as it's the default and optimized 47 // although it's possible to change it by: 48 // a) using a different sized BlockLength, or 49 // b) adding arbitrary fields 50 // 51 // If the MessageHeader is not "standard" then you can use the 52 // generated MessageHeader type in MessageHeader.go otherwise we 53 // recommend this one. 54 type SbeGoMessageHeader struct { 55 BlockLength uint16 56 TemplateId uint16 57 SchemaId uint16 58 Version uint16 59 } 60 61 func (m SbeGoMessageHeader) Encode(_m *SbeGoMarshaller, _w io.Writer) error { 62 _m.b8[0] = byte(m.BlockLength) 63 _m.b8[1] = byte(m.BlockLength >> 8) 64 _m.b8[2] = byte(m.TemplateId) 65 _m.b8[3] = byte(m.TemplateId >> 8) 66 _m.b8[4] = byte(m.SchemaId) 67 _m.b8[5] = byte(m.SchemaId >> 8) 68 _m.b8[6] = byte(m.Version) 69 _m.b8[7] = byte(m.Version >> 8) 70 if _, err := _w.Write(_m.b8); err != nil { 71 return err 72 } 73 return nil 74 } 75 76 func (m *SbeGoMessageHeader) Decode(_m *SbeGoMarshaller, _r io.Reader) error { 77 if _, err := io.ReadFull(_r, _m.b8); err != nil { 78 return err 79 } 80 m.BlockLength = uint16(_m.b8[0]) | uint16(_m.b8[1])<<8 81 m.TemplateId = uint16(_m.b8[2]) | uint16(_m.b8[3])<<8 82 m.SchemaId = uint16(_m.b8[4]) | uint16(_m.b8[5])<<8 83 m.Version = uint16(_m.b8[6]) | uint16(_m.b8[7])<<8 84 return nil 85 } 86 87 func (m *SbeGoMarshaller) WriteUint8(w io.Writer, v uint8) error { 88 m.b1[0] = byte(v) 89 _, err := w.Write(m.b1) 90 return err 91 } 92 93 func (m *SbeGoMarshaller) WriteUint16(w io.Writer, v uint16) error { 94 m.b2[0] = byte(v) 95 m.b2[1] = byte(v >> 8) 96 _, err := w.Write(m.b2) 97 return err 98 } 99 100 func (m *SbeGoMarshaller) WriteUint32(w io.Writer, v uint32) error { 101 m.b4[0] = byte(v) 102 m.b4[1] = byte(v >> 8) 103 m.b4[2] = byte(v >> 16) 104 m.b4[3] = byte(v >> 24) 105 _, err := w.Write(m.b4) 106 return err 107 } 108 109 func (m *SbeGoMarshaller) WriteUint64(w io.Writer, v uint64) error { 110 m.b8[0] = byte(v) 111 m.b8[1] = byte(v >> 8) 112 m.b8[2] = byte(v >> 16) 113 m.b8[3] = byte(v >> 24) 114 m.b8[4] = byte(v >> 32) 115 m.b8[5] = byte(v >> 40) 116 m.b8[6] = byte(v >> 48) 117 m.b8[7] = byte(v >> 56) 118 _, err := w.Write(m.b8) 119 return err 120 } 121 122 func (m *SbeGoMarshaller) WriteInt8(w io.Writer, v int8) error { 123 m.b1[0] = byte(v) 124 _, err := w.Write(m.b1) 125 return err 126 } 127 128 func (m *SbeGoMarshaller) WriteInt16(w io.Writer, v int16) error { 129 m.b2[0] = byte(v) 130 m.b2[1] = byte(v >> 8) 131 _, err := w.Write(m.b2) 132 return err 133 } 134 135 func (m *SbeGoMarshaller) WriteInt32(w io.Writer, v int32) error { 136 m.b4[0] = byte(v) 137 m.b4[1] = byte(v >> 8) 138 m.b4[2] = byte(v >> 16) 139 m.b4[3] = byte(v >> 24) 140 _, err := w.Write(m.b4) 141 return err 142 } 143 144 func (m *SbeGoMarshaller) WriteInt64(w io.Writer, v int64) error { 145 m.b8[0] = byte(v) 146 m.b8[1] = byte(v >> 8) 147 m.b8[2] = byte(v >> 16) 148 m.b8[3] = byte(v >> 24) 149 m.b8[4] = byte(v >> 32) 150 m.b8[5] = byte(v >> 40) 151 m.b8[6] = byte(v >> 48) 152 m.b8[7] = byte(v >> 56) 153 _, err := w.Write(m.b8) 154 return err 155 } 156 157 func (m *SbeGoMarshaller) WriteFloat32(w io.Writer, v float32) error { 158 u32 := math.Float32bits(v) 159 m.b4[0] = byte(u32) 160 m.b4[1] = byte(u32 >> 8) 161 m.b4[2] = byte(u32 >> 16) 162 m.b4[3] = byte(u32 >> 24) 163 _, err := w.Write(m.b4) 164 return err 165 } 166 167 func (m *SbeGoMarshaller) WriteFloat64(w io.Writer, v float64) error { 168 u64 := math.Float64bits(v) 169 m.b8[0] = byte(u64) 170 m.b8[1] = byte(u64 >> 8) 171 m.b8[2] = byte(u64 >> 16) 172 m.b8[3] = byte(u64 >> 24) 173 m.b8[4] = byte(u64 >> 32) 174 m.b8[5] = byte(u64 >> 40) 175 m.b8[6] = byte(u64 >> 48) 176 m.b8[7] = byte(u64 >> 56) 177 _, err := w.Write(m.b8) 178 return err 179 } 180 181 func (m *SbeGoMarshaller) WriteBytes(w io.Writer, v []byte) error { 182 _, err := w.Write(v) 183 return err 184 } 185 186 func (m *SbeGoMarshaller) ReadUint8(r io.Reader, v *uint8) error { 187 if _, err := io.ReadFull(r, m.b1); err != nil { 188 return err 189 } 190 *v = uint8(m.b1[0]) 191 return nil 192 } 193 194 func (m *SbeGoMarshaller) ReadUint16(r io.Reader, v *uint16) error { 195 if _, err := io.ReadFull(r, m.b2); err != nil { 196 return err 197 } 198 *v = (uint16(m.b2[0]) | uint16(m.b2[1])<<8) 199 return nil 200 } 201 202 func (m *SbeGoMarshaller) ReadUint32(r io.Reader, v *uint32) error { 203 if _, err := io.ReadFull(r, m.b4); err != nil { 204 return err 205 } 206 *v = (uint32(m.b4[0]) | uint32(m.b4[1])<<8 | 207 uint32(m.b4[2])<<16 | uint32(m.b4[3])<<24) 208 return nil 209 } 210 211 func (m *SbeGoMarshaller) ReadUint64(r io.Reader, v *uint64) error { 212 if _, err := io.ReadFull(r, m.b8); err != nil { 213 return err 214 } 215 *v = (uint64(m.b8[0]) | uint64(m.b8[1])<<8 | 216 uint64(m.b8[2])<<16 | uint64(m.b8[3])<<24 | 217 uint64(m.b8[4])<<32 | uint64(m.b8[5])<<40 | 218 uint64(m.b8[6])<<48 | uint64(m.b8[7])<<56) 219 return nil 220 } 221 222 func (m *SbeGoMarshaller) ReadInt8(r io.Reader, v *int8) error { 223 if _, err := io.ReadFull(r, m.b1); err != nil { 224 return err 225 } 226 *v = int8(m.b1[0]) 227 return nil 228 } 229 230 func (m *SbeGoMarshaller) ReadInt16(r io.Reader, v *int16) error { 231 if _, err := io.ReadFull(r, m.b2); err != nil { 232 return err 233 } 234 *v = (int16(m.b2[0]) | int16(m.b2[1])<<8) 235 return nil 236 } 237 238 func (m *SbeGoMarshaller) ReadInt32(r io.Reader, v *int32) error { 239 if _, err := io.ReadFull(r, m.b4); err != nil { 240 return err 241 } 242 *v = (int32(m.b4[0]) | int32(m.b4[1])<<8 | 243 int32(m.b4[2])<<16 | int32(m.b4[3])<<24) 244 return nil 245 } 246 247 func (m *SbeGoMarshaller) ReadInt64(r io.Reader, v *int64) error { 248 if _, err := io.ReadFull(r, m.b8); err != nil { 249 return err 250 } 251 *v = (int64(m.b8[0]) | int64(m.b8[1])<<8 | 252 int64(m.b8[2])<<16 | int64(m.b8[3])<<24 | 253 int64(m.b8[4])<<32 | int64(m.b8[5])<<40 | 254 int64(m.b8[6])<<48 | int64(m.b8[7])<<56) 255 return nil 256 } 257 258 func (m *SbeGoMarshaller) ReadFloat32(r io.Reader, v *float32) error { 259 if _, err := io.ReadFull(r, m.b4); err != nil { 260 return err 261 } 262 *v = math.Float32frombits(uint32(m.b4[0]) | uint32(m.b4[1])<<8 | 263 uint32(m.b4[2])<<16 | uint32(m.b4[3])<<24) 264 return nil 265 } 266 267 func (m *SbeGoMarshaller) ReadFloat64(r io.Reader, v *float64) error { 268 if _, err := io.ReadFull(r, m.b8); err != nil { 269 return err 270 } 271 *v = math.Float64frombits(uint64(m.b8[0]) | uint64(m.b8[1])<<8 | 272 uint64(m.b8[2])<<16 | uint64(m.b8[3])<<24 | 273 uint64(m.b8[4])<<32 | uint64(m.b8[5])<<40 | 274 uint64(m.b8[6])<<48 | uint64(m.b8[7])<<56) 275 return nil 276 } 277 278 func (m *SbeGoMarshaller) ReadBytes(r io.Reader, b []byte) error { 279 if _, err := io.ReadFull(r, b); err != nil { 280 return err 281 } 282 return nil 283 }