package db
|
|
|
|
import (
|
|
"bytes"
|
|
)
|
|
|
|
func cp(bz []byte) (ret []byte) {
|
|
ret = make([]byte, len(bz))
|
|
copy(ret, bz)
|
|
return ret
|
|
}
|
|
|
|
// Returns a slice of the same length (big endian)
|
|
// except incremented by one.
|
|
// Returns nil on overflow (e.g. if bz bytes are all 0xFF)
|
|
// CONTRACT: len(bz) > 0
|
|
func cpIncr(bz []byte) (ret []byte) {
|
|
if len(bz) == 0 {
|
|
panic("cpIncr expects non-zero bz length")
|
|
}
|
|
ret = cp(bz)
|
|
for i := len(bz) - 1; i >= 0; i-- {
|
|
if ret[i] < byte(0xFF) {
|
|
ret[i]++
|
|
return
|
|
}
|
|
ret[i] = byte(0x00)
|
|
if i == 0 {
|
|
// Overflow
|
|
return nil
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Returns a slice of the same length (big endian)
|
|
// except decremented by one.
|
|
// Returns nil on underflow (e.g. if bz bytes are all 0x00)
|
|
// CONTRACT: len(bz) > 0
|
|
func cpDecr(bz []byte) (ret []byte) {
|
|
if len(bz) == 0 {
|
|
panic("cpDecr expects non-zero bz length")
|
|
}
|
|
ret = cp(bz)
|
|
for i := len(bz) - 1; i >= 0; i-- {
|
|
if ret[i] > byte(0x00) {
|
|
ret[i]--
|
|
return
|
|
}
|
|
ret[i] = byte(0xFF)
|
|
if i == 0 {
|
|
// Underflow
|
|
return nil
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// See DB interface documentation for more information.
|
|
func IsKeyInDomain(key, start, end []byte, isReverse bool) bool {
|
|
if !isReverse {
|
|
if bytes.Compare(key, start) < 0 {
|
|
return false
|
|
}
|
|
if end != nil && bytes.Compare(end, key) <= 0 {
|
|
return false
|
|
}
|
|
return true
|
|
} else {
|
|
if start != nil && bytes.Compare(start, key) < 0 {
|
|
return false
|
|
}
|
|
if end != nil && bytes.Compare(key, end) <= 0 {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
}
|