x/model: simplify Name.CompareFold
This commit is contained in:
parent
712eaa4b09
commit
c84f9b07b0
@ -349,30 +349,20 @@ func (r Name) EqualFold(o Name) bool {
|
||||
//
|
||||
// For simple equality checks, use [Name.EqualFold].
|
||||
func (r Name) CompareFold(o Name) int {
|
||||
for i := range r.parts {
|
||||
if n := compareFold(r.parts[i], o.parts[i]); n != 0 {
|
||||
return n
|
||||
}
|
||||
}
|
||||
return 0
|
||||
return slices.CompareFunc(r.parts[:], o.parts[:], compareFold)
|
||||
}
|
||||
|
||||
func compareFold(a, b string) int {
|
||||
// fast-path for unequal lengths
|
||||
for i := 0; i < len(a) && i < len(b); i++ {
|
||||
ca, cb := downcase(a[i]), downcase(b[i])
|
||||
if n := cmp.Compare(ca, cb); n != 0 {
|
||||
return n
|
||||
}
|
||||
}
|
||||
return cmp.Compare(len(a), len(b))
|
||||
return slices.CompareFunc([]rune(a), []rune(b), func(a, b rune) int {
|
||||
return cmp.Compare(downcase(a), downcase(b))
|
||||
})
|
||||
}
|
||||
|
||||
func downcase(c byte) byte {
|
||||
if c >= 'A' && c <= 'Z' {
|
||||
return c + 'a' - 'A'
|
||||
func downcase(r rune) rune {
|
||||
if r >= 'A' && r <= 'Z' {
|
||||
return r - 'A' + 'a'
|
||||
}
|
||||
return c
|
||||
return r
|
||||
}
|
||||
|
||||
// TODO(bmizerany): driver.Value? (MarshalText etc should be enough)
|
||||
|
Loading…
x
Reference in New Issue
Block a user