cosmos-sdk/store/storage/util/iterator.go
Aleksandr Bezobchuk 03bca7b791
feat(store/v2): Merge Feature Branch (#18150)
Co-authored-by: cool-developer <51834436+cool-develope@users.noreply.github.com>
Co-authored-by: yihuang <huang@crypto.com>
2023-10-18 18:03:43 +00:00

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
}