aboutsummaryrefslogtreecommitdiff
path: root/src/bytes
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2017-11-13 21:30:22 -0500
committerRuss Cox <rsc@golang.org>2017-11-15 21:26:05 +0000
commit2a166c93a3d2a7ba73e129649b7b41b6c696e74a (patch)
treea2c7abc248f36af6c1376ecff37e790e90253cf4 /src/bytes
parente7628bee6e8ddac41b213d9ed0b2d6e4051674e4 (diff)
downloadgo-2a166c93a3d2a7ba73e129649b7b41b6c696e74a.tar.xz
bytes, strings: restore O(1) behavior of IndexAny(s, "") and LastIndexAny(s, "")
CL 65851 (bytes) and CL 65910 (strings) “improve[d] readability” by removing the special case that bypassed the whole function body when chars == "". In doing so, yes, the function was unindented a level, which is nice, but the runtime of that case went from O(1) to O(n) where n = len(s). I don't know if anyone's code depends on the O(1) behavior in this case, but quite possibly someone's does. This CL adds the special case back, with a comment to prevent future deletions, and without reindenting each function body in full. Change-Id: I5aba33922b304dd1b8657e6d51d6c937a7f95c81 Reviewed-on: https://go-review.googlesource.com/78112 Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/bytes')
-rw-r--r--src/bytes/bytes.go8
-rw-r--r--src/bytes/example_test.go2
2 files changed, 9 insertions, 1 deletions
diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go
index 260f32500a..9af177fa88 100644
--- a/src/bytes/bytes.go
+++ b/src/bytes/bytes.go
@@ -144,6 +144,10 @@ func IndexRune(s []byte, r rune) int {
// code points in chars. It returns -1 if chars is empty or if there is no code
// point in common.
func IndexAny(s []byte, chars string) int {
+ if chars == "" {
+ // Avoid scanning all of s.
+ return -1
+ }
if len(s) > 8 {
if as, isASCII := makeASCIISet(chars); isASCII {
for i, c := range s {
@@ -176,6 +180,10 @@ func IndexAny(s []byte, chars string) int {
// the Unicode code points in chars. It returns -1 if chars is empty or if
// there is no code point in common.
func LastIndexAny(s []byte, chars string) int {
+ if chars == "" {
+ // Avoid scanning all of s.
+ return -1
+ }
if len(s) > 8 {
if as, isASCII := makeASCIISet(chars); isASCII {
for i := len(s) - 1; i >= 0; i-- {
diff --git a/src/bytes/example_test.go b/src/bytes/example_test.go
index 00e39cadcb..5b7a46058f 100644
--- a/src/bytes/example_test.go
+++ b/src/bytes/example_test.go
@@ -155,7 +155,7 @@ func ExampleCount() {
func ExampleEqual() {
fmt.Println(bytes.Equal([]byte("Go"), []byte("Go")))
- fmt.Println(bytes.Equal([]byte("Go"), []byte("go")))
+ fmt.Println(bytes.Equal([]byte("Go"), []byte("C++")))
// Output:
// true
// false