github.com/antlabs/stl@v0.0.1/list/list.go (about) 1 package list 2 3 import ( 4 "unsafe" 5 ) 6 7 // 双向节点指针域 8 type Head struct { 9 Next *Head 10 Prev *Head 11 len int 12 } 13 14 // 初始化表头的函数,指向自己形成一个环 15 func (h *Head) Init() { 16 h.Next = h 17 h.Prev = h 18 h.len = 0 19 } 20 21 // 向头部插入节点 22 func (h *Head) Add(new *Head) { 23 h.len++ 24 add(new, h, h.Next) 25 } 26 27 // 向尾部插入节点 28 func (h *Head) AddTail(new *Head) { 29 h.len++ 30 add(new, h.Prev, h) 31 } 32 33 // 删除节点 34 // API可以直接设计成func (h *Head) Del() 。为了管理链表的len,所以设计成如下形式 35 func (h *Head) Del(head *Head) { 36 h.len-- 37 del(head.Prev, head.Next) 38 } 39 40 // 获取当前元素 41 func (pos *Head) Entry(offset uintptr) unsafe.Pointer { 42 return unsafe.Pointer((uintptr(unsafe.Pointer(pos)) - offset)) 43 } 44 45 // 表头调用FirstEntry可以获取第一个元素 46 func (h *Head) FirstEntry(offset uintptr) unsafe.Pointer { 47 return h.NextEntry(offset) 48 } 49 50 // 表头调LastEntry可以获取最后一元素 51 func (h *Head) LastEntry(offset uintptr) unsafe.Pointer { 52 return h.PrevEntry(offset) 53 } 54 55 // 表头调用获取第一个元素,如果列表为空,返回nil 56 func (h *Head) FirstEntryOrNil(offset uintptr) unsafe.Pointer { 57 if h.len == 0 { 58 return nil 59 } 60 61 return h.FirstEntry(offset) 62 } 63 64 // 获取下一个元素 65 func (pos *Head) NextEntry(offset uintptr) unsafe.Pointer { 66 return unsafe.Pointer((uintptr(unsafe.Pointer(pos.Next)) - offset)) 67 } 68 69 // 获取上一个元素 70 func (pos *Head) PrevEntry(offset uintptr) unsafe.Pointer { 71 return unsafe.Pointer((uintptr(unsafe.Pointer(pos.Prev)) - offset)) 72 } 73 74 // 向后遍历函数,如果遍历过程中有修改则不可以使用 75 func (h *Head) ForEach(callback func(pos *Head)) { 76 77 for pos := h.Next; pos != h; pos = pos.Next { 78 callback(pos) 79 } 80 } 81 82 // 向前遍历函数,如果遍历过程中有修改则不可以使用 83 func (h *Head) ForEachPrev(callback func(pos *Head)) { 84 for pos := h.Prev; pos != h; pos = pos.Prev { 85 callback(pos) 86 } 87 } 88 89 // 安全的向后遍历函数,如果遍历过程中有修改可以使用 90 func (h *Head) ForEachSafe(callback func(pos *Head)) { 91 92 pos := h.Next 93 n := pos.Next 94 95 for pos != h { 96 callback(pos) 97 pos = n 98 n = pos.Next 99 } 100 } 101 102 // 安全的向前遍历函数,如果遍历过程中有修改可以使用 103 func (h *Head) ForEachPrevSafe(callback func(pos *Head)) { 104 pos := h.Prev 105 n := pos.Prev 106 for pos != h { 107 callback(pos) 108 pos = n 109 n = pos.Prev 110 } 111 } 112 113 // 长度 114 func (h *Head) Len() int { 115 return h.len 116 } 117 118 func (h *Head) Replace(new *Head) { 119 old := h 120 new.Next = old.Next 121 new.Next.Prev = new 122 new.Prev = old.Prev 123 new.Prev.Next = new 124 new.len = old.len 125 } 126 127 func (h *Head) ReplaceInit(new *Head) { 128 h.Replace(new) 129 h.Init() 130 } 131 132 func (h *Head) DelInit(pos *Head) { 133 h.len-- 134 delEntry(pos) 135 pos.Init() 136 } 137 138 func (h *Head) Move(list *Head) { 139 delEntry(list) 140 h.Add(list) 141 } 142 143 func (h *Head) MoveTail(list *Head) { 144 delEntry(list) 145 h.AddTail(list) 146 } 147 148 func (h *Head) IsLast() bool { 149 return h.Next == h 150 } 151 152 func (h *Head) Empty() bool { 153 //return h.Next == h 154 return h.len == 0 155 } 156 157 func (h *Head) RotateLeft() { 158 var first *Head 159 if !h.Empty() { 160 first = h.Next 161 h.MoveTail(first) 162 } 163 } 164 165 func del(prev *Head, next *Head) { 166 next.Prev = prev 167 prev.Next = next 168 } 169 170 func add(new, prev, next *Head) { 171 next.Prev = new 172 new.Next = next 173 new.Prev = prev 174 prev.Next = new 175 } 176 177 func delEntry(entry *Head) { 178 del(entry.Prev, entry.Next) 179 }