kaspad/util/buffers/sub_buffer.go
Ori Newman d3b1953deb
[NOD-848] optimize utxo diffs serialize allocations (#666)
* [NOD-848] Optimize allocations when serializing UTXO diffs

* [NOD-848] Use same UTXO serialization everywhere, and use compression as well

* [NOD-848] Fix usage of wrong buffer

* [NOD-848] Fix tests

* [NOD-848] Fix wire tests

* [NOD-848] Fix tests

* [NOD-848] Remove VLQ

* [NOD-848] Fix comments

* [NOD-848] Add varint for big endian encoding

* [NOD-848] In TestVarIntWire, assume the expected decoded value is the same as the serialization input

* [NOD-848] Serialize outpoint index with big endian varint

* [NOD-848] Remove p2pk from compression support

* [NOD-848] Fix comments

* [NOD-848] Remove p2pk from decompression support

* [NOD-848] Make entry compression optional

* [NOD-848] Fix tests

* [NOD-848] Fix comments and var names

* [NOD-848] Remove UTXO compression

* [NOD-848] Fix tests

* [NOD-848] Remove big endian varint

* [NOD-848] Fix comments

* [NOD-848] Rename ReadVarIntLittleEndian->ReadVarInt and fix WriteVarInt comment

* [NOD-848] Add outpointIndexByteOrder variable

* [NOD-848] Remove redundant comment

* [NOD-848] Fix outpointMaxSerializeSize to the correct value

* [NOD-848] Move subBuffer to utils
2020-03-24 16:44:41 +02:00

49 lines
1.1 KiB
Go

package buffers
import (
"bytes"
"github.com/pkg/errors"
)
// SubBuffer lets you write to an existing buffer
// and let you check with the `Bytes()` method what
// has been written to the underlying buffer using
// the sub buffer.
type SubBuffer struct {
buff *bytes.Buffer
start, end int
}
// Bytes returns all the bytes that were written to the sub buffer.
func (s *SubBuffer) Bytes() []byte {
return s.buff.Bytes()[s.start:s.end]
}
// Write writes to the sub buffer's underlying buffer
// and increases s.end by the number of bytes written
// so s.Bytes() will be able to return the written bytes.
func (s *SubBuffer) Write(p []byte) (int, error) {
if s.buff.Len() > s.end || s.buff.Len() < s.start {
return 0, errors.New("a sub buffer cannot be written after another entity wrote or read from its " +
"underlying buffer")
}
n, err := s.buff.Write(p)
if err != nil {
return 0, err
}
s.end += n
return n, nil
}
// NewSubBuffer returns a new sub buffer.
func NewSubBuffer(buff *bytes.Buffer) *SubBuffer {
return &SubBuffer{
buff: buff,
start: buff.Len(),
end: buff.Len(),
}
}