Skip to content

Commit

Permalink
slices: add in-place Reverse function
Browse files Browse the repository at this point in the history
Fixes golang#58565

Change-Id: I583f8380c12386178fb18e553322bbb019d9fae0
Reviewed-on: https://go-review.googlesource.com/c/go/+/468855
Run-TryBot: Alan Donovan <adonovan@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Shay Nehmad <dude500@gmail.com>
  • Loading branch information
adonovan authored and eric committed Sep 7, 2023
1 parent e19d9ef commit 1c59000
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 0 deletions.
1 change: 1 addition & 0 deletions api/next/58565.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pkg slices, func Reverse[$0 interface{}]([]$0) #58565
7 changes: 7 additions & 0 deletions src/slices/slices.go
Original file line number Diff line number Diff line change
Expand Up @@ -445,3 +445,10 @@ func startIdx[S ~[]E, E any](haystack, needle S) int {
// TODO: what if the overlap is by a non-integral number of Es?
panic("needle not found")
}

// Reverse reverses the elements of the slice in place.
func Reverse[E any](s []E) {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
}
28 changes: 28 additions & 0 deletions src/slices/slices_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,34 @@ func TestClip(t *testing.T) {
}
}

func TestReverse(t *testing.T) {
even := []int{3, 1, 4, 1, 5, 9} // len = 6
Reverse(even)
if want := []int{9, 5, 1, 4, 1, 3}; !Equal(even, want) {
t.Errorf("Reverse(even) = %v, want %v", even, want)
}

odd := []int{3, 1, 4, 1, 5, 9, 2} // len = 7
Reverse(odd)
if want := []int{2, 9, 5, 1, 4, 1, 3}; !Equal(odd, want) {
t.Errorf("Reverse(odd) = %v, want %v", odd, want)
}

words := strings.Fields("one two three")
Reverse(words)
if want := strings.Fields("three two one"); !Equal(words, want) {
t.Errorf("Reverse(words) = %v, want %v", words, want)
}

singleton := []string{"one"}
Reverse(singleton)
if want := []string{"one"}; !Equal(singleton, want) {
t.Errorf("Reverse(singeleton) = %v, want %v", singleton, want)
}

Reverse[string](nil)
}

// naiveReplace is a baseline implementation to the Replace function.
func naiveReplace[S ~[]E, E any](s S, i, j int, v ...E) S {
s = Delete(s, i, j)
Expand Down

0 comments on commit 1c59000

Please sign in to comment.