summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Colin Cross <ccross@android.com> 2023-07-07 17:07:50 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2023-07-07 17:07:50 +0000
commit702ef0a07aea7b453fac6df2ad1a4ffb2576be3b (patch)
tree126eeb15566847582354844298525b2e80e9fe16
parentf67bc4484823b59a211acc45f96a5ba4cd055274 (diff)
parentb5e3f7dad55010cbc847a5cfc7135eac9ca0d948 (diff)
Merge changes I70f81120,If8f2534e into main
* changes: Export ReverseSliceInPlace and ReverseSlice Make CopyOf generic
-rw-r--r--android/arch.go4
-rw-r--r--android/depset_generic.go6
-rw-r--r--android/util.go12
-rw-r--r--android/util_test.go63
4 files changed, 76 insertions, 9 deletions
diff --git a/android/arch.go b/android/arch.go
index 4b4691b3d..152016cd1 100644
--- a/android/arch.go
+++ b/android/arch.go
@@ -1884,10 +1884,10 @@ func decodeMultilibTargets(multilib string, targets []Target, prefer32 bool) ([]
buildTargets = filterMultilibTargets(targets, "lib64")
// Reverse the targets so that the first architecture can depend on the second
// architecture module in order to merge the outputs.
- reverseSliceInPlace(buildTargets)
+ ReverseSliceInPlace(buildTargets)
case "darwin_universal_common_first":
archTargets := filterMultilibTargets(targets, "lib64")
- reverseSliceInPlace(archTargets)
+ ReverseSliceInPlace(archTargets)
buildTargets = append(getCommonTargets(targets), archTargets...)
default:
return nil, fmt.Errorf(`compile_multilib must be "both", "first", "32", "64", "prefer32" or "first_prefer32" found %q`,
diff --git a/android/depset_generic.go b/android/depset_generic.go
index 4f31b8697..45c193715 100644
--- a/android/depset_generic.go
+++ b/android/depset_generic.go
@@ -79,8 +79,8 @@ func NewDepSet[T depSettableType](order DepSetOrder, direct []T, transitive []*D
if order == TOPOLOGICAL {
// TOPOLOGICAL is implemented as a postorder traversal followed by reversing the output.
// Pre-reverse the inputs here so their order is maintained in the output.
- directCopy = reverseSlice(direct)
- transitiveCopy = reverseSlice(transitive)
+ directCopy = ReverseSlice(direct)
+ transitiveCopy = ReverseSlice(transitive)
} else {
directCopy = append([]T(nil), direct...)
transitiveCopy = append([]*DepSet[T](nil), transitive...)
@@ -184,7 +184,7 @@ func (d *DepSet[T]) ToList() []T {
})
list = firstUniqueInPlace(list)
if d.reverse {
- reverseSliceInPlace(list)
+ ReverseSliceInPlace(list)
}
return list
}
diff --git a/android/util.go b/android/util.go
index 50bf5aa54..e17d7b213 100644
--- a/android/util.go
+++ b/android/util.go
@@ -351,15 +351,19 @@ func firstUniqueMap[T comparable](in []T) []T {
return in[0:writeIndex]
}
-// reverseSliceInPlace reverses the elements of a slice in place.
-func reverseSliceInPlace[T any](in []T) {
+// ReverseSliceInPlace reverses the elements of a slice in place and returns it.
+func ReverseSliceInPlace[T any](in []T) []T {
for i, j := 0, len(in)-1; i < j; i, j = i+1, j-1 {
in[i], in[j] = in[j], in[i]
}
+ return in
}
-// reverseSlice returns a copy of a slice in reverse order.
-func reverseSlice[T any](in []T) []T {
+// ReverseSlice returns a copy of a slice in reverse order.
+func ReverseSlice[T any](in []T) []T {
+ if in == nil {
+ return in
+ }
out := make([]T, len(in))
for i := 0; i < len(in); i++ {
out[i] = in[len(in)-1-i]
diff --git a/android/util_test.go b/android/util_test.go
index 0e28b568b..20161e52d 100644
--- a/android/util_test.go
+++ b/android/util_test.go
@@ -20,6 +20,7 @@ import (
"strconv"
"strings"
"testing"
+ "unsafe"
)
var firstUniqueStringsTestCases = []struct {
@@ -754,3 +755,65 @@ func TestSortedUniqueStringValues(t *testing.T) {
})
}
}
+
+var reverseTestCases = []struct {
+ name string
+ in []string
+ expected []string
+}{
+ {
+ name: "nil",
+ in: nil,
+ expected: nil,
+ },
+ {
+ name: "empty",
+ in: []string{},
+ expected: []string{},
+ },
+ {
+ name: "one",
+ in: []string{"one"},
+ expected: []string{"one"},
+ },
+ {
+ name: "even",
+ in: []string{"one", "two"},
+ expected: []string{"two", "one"},
+ },
+ {
+ name: "odd",
+ in: []string{"one", "two", "three"},
+ expected: []string{"three", "two", "one"},
+ },
+}
+
+func TestReverseSliceInPlace(t *testing.T) {
+ for _, testCase := range reverseTestCases {
+ t.Run(testCase.name, func(t *testing.T) {
+ slice := CopyOf(testCase.in)
+ slice2 := slice
+ ReverseSliceInPlace(slice)
+ if !reflect.DeepEqual(slice, testCase.expected) {
+ t.Errorf("expected %#v, got %#v", testCase.expected, slice)
+ }
+ if unsafe.SliceData(slice) != unsafe.SliceData(slice2) {
+ t.Errorf("expected slices to share backing array")
+ }
+ })
+ }
+}
+
+func TestReverseSlice(t *testing.T) {
+ for _, testCase := range reverseTestCases {
+ t.Run(testCase.name, func(t *testing.T) {
+ slice := ReverseSlice(testCase.in)
+ if !reflect.DeepEqual(slice, testCase.expected) {
+ t.Errorf("expected %#v, got %#v", testCase.expected, slice)
+ }
+ if slice != nil && unsafe.SliceData(testCase.in) == unsafe.SliceData(slice) {
+ t.Errorf("expected slices to have different backing arrays")
+ }
+ })
+ }
+}