From e217d39882893407a9177c983093d03bcea786ab Mon Sep 17 00:00:00 2001 From: visualfc Date: Wed, 26 Jun 2024 20:13:43 +0800 Subject: [PATCH] internal/lib/internal/bytealg: count index --- internal/lib/internal/bytealg/bytealg.go | 32 +++++++++++------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/internal/lib/internal/bytealg/bytealg.go b/internal/lib/internal/bytealg/bytealg.go index bf35e55c..26979f76 100644 --- a/internal/lib/internal/bytealg/bytealg.go +++ b/internal/lib/internal/bytealg/bytealg.go @@ -42,35 +42,42 @@ func IndexByteString(s string, ch byte) int { return -1 } -func Count(b []byte, c byte) int { - n := 0 +func Count(b []byte, c byte) (n int) { for _, x := range b { if x == c { n++ } } - return n + return } -func CountString(s string, c byte) int { - n := 0 +func CountString(s string, c byte) (n int) { for i := 0; i < len(s); i++ { if s[i] == c { n++ } } - return n + return } +// Index returns the index of the first instance of b in a, or -1 if b is not present in a. +// Requires 2 <= len(b) <= MaxLen. func Index(a, b []byte) int { - for i := 0; i <= len(b)-len(a); i++ { - if equal(a, b[i:i+len(a)]) { + for i := 0; i <= len(a)-len(b); i++ { + if equal(a[i:i+len(b)], b) { return i } } return -1 } +func equal(a, b []byte) bool { + if n := len(a); n == len(b) { + return c.Memcmp(unsafe.Pointer(unsafe.SliceData(a)), unsafe.Pointer(unsafe.SliceData(b)), uintptr(n)) == 0 + } + return false +} + // IndexString returns the index of the first instance of b in a, or -1 if b is not present in a. // Requires 2 <= len(b) <= MaxLen. func IndexString(a, b string) int { @@ -93,15 +100,6 @@ func MakeNoZero(n int) (r []byte) { return } -func equal(a, b []byte) bool { - s1 := (*sliceHead)(unsafe.Pointer(&a)) - s2 := (*sliceHead)(unsafe.Pointer(&b)) - if s1.len == s2.len { - return c.Memcmp(s1.data, s2.data, uintptr(s1.len)) == 0 - } - return false -} - type sliceHead struct { data unsafe.Pointer len int