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  }