mirror of
https://github.com/gonum/gonum.git
synced 2025-10-06 23:52:47 +08:00
55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
// Copyright ©2014 The Gonum 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 uid implements unique ID provision for graphs.
|
|
package uid
|
|
|
|
import "gonum.org/v1/gonum/graph/internal/set"
|
|
|
|
// Max is the maximum value of int64.
|
|
const Max = int64(^uint64(0) >> 1)
|
|
|
|
// Set implements available ID storage.
|
|
type Set struct {
|
|
maxID int64
|
|
used, free set.Int64s
|
|
}
|
|
|
|
// NewSet returns a new Set. The returned value should not be passed except by pointer.
|
|
func NewSet() Set {
|
|
return Set{maxID: -1, used: make(set.Int64s), free: make(set.Int64s)}
|
|
}
|
|
|
|
// NewID returns a new unique ID. The ID returned is not considered used
|
|
// until passed in a call to use.
|
|
func (s *Set) NewID() int64 {
|
|
for id := range s.free {
|
|
return id
|
|
}
|
|
if s.maxID != Max {
|
|
return s.maxID + 1
|
|
}
|
|
for id := int64(0); id <= s.maxID+1; id++ {
|
|
if !s.used.Has(id) {
|
|
return id
|
|
}
|
|
}
|
|
panic("unreachable")
|
|
}
|
|
|
|
// Use adds the id to the used IDs in the Set.
|
|
func (s *Set) Use(id int64) {
|
|
s.used.Add(id)
|
|
s.free.Remove(id)
|
|
if id > s.maxID {
|
|
s.maxID = id
|
|
}
|
|
}
|
|
|
|
// Release frees the id for reuse.
|
|
func (s *Set) Release(id int64) {
|
|
s.free.Add(id)
|
|
s.used.Remove(id)
|
|
}
|