From ceed73403bdb61387d04be8b47183e9c4a970749 Mon Sep 17 00:00:00 2001 From: Ondrej Fabry Date: Tue, 23 Jun 2020 14:10:53 +0200 Subject: Fix codec fallback and generate type imports Change-Id: Idd76c7f19d952939caf153928ac60175845078ff Signed-off-by: Ondrej Fabry --- codec/codec.go | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 codec/codec.go (limited to 'codec/codec.go') diff --git a/codec/codec.go b/codec/codec.go new file mode 100644 index 0000000..e968a6b --- /dev/null +++ b/codec/codec.go @@ -0,0 +1,78 @@ +// Copyright (c) 2020 Cisco and/or its affiliates. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package codec + +import ( + "encoding/binary" + "math" + "reflect" + "unsafe" +) + +var order = binary.BigEndian + +type Buffer struct { + pos int + buf []byte +} + +func (b *Buffer) Bytes() []byte { + return b.buf[:b.pos] +} + +func (b *Buffer) EncodeBool(v bool) { + if v { + b.buf[b.pos] = 1 + } else { + b.buf[b.pos] = 0 + } + b.pos += 1 +} + +func (b *Buffer) EncodeUint8(v uint8) { + b.buf[b.pos] = v + b.pos += 1 +} + +func (b *Buffer) EncodeUint16(v uint16) { + order.PutUint16(b.buf[b.pos:b.pos+2], v) + b.pos += 2 +} + +func (b *Buffer) EncodeUint32(v uint32) { + order.PutUint32(b.buf[b.pos:b.pos+4], v) + b.pos += 4 +} + +func (b *Buffer) EncodeUint64(v uint64) { + order.PutUint64(b.buf[b.pos:b.pos+8], v) + b.pos += 8 +} + +func (b *Buffer) EncodeFloat64(v float64) { + order.PutUint64(b.buf[b.pos:b.pos+8], math.Float64bits(v)) + b.pos += 8 +} + +func (b *Buffer) EncodeString(v string, length int) { + copy(b.buf[b.pos:b.pos+length], v) + b.pos += length +} + +func DecodeString(b []byte) string { + sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + stringHeader := reflect.StringHeader{Data: sliceHeader.Data, Len: sliceHeader.Len} + return *(*string)(unsafe.Pointer(&stringHeader)) +} -- cgit 1.2.3-korg