mirror of https://github.com/poanetwork/gecko.git
108 lines
2.1 KiB
Go
108 lines
2.1 KiB
Go
|
// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
|
||
|
// See the file LICENSE for licensing terms.
|
||
|
|
||
|
package ids
|
||
|
|
||
|
import (
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// Set is a set of IDs
|
||
|
type Set map[[32]byte]bool
|
||
|
|
||
|
func (ids *Set) init(size int) {
|
||
|
if *ids == nil {
|
||
|
*ids = make(map[[32]byte]bool, size)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Add all the ids to this set, if the id is already in the set, nothing happens
|
||
|
func (ids *Set) Add(idList ...ID) {
|
||
|
ids.init(2 * len(idList))
|
||
|
for _, id := range idList {
|
||
|
(*ids)[*id.ID] = true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Union adds all the ids from the provided sets to this set.
|
||
|
func (ids *Set) Union(set Set) {
|
||
|
ids.init(2 * set.Len())
|
||
|
for id := range set {
|
||
|
(*ids)[id] = true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Contains returns true if the set contains this id, false otherwise
|
||
|
func (ids *Set) Contains(id ID) bool {
|
||
|
ids.init(1)
|
||
|
return (*ids)[*id.ID]
|
||
|
}
|
||
|
|
||
|
// Overlaps returns true if the intersection of the set is non-empty
|
||
|
func (ids *Set) Overlaps(big Set) bool {
|
||
|
small := *ids
|
||
|
if small.Len() > big.Len() {
|
||
|
small = big
|
||
|
big = *ids
|
||
|
}
|
||
|
|
||
|
for _, id := range small.List() {
|
||
|
if big.Contains(id) {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
// Len returns the number of ids in this set
|
||
|
func (ids Set) Len() int { return len(ids) }
|
||
|
|
||
|
// Remove all the id from this set, if the id isn't in the set, nothing happens
|
||
|
func (ids *Set) Remove(idList ...ID) {
|
||
|
ids.init(1)
|
||
|
for _, id := range idList {
|
||
|
delete(*ids, *id.ID)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Clear empties this set
|
||
|
func (ids *Set) Clear() { *ids = nil }
|
||
|
|
||
|
// List converts this set into a list
|
||
|
func (ids Set) List() []ID {
|
||
|
idList := []ID(nil)
|
||
|
for id := range ids {
|
||
|
idList = append(idList, NewID(id))
|
||
|
}
|
||
|
return idList
|
||
|
}
|
||
|
|
||
|
// Equals returns true if the sets contain the same elements
|
||
|
func (ids Set) Equals(oIDs Set) bool {
|
||
|
if ids.Len() != oIDs.Len() {
|
||
|
return false
|
||
|
}
|
||
|
for key := range oIDs {
|
||
|
if !ids[key] {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// String returns the string representation of a set
|
||
|
func (ids Set) String() string {
|
||
|
sb := strings.Builder{}
|
||
|
sb.WriteString("{")
|
||
|
first := true
|
||
|
for idBytes := range ids {
|
||
|
if !first {
|
||
|
sb.WriteString(", ")
|
||
|
}
|
||
|
first = false
|
||
|
sb.WriteString(NewID(idBytes).String())
|
||
|
}
|
||
|
sb.WriteString("}")
|
||
|
return sb.String()
|
||
|
}
|