mirror of
https://github.com/Oxalide/vsphere-influxdb-go.git
synced 2023-10-10 13:36:51 +02:00
73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
package bytesutil
|
|
|
|
import (
|
|
"bytes"
|
|
"sort"
|
|
)
|
|
|
|
// Sort sorts a slice of byte slices.
|
|
func Sort(a [][]byte) {
|
|
sort.Sort(byteSlices(a))
|
|
}
|
|
|
|
func IsSorted(a [][]byte) bool {
|
|
return sort.IsSorted(byteSlices(a))
|
|
}
|
|
|
|
func SearchBytes(a [][]byte, x []byte) int {
|
|
return sort.Search(len(a), func(i int) bool { return bytes.Compare(a[i], x) >= 0 })
|
|
}
|
|
|
|
// Union returns the union of a & b in sorted order.
|
|
func Union(a, b [][]byte) [][]byte {
|
|
n := len(b)
|
|
if len(a) > len(b) {
|
|
n = len(a)
|
|
}
|
|
other := make([][]byte, 0, n)
|
|
|
|
for {
|
|
if len(a) > 0 && len(b) > 0 {
|
|
if cmp := bytes.Compare(a[0], b[0]); cmp == 0 {
|
|
other, a, b = append(other, a[0]), a[1:], b[1:]
|
|
} else if cmp == -1 {
|
|
other, a = append(other, a[0]), a[1:]
|
|
} else {
|
|
other, b = append(other, b[0]), b[1:]
|
|
}
|
|
} else if len(a) > 0 {
|
|
other, a = append(other, a[0]), a[1:]
|
|
} else if len(b) > 0 {
|
|
other, b = append(other, b[0]), b[1:]
|
|
} else {
|
|
return other
|
|
}
|
|
}
|
|
}
|
|
|
|
// Intersect returns the intersection of a & b in sorted order.
|
|
func Intersect(a, b [][]byte) [][]byte {
|
|
n := len(b)
|
|
if len(a) > len(b) {
|
|
n = len(a)
|
|
}
|
|
other := make([][]byte, 0, n)
|
|
|
|
for len(a) > 0 && len(b) > 0 {
|
|
if cmp := bytes.Compare(a[0], b[0]); cmp == 0 {
|
|
other, a, b = append(other, a[0]), a[1:], b[1:]
|
|
} else if cmp == -1 {
|
|
a = a[1:]
|
|
} else {
|
|
b = b[1:]
|
|
}
|
|
}
|
|
return other
|
|
}
|
|
|
|
type byteSlices [][]byte
|
|
|
|
func (a byteSlices) Len() int { return len(a) }
|
|
func (a byteSlices) Less(i, j int) bool { return bytes.Compare(a[i], a[j]) == -1 }
|
|
func (a byteSlices) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|