76 lines
1.3 KiB
Go
76 lines
1.3 KiB
Go
package extypes
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
)
|
|
|
|
var QueueFullErr = errors.New("queue full")
|
|
var QueueEmptyErr = errors.New("queue empty")
|
|
|
|
type Queue[T any] struct {
|
|
size uint64
|
|
mu sync.RWMutex
|
|
queue Slice[T]
|
|
}
|
|
|
|
func CreateQueue[T any](size uint64) *Queue[T] {
|
|
return &Queue[T]{queue: make(Slice[T], 0, size), size: size}
|
|
}
|
|
|
|
func (q *Queue[T]) Len() uint64 {
|
|
q.mu.RLock()
|
|
defer q.mu.RUnlock()
|
|
return uint64(q.queue.Len())
|
|
}
|
|
func (q *Queue[T]) IsEmpty() bool { return q.Len() == 0 }
|
|
func (q *Queue[T]) IsFull() bool { return q.Len() == q.size }
|
|
func (q *Queue[T]) Size() uint64 { return q.size }
|
|
|
|
func (q *Queue[T]) Enqueue(el T) error {
|
|
q.mu.Lock()
|
|
defer q.mu.Unlock()
|
|
|
|
if uint64(len(q.queue)) == q.size {
|
|
return QueueFullErr
|
|
}
|
|
q.queue = q.queue.Push(el)
|
|
return nil
|
|
}
|
|
|
|
func (q *Queue[T]) Dequeue() (T, error) {
|
|
q.mu.Lock()
|
|
defer q.mu.Unlock()
|
|
|
|
var zero T
|
|
if len(q.queue) == 0 {
|
|
return zero, QueueEmptyErr
|
|
}
|
|
|
|
el := q.queue[0]
|
|
copy(q.queue, q.queue[1:])
|
|
q.queue[len(q.queue)-1] = zero
|
|
q.queue = q.queue[:len(q.queue)-1]
|
|
|
|
return el, nil
|
|
}
|
|
|
|
func (q *Queue[T]) Peak() (T, error) {
|
|
q.mu.RLock()
|
|
defer q.mu.RUnlock()
|
|
|
|
var zero T
|
|
if len(q.queue) == 0 {
|
|
return zero, QueueEmptyErr
|
|
}
|
|
|
|
return q.queue[0], nil
|
|
}
|
|
|
|
func (q *Queue[T]) Raw() Slice[T] {
|
|
q.mu.RLock()
|
|
defer q.mu.RUnlock()
|
|
|
|
return NewSliceFrom(q.queue)
|
|
}
|