-
Notifications
You must be signed in to change notification settings - Fork 53
Expand file tree
/
Copy pathserialization.go
More file actions
72 lines (68 loc) · 2.14 KB
/
serialization.go
File metadata and controls
72 lines (68 loc) · 2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//go:build (!amd64 && !386 && !arm && !arm64 && !ppc64le && !mipsle && !mips64le && !mips64p32le && !wasm) || appengine
// +build !amd64,!386,!arm,!arm64,!ppc64le,!mipsle,!mips64le,!mips64p32le,!wasm appengine
package xorfilter
import (
"encoding/binary"
"io"
)
// Save writes the filter to the writer in little endian format.
func (f *BinaryFuse[T]) Save(w io.Writer) error {
if err := binary.Write(w, binary.LittleEndian, f.Seed); err != nil {
return err
}
if err := binary.Write(w, binary.LittleEndian, f.SegmentLength); err != nil {
return err
}
if err := binary.Write(w, binary.LittleEndian, f.SegmentLengthMask); err != nil {
return err
}
if err := binary.Write(w, binary.LittleEndian, f.SegmentCount); err != nil {
return err
}
if err := binary.Write(w, binary.LittleEndian, f.SegmentCountLength); err != nil {
return err
}
// Write the length of Fingerprints
fpLen := uint32(len(f.Fingerprints))
if err := binary.Write(w, binary.LittleEndian, fpLen); err != nil {
return err
}
// Write the Fingerprints
for _, fp := range f.Fingerprints {
if err := binary.Write(w, binary.LittleEndian, fp); err != nil {
return err
}
}
return nil
}
// LoadBinaryFuse reads the filter from the reader in little endian format.
func LoadBinaryFuse[T Unsigned](r io.Reader) (*BinaryFuse[T], error) {
var f BinaryFuse[T]
if err := binary.Read(r, binary.LittleEndian, &f.Seed); err != nil {
return nil, err
}
if err := binary.Read(r, binary.LittleEndian, &f.SegmentLength); err != nil {
return nil, err
}
if err := binary.Read(r, binary.LittleEndian, &f.SegmentLengthMask); err != nil {
return nil, err
}
if err := binary.Read(r, binary.LittleEndian, &f.SegmentCount); err != nil {
return nil, err
}
if err := binary.Read(r, binary.LittleEndian, &f.SegmentCountLength); err != nil {
return nil, err
}
// Read the length of Fingerprints
var fpLen uint32
if err := binary.Read(r, binary.LittleEndian, &fpLen); err != nil {
return nil, err
}
f.Fingerprints = make([]T, fpLen)
for i := range f.Fingerprints {
if err := binary.Read(r, binary.LittleEndian, &f.Fingerprints[i]); err != nil {
return nil, err
}
}
return &f, nil
}