mirror of
https://dev.azure.com/schwarzit/schwarzit.stackit-public/_git/audit-go
synced 2026-02-08 00:57:24 +00:00
45 lines
1.2 KiB
Go
45 lines
1.2 KiB
Go
package utils
|
|
|
|
import "sync"
|
|
|
|
// SequenceNumberGenerator can be used to generate increasing numbers.
|
|
type SequenceNumberGenerator interface {
|
|
|
|
// Next returns the next number
|
|
Next() uint64
|
|
|
|
// Revert can be used to decrease the number (e.g. in case of an error)
|
|
Revert()
|
|
}
|
|
|
|
// DefaultSequenceNumberGenerator is a mutex protected implementation of SequenceNumberGenerator
|
|
type DefaultSequenceNumberGenerator struct {
|
|
sequenceNumber uint64
|
|
sequenceNumberLock sync.Mutex
|
|
}
|
|
|
|
// NewDefaultSequenceNumberGenerator returns an instance of DefaultSequenceNumberGenerator as pointer
|
|
// of SequenceNumberGenerator.
|
|
func NewDefaultSequenceNumberGenerator() *SequenceNumberGenerator {
|
|
var generator SequenceNumberGenerator = &DefaultSequenceNumberGenerator{
|
|
sequenceNumber: 0,
|
|
sequenceNumberLock: sync.Mutex{},
|
|
}
|
|
return &generator
|
|
}
|
|
|
|
// Next implements SequenceNumberGenerator.Next
|
|
func (g *DefaultSequenceNumberGenerator) Next() uint64 {
|
|
g.sequenceNumberLock.Lock()
|
|
defer g.sequenceNumberLock.Unlock()
|
|
next := g.sequenceNumber
|
|
g.sequenceNumber += 1
|
|
return next
|
|
}
|
|
|
|
// Revert implements SequenceNumberGenerator.Revert
|
|
func (g *DefaultSequenceNumberGenerator) Revert() {
|
|
g.sequenceNumberLock.Lock()
|
|
defer g.sequenceNumberLock.Unlock()
|
|
g.sequenceNumber -= 1
|
|
}
|