37 lines
640 B
Go
37 lines
640 B
Go
package world
|
|
|
|
func (w *World) candSeenResetIfOverflow() {
|
|
w.candEpoch++
|
|
if w.candEpoch != 0 {
|
|
return
|
|
}
|
|
// overflow: reset stamp array
|
|
for i := range w.candStamp {
|
|
w.candStamp[i] = 0
|
|
}
|
|
w.candEpoch = 1
|
|
}
|
|
|
|
func (w *World) candSeenMark(id PrimitiveID) bool {
|
|
// ensure stamp capacity
|
|
uid := uint32(id)
|
|
if int(uid) >= len(w.candStamp) {
|
|
// grow to next power-ish
|
|
n := len(w.candStamp)
|
|
if n == 0 {
|
|
n = 1024
|
|
}
|
|
for n <= int(uid) {
|
|
n *= 2
|
|
}
|
|
ns := make([]uint32, n)
|
|
copy(ns, w.candStamp)
|
|
w.candStamp = ns
|
|
}
|
|
if w.candStamp[uid] == w.candEpoch {
|
|
return true
|
|
}
|
|
w.candStamp[uid] = w.candEpoch
|
|
return false
|
|
}
|