diff options
Diffstat (limited to 'src/strings/strings.go')
-rw-r--r-- | src/strings/strings.go | 112 |
1 files changed, 11 insertions, 101 deletions
diff --git a/src/strings/strings.go b/src/strings/strings.go index f53ae1f9a7..95180828f6 100644 --- a/src/strings/strings.go +++ b/src/strings/strings.go @@ -9,6 +9,7 @@ package strings import ( "internal/bytealg" + "internal/stringslite" "unicode" "unicode/utf8" ) @@ -115,7 +116,7 @@ func LastIndex(s, substr string) int { // IndexByte returns the index of the first instance of c in s, or -1 if c is not present in s. func IndexByte(s string, c byte) int { - return bytealg.IndexByteString(s, c) + return stringslite.IndexByte(s, c) } // IndexRune returns the index of the first instance of the Unicode code point @@ -460,12 +461,12 @@ func Join(elems []string, sep string) string { // HasPrefix reports whether the string s begins with prefix. func HasPrefix(s, prefix string) bool { - return len(s) >= len(prefix) && s[0:len(prefix)] == prefix + return stringslite.HasPrefix(s, prefix) } // HasSuffix reports whether the string s ends with suffix. func HasSuffix(s, suffix string) bool { - return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix + return stringslite.HasSuffix(s, suffix) } // Map returns a copy of the string s with all its characters modified @@ -569,7 +570,7 @@ func Repeat(s string, count int) string { if count < 0 { panic("strings: negative Repeat count") } - if len(s) >= maxInt/count { + if len(s) > maxInt/count { panic("strings: Repeat output length overflow") } n := len(s) * count @@ -1074,19 +1075,13 @@ func TrimSpace(s string) string { // TrimPrefix returns s without the provided leading prefix string. // If s doesn't start with prefix, s is returned unchanged. func TrimPrefix(s, prefix string) string { - if HasPrefix(s, prefix) { - return s[len(prefix):] - } - return s + return stringslite.TrimPrefix(s, prefix) } // TrimSuffix returns s without the provided trailing suffix string. // If s doesn't end with suffix, s is returned unchanged. func TrimSuffix(s, suffix string) string { - if HasSuffix(s, suffix) { - return s[:len(s)-len(suffix)] - } - return s + return stringslite.TrimSuffix(s, suffix) } // Replace returns a copy of the string s with the first n @@ -1225,83 +1220,7 @@ hasUnicode: // Index returns the index of the first instance of substr in s, or -1 if substr is not present in s. func Index(s, substr string) int { - n := len(substr) - switch { - case n == 0: - return 0 - case n == 1: - return IndexByte(s, substr[0]) - case n == len(s): - if substr == s { - return 0 - } - return -1 - case n > len(s): - return -1 - case n <= bytealg.MaxLen: - // Use brute force when s and substr both are small - if len(s) <= bytealg.MaxBruteForce { - return bytealg.IndexString(s, substr) - } - c0 := substr[0] - c1 := substr[1] - i := 0 - t := len(s) - n + 1 - fails := 0 - for i < t { - if s[i] != c0 { - // IndexByte is faster than bytealg.IndexString, so use it as long as - // we're not getting lots of false positives. - o := IndexByte(s[i+1:t], c0) - if o < 0 { - return -1 - } - i += o + 1 - } - if s[i+1] == c1 && s[i:i+n] == substr { - return i - } - fails++ - i++ - // Switch to bytealg.IndexString when IndexByte produces too many false positives. - if fails > bytealg.Cutover(i) { - r := bytealg.IndexString(s[i:], substr) - if r >= 0 { - return r + i - } - return -1 - } - } - return -1 - } - c0 := substr[0] - c1 := substr[1] - i := 0 - t := len(s) - n + 1 - fails := 0 - for i < t { - if s[i] != c0 { - o := IndexByte(s[i+1:t], c0) - if o < 0 { - return -1 - } - i += o + 1 - } - if s[i+1] == c1 && s[i:i+n] == substr { - return i - } - i++ - fails++ - if fails >= 4+i>>4 && i < t { - // See comment in ../bytes/bytes.go. - j := bytealg.IndexRabinKarp(s[i:], substr) - if j < 0 { - return -1 - } - return i + j - } - } - return -1 + return stringslite.Index(s, substr) } // Cut slices s around the first instance of sep, @@ -1309,10 +1228,7 @@ func Index(s, substr string) int { // The found result reports whether sep appears in s. // If sep does not appear in s, cut returns s, "", false. func Cut(s, sep string) (before, after string, found bool) { - if i := Index(s, sep); i >= 0 { - return s[:i], s[i+len(sep):], true - } - return s, "", false + return stringslite.Cut(s, sep) } // CutPrefix returns s without the provided leading prefix string @@ -1320,10 +1236,7 @@ func Cut(s, sep string) (before, after string, found bool) { // If s doesn't start with prefix, CutPrefix returns s, false. // If prefix is the empty string, CutPrefix returns s, true. func CutPrefix(s, prefix string) (after string, found bool) { - if !HasPrefix(s, prefix) { - return s, false - } - return s[len(prefix):], true + return stringslite.CutPrefix(s, prefix) } // CutSuffix returns s without the provided ending suffix string @@ -1331,8 +1244,5 @@ func CutPrefix(s, prefix string) (after string, found bool) { // If s doesn't end with suffix, CutSuffix returns s, false. // If suffix is the empty string, CutSuffix returns s, true. func CutSuffix(s, suffix string) (before string, found bool) { - if !HasSuffix(s, suffix) { - return s, false - } - return s[:len(s)-len(suffix)], true + return stringslite.CutSuffix(s, suffix) } |