diff options
Diffstat (limited to 'weed/util/queue.go')
| -rw-r--r-- | weed/util/queue.go | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/weed/util/queue.go b/weed/util/queue.go index 1e6211e0d..1437fe8be 100644 --- a/weed/util/queue.go +++ b/weed/util/queue.go @@ -1,35 +1,37 @@ package util -import "sync" +import ( + "sync" +) -type node struct { - data interface{} - next *node +type node[T any]struct { + data T + next *node[T] } -type Queue struct { - head *node - tail *node +type Queue[T any] struct { + head *node[T] + tail *node[T] count int sync.RWMutex } -func NewQueue() *Queue { - q := &Queue{} +func NewQueue[T any]() *Queue[T] { + q := &Queue[T]{} return q } -func (q *Queue) Len() int { +func (q *Queue[T]) Len() int { q.RLock() defer q.RUnlock() return q.count } -func (q *Queue) Enqueue(item interface{}) { +func (q *Queue[T]) Enqueue(item T) { q.Lock() defer q.Unlock() - n := &node{data: item} + n := &node[T]{data: item} if q.tail == nil { q.tail = n @@ -41,12 +43,12 @@ func (q *Queue) Enqueue(item interface{}) { q.count++ } -func (q *Queue) Dequeue() interface{} { +func (q *Queue[T]) Dequeue() (result T) { q.Lock() defer q.Unlock() if q.head == nil { - return nil + return } n := q.head |
