43 lines
917 B
Go
43 lines
917 B
Go
package address
|
|
|
|
// Merge merges adjacent range entries.
|
|
// The given slice has to be sorted in increasing order.
|
|
func Merge(r []Range) []Range {
|
|
var merged []Range
|
|
|
|
for i := range r {
|
|
if prev := len(merged) - 1; prev >= 0 && merged[prev].End == r[i].Start {
|
|
merged[prev].End = r[i].End
|
|
} else {
|
|
merged = append(merged, r[i])
|
|
}
|
|
}
|
|
|
|
return merged
|
|
}
|
|
|
|
// RemoveCommon filters out CIDR ranges which are contained in both a and b slices.
|
|
// Both slices have to be sorted in increasing order.
|
|
func RemoveCommon(a, b []CIDR) (newA, newB []CIDR) {
|
|
i, j := 0, 0
|
|
|
|
for i < len(a) && j < len(b) {
|
|
switch {
|
|
case a[i].Start() < b[j].Start() || a[i].End() < b[j].End():
|
|
newA = append(newA, a[i])
|
|
i++
|
|
case a[i].Start() > b[j].Start() || a[i].End() > b[j].End():
|
|
newB = append(newB, b[j])
|
|
j++
|
|
default:
|
|
i++
|
|
j++
|
|
}
|
|
|
|
}
|
|
newA = append(newA, a[i:]...)
|
|
newB = append(newB, b[j:]...)
|
|
|
|
return
|
|
}
|