From 0c097498bb06fc339b7f6b5fb17e5dd1b8d24cb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Sun, 3 Dec 2023 11:27:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=93=BE=E8=A1=A8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/utils/linkedlist/list.go | 20 +++++++++++- internal/utils/linkedlist/list_test.go | 43 ++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/internal/utils/linkedlist/list.go b/internal/utils/linkedlist/list.go index 3907427..3bf8b62 100644 --- a/internal/utils/linkedlist/list.go +++ b/internal/utils/linkedlist/list.go @@ -2,7 +2,7 @@ package linkedlist -type List[T any] struct { +type List[T any] struct { head *Item[T] end *Item[T] count int @@ -36,6 +36,15 @@ func (this *List[T]) Push(item *Item[T]) { this.add(item) } +func (this *List[T]) Shift() *Item[T] { + if this.head != nil { + var old = this.head + this.Remove(this.head) + return old + } + return nil +} + func (this *List[T]) Remove(item *Item[T]) { if item == nil { return @@ -71,6 +80,15 @@ func (this *List[T]) Range(f func(item *Item[T]) (goNext bool)) { } } +func (this *List[T]) RangeReverse(f func(item *Item[T]) (goNext bool)) { + for e := this.end; e != nil; e = e.prev { + goNext := f(e) + if !goNext { + break + } + } +} + func (this *List[T]) Reset() { this.head = nil this.end = nil diff --git a/internal/utils/linkedlist/list_test.go b/internal/utils/linkedlist/list_test.go index c60caae..3cec792 100644 --- a/internal/utils/linkedlist/list_test.go +++ b/internal/utils/linkedlist/list_test.go @@ -4,6 +4,7 @@ package linkedlist_test import ( "github.com/TeaOSLab/EdgeNode/internal/utils/linkedlist" + "github.com/iwind/TeaGo/types" "runtime" "strconv" "testing" @@ -95,6 +96,48 @@ func TestList_Push(t *testing.T) { }) } +func TestList_Shift(t *testing.T) { + var list = linkedlist.NewList[int]() + list.Push(linkedlist.NewItem(1)) + list.Push(linkedlist.NewItem(2)) + list.Push(linkedlist.NewItem(3)) + list.Push(linkedlist.NewItem(4)) + + for i := 0; i < 10; i++ { + t.Log("=== before shift " + types.String(i) + " ===") + list.Range(func(item *linkedlist.Item[int]) (goNext bool) { + t.Log(item.Value) + return true + }) + + t.Logf("shift: %+v", list.Shift()) + + t.Log("=== after shift " + types.String(i) + " ===") + list.Range(func(item *linkedlist.Item[int]) (goNext bool) { + t.Log(item.Value) + return true + }) + } +} + +func TestList_RangeReverse(t *testing.T) { + var list = linkedlist.NewList[int]() + list.Push(linkedlist.NewItem(1)) + list.Push(linkedlist.NewItem(2)) + + var item3 = linkedlist.NewItem(3) + list.Push(item3) + + list.Push(linkedlist.NewItem(4)) + + //list.Push(item3) + //list.Remove(item3) + list.RangeReverse(func(item *linkedlist.Item[int]) (goNext bool) { + t.Log(item.Value) + return true + }) +} + func BenchmarkList_Add(b *testing.B) { var list = linkedlist.NewList[int]() for i := 0; i < b.N; i++ {