|
@@ -0,0 +1,95 @@
|
|
|
+package util
|
|
|
+
|
|
|
+import (
|
|
|
+ "container/list"
|
|
|
+ "sync"
|
|
|
+)
|
|
|
+
|
|
|
+
|
|
|
+type Queue struct {
|
|
|
+ l *list.List
|
|
|
+ m sync.Mutex
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func NewQueue() *Queue {
|
|
|
+ return &Queue{l: list.New()}
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func (q *Queue) PushBack(v interface{}) *list.Element {
|
|
|
+ q.m.Lock()
|
|
|
+ defer q.m.Unlock()
|
|
|
+
|
|
|
+ return q.l.PushBack(v)
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func (q *Queue) PushFront(v interface{}) *list.Element {
|
|
|
+ q.m.Lock()
|
|
|
+ defer q.m.Unlock()
|
|
|
+
|
|
|
+ return q.l.PushFront(v)
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+func (q *Queue) InsertBefore(v interface{}, mark *list.Element) *list.Element {
|
|
|
+ q.m.Lock()
|
|
|
+ defer q.m.Unlock()
|
|
|
+
|
|
|
+ return q.l.InsertBefore(v, mark)
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+func (q *Queue) InsertAfter(v interface{}, mark *list.Element) *list.Element {
|
|
|
+ q.m.Lock()
|
|
|
+ defer q.m.Unlock()
|
|
|
+
|
|
|
+ return q.l.InsertAfter(v, mark)
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+func (q *Queue) Remove(e *list.Element) interface{} {
|
|
|
+ q.m.Lock()
|
|
|
+ defer q.m.Unlock()
|
|
|
+
|
|
|
+ return q.l.Remove(e)
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+func (q *Queue) Len() int {
|
|
|
+ q.m.Lock()
|
|
|
+ defer q.m.Unlock()
|
|
|
+ return q.l.Len()
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func (q *Queue) Back() *list.Element {
|
|
|
+ q.m.Lock()
|
|
|
+ defer q.m.Unlock()
|
|
|
+
|
|
|
+ return q.l.Back()
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func (q *Queue) Front() *list.Element {
|
|
|
+ q.m.Lock()
|
|
|
+ defer q.m.Unlock()
|
|
|
+
|
|
|
+ return q.l.Front()
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func (q *Queue) Init(v interface{}, mark *list.Element) *list.List {
|
|
|
+ q.m.Lock()
|
|
|
+ defer q.m.Unlock()
|
|
|
+
|
|
|
+ return q.l.Init()
|
|
|
+}
|