forked from loweel/zabov
52 lines
1.1 KiB
Go
52 lines
1.1 KiB
Go
// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>
|
|
// All rights reserved.
|
|
//
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
package comparer
|
|
|
|
import "bytes"
|
|
|
|
type bytesComparer struct{}
|
|
|
|
func (bytesComparer) Compare(a, b []byte) int {
|
|
return bytes.Compare(a, b)
|
|
}
|
|
|
|
func (bytesComparer) Name() string {
|
|
return "leveldb.BytewiseComparator"
|
|
}
|
|
|
|
func (bytesComparer) Separator(dst, a, b []byte) []byte {
|
|
i, n := 0, len(a)
|
|
if n > len(b) {
|
|
n = len(b)
|
|
}
|
|
for ; i < n && a[i] == b[i]; i++ {
|
|
}
|
|
if i >= n {
|
|
// Do not shorten if one string is a prefix of the other
|
|
} else if c := a[i]; c < 0xff && c+1 < b[i] {
|
|
dst = append(dst, a[:i+1]...)
|
|
dst[len(dst)-1]++
|
|
return dst
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (bytesComparer) Successor(dst, b []byte) []byte {
|
|
for i, c := range b {
|
|
if c != 0xff {
|
|
dst = append(dst, b[:i+1]...)
|
|
dst[len(dst)-1]++
|
|
return dst
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DefaultComparer are default implementation of the Comparer interface.
|
|
// It uses the natural ordering, consistent with bytes.Compare.
|
|
var DefaultComparer = bytesComparer{}
|