diff options
| author | 2023-07-07 17:07:50 +0000 | |
|---|---|---|
| committer | 2023-07-07 17:07:50 +0000 | |
| commit | 702ef0a07aea7b453fac6df2ad1a4ffb2576be3b (patch) | |
| tree | 126eeb15566847582354844298525b2e80e9fe16 | |
| parent | f67bc4484823b59a211acc45f96a5ba4cd055274 (diff) | |
| parent | b5e3f7dad55010cbc847a5cfc7135eac9ca0d948 (diff) | |
Merge changes I70f81120,If8f2534e into main
* changes:
Export ReverseSliceInPlace and ReverseSlice
Make CopyOf generic
| -rw-r--r-- | android/arch.go | 4 | ||||
| -rw-r--r-- | android/depset_generic.go | 6 | ||||
| -rw-r--r-- | android/util.go | 12 | ||||
| -rw-r--r-- | android/util_test.go | 63 |
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") + } + }) + } +} |