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  }