mirror of
https://github.com/golang/go
synced 2024-11-26 21:41:33 -07:00
57 lines
928 B
Go
57 lines
928 B
Go
|
// compile
|
||
|
|
||
|
// Copyright 2022 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package p
|
||
|
|
||
|
func fn(setText []rune, negate bool) int {
|
||
|
ranges := []singleRange{}
|
||
|
|
||
|
if len(setText) > 0 {
|
||
|
fillFirst := false
|
||
|
l := len(setText)
|
||
|
if negate {
|
||
|
if setText[0] == 0 {
|
||
|
setText = setText[1:]
|
||
|
} else {
|
||
|
l++
|
||
|
fillFirst = true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if l%2 == 0 {
|
||
|
ranges = make([]singleRange, l/2)
|
||
|
} else {
|
||
|
ranges = make([]singleRange, l/2+1)
|
||
|
}
|
||
|
|
||
|
first := true
|
||
|
if fillFirst {
|
||
|
ranges[0] = singleRange{first: 0}
|
||
|
first = false
|
||
|
}
|
||
|
|
||
|
i := 0
|
||
|
for _, r := range setText {
|
||
|
if first {
|
||
|
// lower bound in a new range
|
||
|
ranges[i] = singleRange{first: r}
|
||
|
first = false
|
||
|
} else {
|
||
|
ranges[i].last = r - 1
|
||
|
i++
|
||
|
first = true
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return len(ranges)
|
||
|
}
|
||
|
|
||
|
type singleRange struct {
|
||
|
first rune
|
||
|
last rune
|
||
|
}
|