aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlan Donovan <adonovan@google.com>2023-02-16 11:02:12 -0500
committerAlan Donovan <adonovan@google.com>2023-05-19 00:43:02 +0000
commit3ca52f4c319e56986586e3d519924876320b29fb (patch)
tree8b7fb8356d64ba754fbbaebdb5654d9ba1e2ac7b /src
parent58d40d156e98d415236e51cbc9694a2bb1746e86 (diff)
downloadgo-3ca52f4c319e56986586e3d519924876320b29fb.tar.xz
slices: add in-place Reverse function
Fixes #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>
Diffstat (limited to 'src')
-rw-r--r--src/slices/slices.go7
-rw-r--r--src/slices/slices_test.go28
2 files changed, 35 insertions, 0 deletions
diff --git a/src/slices/slices.go b/src/slices/slices.go
index 837863bacc..7de00b342f 100644
--- a/src/slices/slices.go
+++ b/src/slices/slices.go
@@ -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]
+ }
+}
diff --git a/src/slices/slices_test.go b/src/slices/slices_test.go
index 2f3a03bd9f..a99299321f 100644
--- a/src/slices/slices_test.go
+++ b/src/slices/slices_test.go
@@ -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)