// Index returns the index of the first occurrence of v in s,
// or -1 if not present.
func Index[E comparable](s []E, v E) int {
- for i, vs := range s {
- if v == vs {
+ for i := range s {
+ if v == s[i] {
return i
}
}
// IndexFunc returns the first index i satisfying f(s[i]),
// or -1 if none do.
func IndexFunc[E any](s []E, f func(E) bool) int {
- for i, v := range s {
- if f(v) {
+ for i := range s {
+ if f(s[i]) {
return i
}
}
return s
}
i := 1
- last := s[0]
- for _, v := range s[1:] {
- if v != last {
- s[i] = v
+ for k := 1; k < len(s); k++ {
+ if s[k] != s[k-1] {
+ if i != k {
+ s[i] = s[k]
+ }
i++
- last = v
}
}
return s[:i]
return s
}
i := 1
- last := s[0]
- for _, v := range s[1:] {
- if !eq(v, last) {
- s[i] = v
+ for k := 1; k < len(s); k++ {
+ if !eq(s[k], s[k-1]) {
+ if i != k {
+ s[i] = s[k]
+ }
i++
- last = v
}
}
return s[:i]
}
}
+func BenchmarkEqualFunc_Large(b *testing.B) {
+ type Large [4 * 1024]byte
+
+ xs := make([]Large, 1024)
+ ys := make([]Large, 1024)
+ for i := 0; i < b.N; i++ {
+ _ = EqualFunc(xs, ys, func(x, y Large) bool { return x == y })
+ }
+}
+
var indexTests = []struct {
s []int
v int
}
}
+func BenchmarkIndex_Large(b *testing.B) {
+ type Large [4 * 1024]byte
+
+ ss := make([]Large, 1024)
+ for i := 0; i < b.N; i++ {
+ _ = Index(ss, Large{1})
+ }
+}
+
func TestIndexFunc(t *testing.T) {
for _, test := range indexTests {
if got := IndexFunc(test.s, equalToIndex(equal[int], test.v)); got != test.want {
}
}
+func BenchmarkIndexFunc_Large(b *testing.B) {
+ type Large [4 * 1024]byte
+
+ ss := make([]Large, 1024)
+ for i := 0; i < b.N; i++ {
+ _ = IndexFunc(ss, func(e Large) bool {
+ return e == Large{1}
+ })
+ }
+}
+
func TestContains(t *testing.T) {
for _, test := range indexTests {
if got := Contains(test.s, test.v); got != (test.want != -1) {
}
})
}
+}
+
+func BenchmarkCompact_Large(b *testing.B) {
+ type Large [4 * 1024]byte
+ ss := make([]Large, 1024)
+ for i := 0; i < b.N; i++ {
+ _ = Compact(ss)
+ }
}
func TestCompactFunc(t *testing.T) {
}
}
+func BenchmarkCompactFunc_Large(b *testing.B) {
+ type Large [4 * 1024]byte
+
+ ss := make([]Large, 1024)
+ for i := 0; i < b.N; i++ {
+ _ = CompactFunc(ss, func(a, b Large) bool { return a == b })
+ }
+}
+
func TestGrow(t *testing.T) {
s1 := []int{1, 2, 3}