github.com/df-mc/goleveldb@v1.1.9/leveldb/comparer.go (about) 1 // Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com> 2 // All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style license that can be 5 // found in the LICENSE file. 6 7 package leveldb 8 9 import ( 10 "github.com/df-mc/goleveldb/leveldb/comparer" 11 ) 12 13 type iComparer struct { 14 ucmp comparer.Comparer 15 } 16 17 func (icmp *iComparer) uName() string { 18 return icmp.ucmp.Name() 19 } 20 21 func (icmp *iComparer) uCompare(a, b []byte) int { 22 return icmp.ucmp.Compare(a, b) 23 } 24 25 func (icmp *iComparer) uSeparator(dst, a, b []byte) []byte { 26 return icmp.ucmp.Separator(dst, a, b) 27 } 28 29 func (icmp *iComparer) uSuccessor(dst, b []byte) []byte { 30 return icmp.ucmp.Successor(dst, b) 31 } 32 33 func (icmp *iComparer) Name() string { 34 return icmp.uName() 35 } 36 37 func (icmp *iComparer) Compare(a, b []byte) int { 38 x := icmp.uCompare(internalKey(a).ukey(), internalKey(b).ukey()) 39 if x == 0 { 40 if m, n := internalKey(a).num(), internalKey(b).num(); m > n { 41 return -1 42 } else if m < n { 43 return 1 44 } 45 } 46 return x 47 } 48 49 func (icmp *iComparer) Separator(dst, a, b []byte) []byte { 50 ua, ub := internalKey(a).ukey(), internalKey(b).ukey() 51 dst = icmp.uSeparator(dst, ua, ub) 52 if dst != nil && len(dst) < len(ua) && icmp.uCompare(ua, dst) < 0 { 53 // Append earliest possible number. 54 return append(dst, keyMaxNumBytes...) 55 } 56 return nil 57 } 58 59 func (icmp *iComparer) Successor(dst, b []byte) []byte { 60 ub := internalKey(b).ukey() 61 dst = icmp.uSuccessor(dst, ub) 62 if dst != nil && len(dst) < len(ub) && icmp.uCompare(ub, dst) < 0 { 63 // Append earliest possible number. 64 return append(dst, keyMaxNumBytes...) 65 } 66 return nil 67 }