mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-23 03:17:43 +08:00
66 lines
1.5 KiB
Go
66 lines
1.5 KiB
Go
// Package set defines the BlockSet interface which provides
|
|
// abstraction for sets of Cids.
|
|
// It provides a default implementation using cid.Set.
|
|
package set
|
|
|
|
import (
|
|
cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid"
|
|
|
|
"github.com/ipfs/go-ipfs/blocks/bloom"
|
|
)
|
|
|
|
// BlockSet represents a mutable set of blocks CIDs.
|
|
type BlockSet interface {
|
|
AddBlock(*cid.Cid)
|
|
RemoveBlock(*cid.Cid)
|
|
HasKey(*cid.Cid) bool
|
|
// GetBloomFilter creates and returns a bloom filter to which
|
|
// all the CIDs in the set have been added.
|
|
GetBloomFilter() bloom.Filter
|
|
GetKeys() []*cid.Cid
|
|
}
|
|
|
|
// SimpleSetFromKeys returns a default implementation of BlockSet
|
|
// using cid.Set. The given keys are added to the set.
|
|
func SimpleSetFromKeys(keys []*cid.Cid) BlockSet {
|
|
sbs := &simpleBlockSet{blocks: cid.NewSet()}
|
|
for _, k := range keys {
|
|
sbs.AddBlock(k)
|
|
}
|
|
return sbs
|
|
}
|
|
|
|
// NewSimpleBlockSet returns a new empty default implementation
|
|
// of BlockSet using cid.Set.
|
|
func NewSimpleBlockSet() BlockSet {
|
|
return &simpleBlockSet{blocks: cid.NewSet()}
|
|
}
|
|
|
|
type simpleBlockSet struct {
|
|
blocks *cid.Set
|
|
}
|
|
|
|
func (b *simpleBlockSet) AddBlock(k *cid.Cid) {
|
|
b.blocks.Add(k)
|
|
}
|
|
|
|
func (b *simpleBlockSet) RemoveBlock(k *cid.Cid) {
|
|
b.blocks.Remove(k)
|
|
}
|
|
|
|
func (b *simpleBlockSet) HasKey(k *cid.Cid) bool {
|
|
return b.blocks.Has(k)
|
|
}
|
|
|
|
func (b *simpleBlockSet) GetBloomFilter() bloom.Filter {
|
|
f := bloom.BasicFilter()
|
|
for _, k := range b.blocks.Keys() {
|
|
f.Add(k.Bytes())
|
|
}
|
|
return f
|
|
}
|
|
|
|
func (b *simpleBlockSet) GetKeys() []*cid.Cid {
|
|
return b.blocks.Keys()
|
|
}
|