From e5a93d4ca0e1bfae91a05e11dcdd6a43232f907b Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Tue, 14 Feb 2023 14:04:31 +0100 Subject: [PATCH] feat(backend): reader maintains multibyte type --- backend/pkg/messages/primitives.go | 10 ++++++++++ backend/pkg/messages/reader.go | 6 ++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/backend/pkg/messages/primitives.go b/backend/pkg/messages/primitives.go index 3e47a3943..921239287 100644 --- a/backend/pkg/messages/primitives.go +++ b/backend/pkg/messages/primitives.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "io" + "math" ) var ( @@ -50,6 +51,15 @@ func WriteUint(v uint64, buf []byte, p int) int { return p + 1 } +func ByteSizeUint(v uint64) int { + if v == 0 { + return 1 + } + nBits := math.Floor(math.Log2(float64(v))) + 1 + nBytes := math.Ceil(nBits / 7) + return int(nBytes) +} + func ReadInt(reader io.Reader) (int64, error) { ux, err := ReadUint(reader) x := int64(ux >> 1) diff --git a/backend/pkg/messages/reader.go b/backend/pkg/messages/reader.go index 1e9fa42db..436876e55 100644 --- a/backend/pkg/messages/reader.go +++ b/backend/pkg/messages/reader.go @@ -70,13 +70,15 @@ func (m *messageReaderImpl) Parse() (err error) { } // Dirty hack to avoid extra memory allocation - m.data[curr-1] = uint8(m.msgType) + mTypeByteSize := ByteSizeUint(m.msgType) + from := int(curr) - mTypeByteSize + WriteUint(m.msgType, m.data, from) // Add message meta to list m.list = append(m.list, &MessageMeta{ msgType: m.msgType, msgSize: m.msgSize + 1, - msgFrom: uint64(curr - 1), + msgFrom: uint64(from), }) // Update data pointer