bytealg: update to Go 1.22
A few non-generic functions like HashStrBytes have been kept for backwards compatibility, so this package should continue to work with older Go versions (as long as they support generics).
Этот коммит содержится в:
родитель
5f50c3b60b
коммит
afd65e224a
1 изменённых файлов: 76 добавлений и 12 удалений
|
@ -1,5 +1,14 @@
|
|||
package bytealg
|
||||
|
||||
// Some code in this file has been copied from the Go source code, and has
|
||||
// copyright of their original authors:
|
||||
//
|
||||
// Copyright 2020 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.
|
||||
//
|
||||
// This is indicated specifically in the file.
|
||||
|
||||
const (
|
||||
// Index can search any valid length of string.
|
||||
|
||||
|
@ -125,10 +134,6 @@ func IndexString(str, sub string) int {
|
|||
return -1
|
||||
}
|
||||
|
||||
// Copyright 2020 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.
|
||||
|
||||
// The following code has been copied from the Go 1.15 release tree.
|
||||
|
||||
// PrimeRK is the prime base used in Rabin-Karp algorithm.
|
||||
|
@ -136,6 +141,8 @@ const PrimeRK = 16777619
|
|||
|
||||
// HashStrBytes returns the hash and the appropriate multiplicative
|
||||
// factor for use in Rabin-Karp algorithm.
|
||||
//
|
||||
// This function was removed in Go 1.22.
|
||||
func HashStrBytes(sep []byte) (uint32, uint32) {
|
||||
hash := uint32(0)
|
||||
for i := 0; i < len(sep); i++ {
|
||||
|
@ -153,7 +160,9 @@ func HashStrBytes(sep []byte) (uint32, uint32) {
|
|||
|
||||
// HashStr returns the hash and the appropriate multiplicative
|
||||
// factor for use in Rabin-Karp algorithm.
|
||||
func HashStr(sep string) (uint32, uint32) {
|
||||
//
|
||||
// This function was removed in Go 1.22.
|
||||
func HashStr[T string | []byte](sep T) (uint32, uint32) {
|
||||
hash := uint32(0)
|
||||
for i := 0; i < len(sep); i++ {
|
||||
hash = hash*PrimeRK + uint32(sep[i])
|
||||
|
@ -170,6 +179,8 @@ func HashStr(sep string) (uint32, uint32) {
|
|||
|
||||
// HashStrRevBytes returns the hash of the reverse of sep and the
|
||||
// appropriate multiplicative factor for use in Rabin-Karp algorithm.
|
||||
//
|
||||
// This function was removed in Go 1.22.
|
||||
func HashStrRevBytes(sep []byte) (uint32, uint32) {
|
||||
hash := uint32(0)
|
||||
for i := len(sep) - 1; i >= 0; i-- {
|
||||
|
@ -187,7 +198,9 @@ func HashStrRevBytes(sep []byte) (uint32, uint32) {
|
|||
|
||||
// HashStrRev returns the hash of the reverse of sep and the
|
||||
// appropriate multiplicative factor for use in Rabin-Karp algorithm.
|
||||
func HashStrRev(sep string) (uint32, uint32) {
|
||||
//
|
||||
// Copied from the Go 1.22rc1 source tree.
|
||||
func HashStrRev[T string | []byte](sep T) (uint32, uint32) {
|
||||
hash := uint32(0)
|
||||
for i := len(sep) - 1; i >= 0; i-- {
|
||||
hash = hash*PrimeRK + uint32(sep[i])
|
||||
|
@ -204,6 +217,8 @@ func HashStrRev(sep string) (uint32, uint32) {
|
|||
|
||||
// IndexRabinKarpBytes uses the Rabin-Karp search algorithm to return the index of the
|
||||
// first occurence of substr in s, or -1 if not present.
|
||||
//
|
||||
// This function was removed in Go 1.22.
|
||||
func IndexRabinKarpBytes(s, sep []byte) int {
|
||||
// Rabin-Karp search
|
||||
hashsep, pow := HashStrBytes(sep)
|
||||
|
@ -228,16 +243,18 @@ func IndexRabinKarpBytes(s, sep []byte) int {
|
|||
}
|
||||
|
||||
// IndexRabinKarp uses the Rabin-Karp search algorithm to return the index of the
|
||||
// first occurence of substr in s, or -1 if not present.
|
||||
func IndexRabinKarp(s, substr string) int {
|
||||
// first occurrence of sep in s, or -1 if not present.
|
||||
//
|
||||
// Copied from the Go 1.22rc1 source tree.
|
||||
func IndexRabinKarp[T string | []byte](s, sep T) int {
|
||||
// Rabin-Karp search
|
||||
hashss, pow := HashStr(substr)
|
||||
n := len(substr)
|
||||
hashss, pow := HashStr(sep)
|
||||
n := len(sep)
|
||||
var h uint32
|
||||
for i := 0; i < n; i++ {
|
||||
h = h*PrimeRK + uint32(s[i])
|
||||
}
|
||||
if h == hashss && s[:n] == substr {
|
||||
if h == hashss && string(s[:n]) == string(sep) {
|
||||
return 0
|
||||
}
|
||||
for i := n; i < len(s); {
|
||||
|
@ -245,7 +262,7 @@ func IndexRabinKarp(s, substr string) int {
|
|||
h += uint32(s[i])
|
||||
h -= pow * uint32(s[i-n])
|
||||
i++
|
||||
if h == hashss && s[i-n:i] == substr {
|
||||
if h == hashss && string(s[i-n:i]) == string(sep) {
|
||||
return i - n
|
||||
}
|
||||
}
|
||||
|
@ -261,3 +278,50 @@ func MakeNoZero(n int) []byte {
|
|||
// malloc function implemented in the runtime).
|
||||
return make([]byte, n)
|
||||
}
|
||||
|
||||
// Copied from the Go 1.22rc1 source tree.
|
||||
func LastIndexByte(s []byte, c byte) int {
|
||||
for i := len(s) - 1; i >= 0; i-- {
|
||||
if s[i] == c {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
// Copied from the Go 1.22rc1 source tree.
|
||||
func LastIndexByteString(s string, c byte) int {
|
||||
for i := len(s) - 1; i >= 0; i-- {
|
||||
if s[i] == c {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
// LastIndexRabinKarp uses the Rabin-Karp search algorithm to return the last index of the
|
||||
// occurrence of sep in s, or -1 if not present.
|
||||
//
|
||||
// Copied from the Go 1.22rc1 source tree.
|
||||
func LastIndexRabinKarp[T string | []byte](s, sep T) int {
|
||||
// Rabin-Karp search from the end of the string
|
||||
hashss, pow := HashStrRev(sep)
|
||||
n := len(sep)
|
||||
last := len(s) - n
|
||||
var h uint32
|
||||
for i := len(s) - 1; i >= last; i-- {
|
||||
h = h*PrimeRK + uint32(s[i])
|
||||
}
|
||||
if h == hashss && string(s[last:]) == string(sep) {
|
||||
return last
|
||||
}
|
||||
for i := last - 1; i >= 0; i-- {
|
||||
h *= PrimeRK
|
||||
h += uint32(s[i])
|
||||
h -= pow * uint32(s[i+n])
|
||||
if h == hashss && string(s[i:i+n]) == string(sep) {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче