cachefs/pkg/chunk/chunk.go

60 lines
937 B
Go

// Copyright (C) 2022 Marius Schellenberger
package chunk
import (
"cmp"
"slices"
)
type Chunk [2]int64
type Chunks []Chunk
func (Chunks) Comp(a, b Chunk) int { return cmp.Compare(a[0], b[0]) }
func (cs Chunks) Exists(off int64, n int, size int64) bool {
end := off + int64(n)
if end > size {
end = size
}
for _, c := range cs {
if c[0] <= off && c[1] > off && c[1] >= end {
return true
}
}
return false
}
func (cs *Chunks) Add(off int64, n int) {
*cs = append(*cs, Chunk{off, off + int64(n)})
cs.merge()
}
func (cs Chunks) Size() (sum int64) {
for _, c := range cs {
sum += (c[1] - c[0])
}
return
}
func (cs *Chunks) merge() {
c := *cs
if len(c) < 2 {
return
}
slices.SortFunc(c, c.Comp)
for i := 0; i < len(c); i++ {
if i+1 == len(c) {
break
}
if c[i][1] >= c[i+1][0] {
if c[i+1][1] > c[i][1] {
c[i][1] = c[i+1][1]
}
c = slices.Delete(c, i+1, i+2)
i--
}
}
*cs = c
}