From db6d979195fa1244b40ba1c4f7c3b52c29552bd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Faruk=20IRMAK?= Date: Mon, 1 May 2023 16:00:41 +0300 Subject: [PATCH] Implement binary.BinaryMarshaler/binary.BinaryUnmarshaler interfaces --- bloom.go | 19 +++++++++++++++++++ bloom_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/bloom.go b/bloom.go index be446d6..21f4bea 100644 --- a/bloom.go +++ b/bloom.go @@ -399,6 +399,25 @@ func (f *BloomFilter) GobDecode(data []byte) error { return err } +// MarshalBinary implements binary.BinaryMarshaler interface. +func (f *BloomFilter) MarshalBinary() ([]byte, error) { + var buf bytes.Buffer + _, err := f.WriteTo(&buf) + if err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +// UnmarshalBinary implements binary.BinaryUnmarshaler interface. +func (f *BloomFilter) UnmarshalBinary(data []byte) error { + buf := bytes.NewBuffer(data) + _, err := f.ReadFrom(buf) + + return err +} + // Equal tests for the equality of two Bloom filters func (f *BloomFilter) Equal(g *BloomFilter) bool { return f.m == g.m && f.k == g.k && f.b.Equal(g.b) diff --git a/bloom_test.go b/bloom_test.go index 8d20785..d66c99a 100644 --- a/bloom_test.go +++ b/bloom_test.go @@ -646,3 +646,41 @@ func TestFPP(t *testing.T) { t.Errorf("Excessive fpp") } } + +func TestEncodeDecodeBinary(t *testing.T) { + f := New(1000, 4) + f.Add([]byte("one")) + f.Add([]byte("two")) + f.Add([]byte("three")) + data, err := f.MarshalBinary() + if err != nil { + t.Fatal(err.Error()) + } + + var g BloomFilter + err = g.UnmarshalBinary(data) + if err != nil { + t.Fatal(err.Error()) + } + if g.m != f.m { + t.Error("invalid m value") + } + if g.k != f.k { + t.Error("invalid k value") + } + if g.b == nil { + t.Fatal("bitset is nil") + } + if !g.b.Equal(f.b) { + t.Error("bitsets are not equal") + } + if !g.Test([]byte("three")) { + t.Errorf("missing value 'three'") + } + if !g.Test([]byte("two")) { + t.Errorf("missing value 'two'") + } + if !g.Test([]byte("one")) { + t.Errorf("missing value 'one'") + } +}