Skip to content

Commit

Permalink
Simplifies readFrom and WriteTo, and improves their performance.
Browse files Browse the repository at this point in the history
  • Loading branch information
lemire committed Oct 12, 2023
1 parent 7e78d86 commit 5df2e1c
Showing 1 changed file with 22 additions and 26 deletions.
48 changes: 22 additions & 26 deletions bitset.go
Original file line number Diff line number Diff line change
Expand Up @@ -920,22 +920,24 @@ func (b *BitSet) BinaryStorageSize() int {
// f, err := os.Create("myfile")
// w := bufio.NewWriter(f)
func (b *BitSet) WriteTo(stream io.Writer) (int64, error) {
buf := make([]byte, wordBytes)

length := uint64(b.length)

// Write length
binaryOrder.PutUint64(buf, length)
n, err := stream.Write(buf)
err := binary.Write(stream, binaryOrder, &length)
if err != nil {
return int64(n), err
// Upon failure, we do not guarantee that we
// return the number of bytes written.
return int64(0), err
}

nWords := b.wordCount()
for i := range b.set[:nWords] {
binaryOrder.PutUint64(buf, b.set[i])
if nn, err := stream.Write(buf); err != nil {
return int64(i*int(wordBytes) + nn + n), err
}

err = binary.Write(stream, binaryOrder, b.set[:nWords])
if err != nil {
// Upon failure, we do not guarantee that we
// return the number of bytes written.
return int64(wordBytes), err
}

return int64(b.BinaryStorageSize()), nil
Expand All @@ -958,11 +960,8 @@ func (b *BitSet) WriteTo(stream io.Writer) (int64, error) {
// f, err := os.Open("myfile")
// r := bufio.NewReader(f)
func (b *BitSet) ReadFrom(stream io.Reader) (int64, error) {
buf := make([]byte, wordBytes)

// Read length first
_, err := io.ReadFull(stream, buf[:])
length := binaryOrder.Uint64(buf)
var length uint64
err := binary.Read(stream, binaryOrder, &length)
if err != nil {
if err == io.EOF {
err = io.ErrUnexpectedEOF
Expand All @@ -982,19 +981,16 @@ func (b *BitSet) ReadFrom(stream io.Reader) (int64, error) {
}

b.length = newlength

for i := 0; i < nWords; i++ {
if _, err := io.ReadFull(stream, buf); err != nil {
if err == io.EOF {
err = io.ErrUnexpectedEOF
}
// We do not want to leave the BitSet partially filled as
// it is error prone.
b.set = b.set[:0]
b.length = 0
return 0, err
err = binary.Read(stream, binaryOrder, b.set)
if err != nil {
if err == io.EOF {
err = io.ErrUnexpectedEOF
}
b.set[i] = binaryOrder.Uint64(buf)
// We do not want to leave the BitSet partially filled as
// it is error prone.
b.set = b.set[:0]
b.length = 0
return 0, err
}

return int64(b.BinaryStorageSize()), nil
Expand Down

0 comments on commit 5df2e1c

Please sign in to comment.