You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.1 KiB
51 lines
1.1 KiB
// Copyright (c) 2012, Suryandaru Triandana <[email protected]> |
|
// 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[i]++ |
|
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[i]++ |
|
return dst |
|
} |
|
} |
|
return nil |
|
} |
|
|
|
// DefaultComparer are default implementation of the Comparer interface. |
|
// It uses the natural ordering, consistent with bytes.Compare. |
|
var DefaultComparer = bytesComparer{}
|
|
|