diff options
author | Ian Lance Taylor <iant@google.com> | 2016-02-03 21:58:02 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2016-02-03 21:58:02 +0000 |
commit | f98dd1a338867a408f7c72d73fbad7fe7fc93e3a (patch) | |
tree | 2f8da9862a9c1fe0df138917f997b03439c02773 /libgo/go/strings | |
parent | b081ed4efc144da0c45a6484aebfd10e0eb9fda3 (diff) | |
download | gcc-f98dd1a338867a408f7c72d73fbad7fe7fc93e3a.zip gcc-f98dd1a338867a408f7c72d73fbad7fe7fc93e3a.tar.gz gcc-f98dd1a338867a408f7c72d73fbad7fe7fc93e3a.tar.bz2 |
libgo: Update to go1.6rc1.
Reviewed-on: https://go-review.googlesource.com/19200
From-SVN: r233110
Diffstat (limited to 'libgo/go/strings')
-rw-r--r-- | libgo/go/strings/example_test.go | 22 | ||||
-rw-r--r-- | libgo/go/strings/strings.go | 37 | ||||
-rw-r--r-- | libgo/go/strings/strings_amd64.go | 49 | ||||
-rw-r--r-- | libgo/go/strings/strings_generic.go | 47 | ||||
-rw-r--r-- | libgo/go/strings/strings_test.go | 53 |
5 files changed, 171 insertions, 37 deletions
diff --git a/libgo/go/strings/example_test.go b/libgo/go/strings/example_test.go index 7243e16..3f9d63b 100644 --- a/libgo/go/strings/example_test.go +++ b/libgo/go/strings/example_test.go @@ -60,6 +60,28 @@ func ExampleEqualFold() { // Output: true } +func ExampleHasPrefix() { + fmt.Println(strings.HasPrefix("Gopher", "Go")) + fmt.Println(strings.HasPrefix("Gopher", "C")) + fmt.Println(strings.HasPrefix("Gopher", "")) + // Output: + // true + // false + // true +} + +func ExampleHasSuffix() { + fmt.Println(strings.HasSuffix("Amigo", "go")) + fmt.Println(strings.HasSuffix("Amigo", "O")) + fmt.Println(strings.HasSuffix("Amigo", "Ami")) + fmt.Println(strings.HasSuffix("Amigo", "")) + // Output: + // true + // false + // false + // true +} + func ExampleIndex() { fmt.Println(strings.Index("chicken", "ken")) fmt.Println(strings.Index("chicken", "dmr")) diff --git a/libgo/go/strings/strings.go b/libgo/go/strings/strings.go index dd51dab..37d5647 100644 --- a/libgo/go/strings/strings.go +++ b/libgo/go/strings/strings.go @@ -143,43 +143,6 @@ func ContainsRune(s string, r rune) bool { return IndexRune(s, r) >= 0 } -// Index returns the index of the first instance of sep in s, or -1 if sep is not present in s. -func Index(s, sep string) int { - n := len(sep) - switch { - case n == 0: - return 0 - case n == 1: - return IndexByte(s, sep[0]) - case n == len(s): - if sep == s { - return 0 - } - return -1 - case n > len(s): - return -1 - } - // Rabin-Karp search - hashsep, pow := hashStr(sep) - var h uint32 - for i := 0; i < n; i++ { - h = h*primeRK + uint32(s[i]) - } - if h == hashsep && s[:n] == sep { - return 0 - } - for i := n; i < len(s); { - h *= primeRK - h += uint32(s[i]) - h -= pow * uint32(s[i-n]) - i++ - if h == hashsep && s[i-n:i] == sep { - return i - n - } - } - return -1 -} - // LastIndex returns the index of the last instance of sep in s, or -1 if sep is not present in s. func LastIndex(s, sep string) int { n := len(sep) diff --git a/libgo/go/strings/strings_amd64.go b/libgo/go/strings/strings_amd64.go new file mode 100644 index 0000000..376113f --- /dev/null +++ b/libgo/go/strings/strings_amd64.go @@ -0,0 +1,49 @@ +// Copyright 2015 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 strings + +// indexShortStr returns the index of the first instance of c in s, or -1 if c is not present in s. +// indexShortStr requires 2 <= len(c) <= shortStringLen +func indexShortStr(s, c string) int // ../runtime/asm_$GOARCH.s +const shortStringLen = 31 + +// Index returns the index of the first instance of sep in s, or -1 if sep is not present in s. +func Index(s, sep string) int { + n := len(sep) + switch { + case n == 0: + return 0 + case n == 1: + return IndexByte(s, sep[0]) + case n <= shortStringLen: + return indexShortStr(s, sep) + case n == len(s): + if sep == s { + return 0 + } + return -1 + case n > len(s): + return -1 + } + // Rabin-Karp search + hashsep, pow := hashStr(sep) + var h uint32 + for i := 0; i < n; i++ { + h = h*primeRK + uint32(s[i]) + } + if h == hashsep && s[:n] == sep { + return 0 + } + for i := n; i < len(s); { + h *= primeRK + h += uint32(s[i]) + h -= pow * uint32(s[i-n]) + i++ + if h == hashsep && s[i-n:i] == sep { + return i - n + } + } + return -1 +} diff --git a/libgo/go/strings/strings_generic.go b/libgo/go/strings/strings_generic.go new file mode 100644 index 0000000..811cb80 --- /dev/null +++ b/libgo/go/strings/strings_generic.go @@ -0,0 +1,47 @@ +// Copyright 2015 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. + +// +build !amd64 + +package strings + +// TODO: implements short string optimization on non amd64 platforms +// and get rid of strings_amd64.go + +// Index returns the index of the first instance of sep in s, or -1 if sep is not present in s. +func Index(s, sep string) int { + n := len(sep) + switch { + case n == 0: + return 0 + case n == 1: + return IndexByte(s, sep[0]) + case n == len(s): + if sep == s { + return 0 + } + return -1 + case n > len(s): + return -1 + } + // Rabin-Karp search + hashsep, pow := hashStr(sep) + var h uint32 + for i := 0; i < n; i++ { + h = h*primeRK + uint32(s[i]) + } + if h == hashsep && s[:n] == sep { + return 0 + } + for i := n; i < len(s); { + h *= primeRK + h += uint32(s[i]) + h -= pow * uint32(s[i-n]) + i++ + if h == hashsep && s[i-n:i] == sep { + return i - n + } + } + return -1 +} diff --git a/libgo/go/strings/strings_test.go b/libgo/go/strings/strings_test.go index 4e21dea..49f55fe 100644 --- a/libgo/go/strings/strings_test.go +++ b/libgo/go/strings/strings_test.go @@ -59,6 +59,59 @@ var indexTests = []IndexTest{ {"abc", "b", 1}, {"abc", "c", 2}, {"abc", "x", -1}, + // test special cases in Index() for short strings + {"", "ab", -1}, + {"bc", "ab", -1}, + {"ab", "ab", 0}, + {"xab", "ab", 1}, + {"xab"[:2], "ab", -1}, + {"", "abc", -1}, + {"xbc", "abc", -1}, + {"abc", "abc", 0}, + {"xabc", "abc", 1}, + {"xabc"[:3], "abc", -1}, + {"xabxc", "abc", -1}, + {"", "abcd", -1}, + {"xbcd", "abcd", -1}, + {"abcd", "abcd", 0}, + {"xabcd", "abcd", 1}, + {"xyabcd"[:5], "abcd", -1}, + {"xbcqq", "abcqq", -1}, + {"abcqq", "abcqq", 0}, + {"xabcqq", "abcqq", 1}, + {"xyabcqq"[:6], "abcqq", -1}, + {"xabxcqq", "abcqq", -1}, + {"xabcqxq", "abcqq", -1}, + {"", "01234567", -1}, + {"32145678", "01234567", -1}, + {"01234567", "01234567", 0}, + {"x01234567", "01234567", 1}, + {"xx01234567"[:9], "01234567", -1}, + {"", "0123456789", -1}, + {"3214567844", "0123456789", -1}, + {"0123456789", "0123456789", 0}, + {"x0123456789", "0123456789", 1}, + {"xyz0123456789"[:12], "0123456789", -1}, + {"x01234567x89", "0123456789", -1}, + {"", "0123456789012345", -1}, + {"3214567889012345", "0123456789012345", -1}, + {"0123456789012345", "0123456789012345", 0}, + {"x0123456789012345", "0123456789012345", 1}, + {"", "01234567890123456789", -1}, + {"32145678890123456789", "01234567890123456789", -1}, + {"01234567890123456789", "01234567890123456789", 0}, + {"x01234567890123456789", "01234567890123456789", 1}, + {"xyz01234567890123456789"[:22], "01234567890123456789", -1}, + {"", "0123456789012345678901234567890", -1}, + {"321456788901234567890123456789012345678911", "0123456789012345678901234567890", -1}, + {"0123456789012345678901234567890", "0123456789012345678901234567890", 0}, + {"x0123456789012345678901234567890", "0123456789012345678901234567890", 1}, + {"xyz0123456789012345678901234567890"[:33], "0123456789012345678901234567890", -1}, + {"", "01234567890123456789012345678901", -1}, + {"32145678890123456789012345678901234567890211", "01234567890123456789012345678901", -1}, + {"01234567890123456789012345678901", "01234567890123456789012345678901", 0}, + {"x01234567890123456789012345678901", "01234567890123456789012345678901", 1}, + {"xyz01234567890123456789012345678901"[:34], "01234567890123456789012345678901", -1}, } var lastIndexTests = []IndexTest{ |