cidqueue.go 1.01 KB
Newer Older
1 2
package session

3
import cid "gitlab.dms3.io/dms3/go-cid"
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

type cidQueue struct {
	elems []cid.Cid
	eset  *cid.Set
}

func newCidQueue() *cidQueue {
	return &cidQueue{eset: cid.NewSet()}
}

func (cq *cidQueue) Pop() cid.Cid {
	for {
		if len(cq.elems) == 0 {
			return cid.Cid{}
		}

		out := cq.elems[0]
		cq.elems = cq.elems[1:]

		if cq.eset.Has(out) {
			cq.eset.Remove(out)
			return out
		}
	}
}

dirkmc's avatar
dirkmc committed
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
func (cq *cidQueue) Cids() []cid.Cid {
	// Lazily delete from the list any cids that were removed from the set
	if len(cq.elems) > cq.eset.Len() {
		i := 0
		for _, c := range cq.elems {
			if cq.eset.Has(c) {
				cq.elems[i] = c
				i++
			}
		}
		cq.elems = cq.elems[:i]
	}

	// Make a copy of the cids
	return append([]cid.Cid{}, cq.elems...)
}

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
func (cq *cidQueue) Push(c cid.Cid) {
	if cq.eset.Visit(c) {
		cq.elems = append(cq.elems, c)
	}
}

func (cq *cidQueue) Remove(c cid.Cid) {
	cq.eset.Remove(c)
}

func (cq *cidQueue) Has(c cid.Cid) bool {
	return cq.eset.Has(c)
}

func (cq *cidQueue) Len() int {
	return cq.eset.Len()
}