types/mapx/repopulate.go
Rama main · réplica de lectura del repositorio original.
// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause
package mapx
// RepopulateNonzero re-uses an existing map (preserving its allocated
// buckets) by zeroing all values, calling populate to re-fill it, and
// then deleting any entries still at their zero value. If *m is nil it
// is lazily initialized.
//
// This avoids the allocation cost of creating a new map on every call,
// which matters for maps that are rebuilt frequently (e.g. on every
// netmap update).
func RepopulateNonzero[K comparable, V comparable](m *map[K]V, populate func()) {
if *m == nil {
*m = make(map[K]V)
}
var zero V
for k := range *m {
(*m)[k] = zero
}
populate()
for k, v := range *m {
if v == zero {
delete(*m, k)
}
}
}