mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-26 03:25:35 +00:00
ea25ef8236
We use this pattern in a number of places (in this repo and elsewhere) and I was about to add a fourth to this repo which was crossing the line. Add this type instead so they're all the same. Also, we have another Set type (SliceSet, which tracks its keys in order) in another repo we can move to this package later. Change-Id: Ibbdcdba5443fae9b6956f63990bdb9e9443cefa9 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
31 lines
768 B
Go
31 lines
768 B
Go
// Copyright (c) 2022 Tailscale Inc & AUTHORS All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Package set contains set types.
|
|
package set
|
|
|
|
// HandleSet is a set of T.
|
|
//
|
|
// It is not safe for concurrent use.
|
|
type HandleSet[T any] map[Handle]T
|
|
|
|
// Handle is a opaque comparable value that's used as the map key
|
|
// in a HandleSet. The only way to get one is to call HandleSet.Add.
|
|
type Handle struct {
|
|
v *byte
|
|
}
|
|
|
|
// Add adds the element (map value) e to the set.
|
|
//
|
|
// It returns the handle (map key) with which e can be removed, using a map
|
|
// delete.
|
|
func (s *HandleSet[T]) Add(e T) Handle {
|
|
h := Handle{new(byte)}
|
|
if *s == nil {
|
|
*s = make(HandleSet[T])
|
|
}
|
|
(*s)[h] = e
|
|
return h
|
|
}
|