54 lines
863 B
Go
54 lines
863 B
Go
package util
|
|
|
|
// IterateWithPrefix returns the begin and end keys for an iterator over a domain
|
|
// and prefix.
|
|
func IterateWithPrefix(prefix, begin, end []byte) ([]byte, []byte) {
|
|
if len(prefix) == 0 {
|
|
return begin, end
|
|
}
|
|
|
|
begin = cloneAppend(prefix, begin)
|
|
|
|
if end == nil {
|
|
end = CopyIncr(prefix)
|
|
} else {
|
|
end = cloneAppend(prefix, end)
|
|
}
|
|
|
|
return begin, end
|
|
}
|
|
|
|
func cloneAppend(front, tail []byte) (res []byte) {
|
|
res = make([]byte, len(front)+len(tail))
|
|
|
|
n := copy(res, front)
|
|
copy(res[n:], tail)
|
|
|
|
return res
|
|
}
|
|
|
|
func CopyIncr(bz []byte) []byte {
|
|
if len(bz) == 0 {
|
|
panic("copyIncr expects non-zero bz length")
|
|
}
|
|
|
|
ret := make([]byte, len(bz))
|
|
copy(ret, bz)
|
|
|
|
for i := len(bz) - 1; i >= 0; i-- {
|
|
if ret[i] < byte(0xFF) {
|
|
ret[i]++
|
|
return ret
|
|
}
|
|
|
|
ret[i] = byte(0x00)
|
|
|
|
if i == 0 {
|
|
// overflow
|
|
return nil
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|