mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-25 19:15:34 +00:00
71029cea2d
This updates all source files to use a new standard header for copyright and license declaration. Notably, copyright no longer includes a date, and we now use the standard SPDX-License-Identifier header. This commit was done almost entirely mechanically with perl, and then some minimal manual fixes. Updates #6865 Signed-off-by: Will Norris <will@tailscale.com>
63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
// Package uniq provides removal of adjacent duplicate elements in slices.
|
|
// It is similar to the unix command uniq.
|
|
package uniq
|
|
|
|
// ModifySlice removes adjacent duplicate elements from the given slice. It
|
|
// adjusts the length of the slice appropriately and zeros the tail.
|
|
//
|
|
// ModifySlice does O(len(*slice)) operations.
|
|
func ModifySlice[E comparable](slice *[]E) {
|
|
// Remove duplicates
|
|
dst := 0
|
|
for i := 1; i < len(*slice); i++ {
|
|
if (*slice)[i] == (*slice)[dst] {
|
|
continue
|
|
}
|
|
dst++
|
|
(*slice)[dst] = (*slice)[i]
|
|
}
|
|
|
|
// Zero out the elements we removed at the end of the slice
|
|
end := dst + 1
|
|
var zero E
|
|
for i := end; i < len(*slice); i++ {
|
|
(*slice)[i] = zero
|
|
}
|
|
|
|
// Truncate the slice
|
|
if end < len(*slice) {
|
|
*slice = (*slice)[:end]
|
|
}
|
|
}
|
|
|
|
// ModifySliceFunc is the same as ModifySlice except that it allows using a
|
|
// custom comparison function.
|
|
//
|
|
// eq should report whether the two provided elements are equal.
|
|
func ModifySliceFunc[E any](slice *[]E, eq func(i, j E) bool) {
|
|
// Remove duplicates
|
|
dst := 0
|
|
for i := 1; i < len(*slice); i++ {
|
|
if eq((*slice)[dst], (*slice)[i]) {
|
|
continue
|
|
}
|
|
dst++
|
|
(*slice)[dst] = (*slice)[i]
|
|
}
|
|
|
|
// Zero out the elements we removed at the end of the slice
|
|
end := dst + 1
|
|
var zero E
|
|
for i := end; i < len(*slice); i++ {
|
|
(*slice)[i] = zero
|
|
}
|
|
|
|
// Truncate the slice
|
|
if end < len(*slice) {
|
|
*slice = (*slice)[:end]
|
|
}
|
|
}
|