gitee.com/sy_183/go-common@v1.0.5-0.20231205030221-958cfe129b47/container/linked-map.go (about)

     1  package container
     2  
     3  import "gitee.com/sy_183/go-common/maps"
     4  
     5  type LinkedMapEntry[K comparable, V any] struct {
     6  	key   K
     7  	value V
     8  	next  *LinkedMapEntry[K, V]
     9  	prev  *LinkedMapEntry[K, V]
    10  }
    11  
    12  func NewLinkedMapEntry[K comparable, V any](key K, value V) *LinkedMapEntry[K, V] {
    13  	return &LinkedMapEntry[K, V]{key: key, value: value}
    14  }
    15  
    16  func (e *LinkedMapEntry[K, V]) Key() K {
    17  	return e.key
    18  }
    19  
    20  func (e *LinkedMapEntry[K, V]) Value() V {
    21  	return e.value
    22  }
    23  
    24  func (e *LinkedMapEntry[K, V]) Entry() maps.Entry[K, V] {
    25  	return maps.NewEntry(e.key, e.value)
    26  }
    27  
    28  func (e *LinkedMapEntry[K, V]) Set(v V) {
    29  	e.value = v
    30  }
    31  
    32  func (e *LinkedMapEntry[K, V]) Next() *LinkedMapEntry[K, V] {
    33  	if e.next == nil || e.next.next == nil {
    34  		return nil
    35  	}
    36  	return e.next
    37  }
    38  
    39  func (e *LinkedMapEntry[K, V]) Prev() *LinkedMapEntry[K, V] {
    40  	if e.prev == nil || e.prev.prev == nil {
    41  		return nil
    42  	}
    43  	return e.prev
    44  }
    45  
    46  func (e *LinkedMapEntry[K, V]) Removed() bool {
    47  	return e.next == nil && e.prev == nil
    48  }
    49  
    50  type LinkedMap[K comparable, V any] struct {
    51  	entries []*LinkedMapEntry[K, V]
    52  	head    *LinkedMapEntry[K, V]
    53  	tail    *LinkedMapEntry[K, V]
    54  	m       map[K]*LinkedMapEntry[K, V]
    55  }
    56  
    57  func NewLinkedMap[K comparable, V any](entries int, size int) *LinkedMap[K, V] {
    58  	m := &LinkedMap[K, V]{
    59  		entries: make([]*LinkedMapEntry[K, V], entries),
    60  		head:    new(LinkedMapEntry[K, V]),
    61  		tail:    new(LinkedMapEntry[K, V]),
    62  		m:       make(map[K]*LinkedMapEntry[K, V], size),
    63  	}
    64  	m.init()
    65  	return m
    66  }
    67  
    68  func (m *LinkedMap[K, V]) init() {
    69  	rawEntries := make([]LinkedMapEntry[K, V], len(m.entries))
    70  	for i := range rawEntries {
    71  		m.entries[i] = &rawEntries[i]
    72  	}
    73  	m.entries = m.entries[:0]
    74  	m.head.next = m.tail
    75  	m.tail.prev = m.head
    76  }
    77  
    78  func (m *LinkedMap[K, V]) Init(entries int, size int) {
    79  	*m = LinkedMap[K, V]{
    80  		entries: make([]*LinkedMapEntry[K, V], entries),
    81  		head:    new(LinkedMapEntry[K, V]),
    82  		tail:    new(LinkedMapEntry[K, V]),
    83  		m:       make(map[K]*LinkedMapEntry[K, V], size),
    84  	}
    85  	m.init()
    86  }
    87  
    88  func (m *LinkedMap[K, V]) IsNil() bool {
    89  	return m.m == nil
    90  }
    91  
    92  // Len 返回 LinkedMap 的长度
    93  func (m *LinkedMap[K, V]) Len() int {
    94  	return len(m.m)
    95  }
    96  
    97  // Empty 判断 LinkedMap 是否为空
    98  func (m *LinkedMap[K, V]) Empty() bool {
    99  	return len(m.m) == 0
   100  }
   101  
   102  // Has 判断 LinkedMap 中是否包含指定 key
   103  func (m *LinkedMap[K, V]) Has(key K) bool {
   104  	_, has := m.m[key]
   105  	return has
   106  }
   107  
   108  // Get 获取指定 key 对应的值,如果不存在则返回对应的零值
   109  func (m *LinkedMap[K, V]) Get(key K) (value V) {
   110  	if e, exist := m.m[key]; exist {
   111  		return e.value
   112  	}
   113  	return
   114  }
   115  
   116  // GetEntry 获取指定 key 的对应的键值对,返回 nil 则表示未找到指定的 key
   117  func (m *LinkedMap[K, V]) GetEntry(key K) *LinkedMapEntry[K, V] {
   118  	return m.m[key]
   119  }
   120  
   121  // Load 获取指定 key 对应的值,返回值 exist 为 false 则表示未找到对应的值
   122  func (m *LinkedMap[K, V]) Load(key K) (value V, exist bool) {
   123  	e, exist := m.m[key]
   124  	if exist {
   125  		return e.value, true
   126  	}
   127  	return
   128  }
   129  
   130  // HeadKey 获取第一个键值对的 key,返回值 exist 为 false 则表示 LinkedMap 为空
   131  func (m *LinkedMap[K, V]) HeadKey() (key K, exist bool) {
   132  	return m.head.next.key, len(m.m) != 0
   133  }
   134  
   135  // Head 获取第一个键值对的值,返回值 exist 为 false 则表示 LinkedMap 为空
   136  func (m *LinkedMap[K, V]) Head() (value V, exist bool) {
   137  	return m.head.next.value, len(m.m) != 0
   138  }
   139  
   140  // HeadEntry 获取第一个键值对,返回 nil 则表示 LinkedMap 为空
   141  func (m *LinkedMap[K, V]) HeadEntry() *LinkedMapEntry[K, V] {
   142  	if len(m.m) == 0 {
   143  		return nil
   144  	}
   145  	return m.head.next
   146  }
   147  
   148  // Tail 获取最后一个键值对的值,返回值 exist 为 false 则表示 LinkedMap 为空
   149  func (m *LinkedMap[K, V]) Tail() (value V, exist bool) {
   150  	return m.tail.prev.value, len(m.m) != 0
   151  }
   152  
   153  // TailEntry 获取第一个键值对,返回 nil 则表示 LinkedMap 为空
   154  func (m *LinkedMap[K, V]) TailEntry() *LinkedMapEntry[K, V] {
   155  	if len(m.m) == 0 {
   156  		return nil
   157  	}
   158  	return m.tail.prev
   159  }
   160  
   161  func (m *LinkedMap[K, V]) Range(f func(key K, value V) bool) bool {
   162  	var next *LinkedMapEntry[K, V]
   163  	for cur := m.head.next; cur.next != nil; cur = next {
   164  		next = cur.next
   165  		if !f(cur.key, cur.value) {
   166  			return false
   167  		}
   168  	}
   169  	return true
   170  }
   171  
   172  func (m *LinkedMap[K, V]) RangeEntries(f func(e *LinkedMapEntry[K, V]) bool) bool {
   173  	var next *LinkedMapEntry[K, V]
   174  	for cur := m.head.next; cur.next != nil; cur = next {
   175  		next = cur.next
   176  		if !f(cur) {
   177  			return false
   178  		}
   179  	}
   180  	return true
   181  }
   182  
   183  func (m *LinkedMap[K, V]) Keys() (keys []K) {
   184  	keys = make([]K, 0, len(m.m))
   185  	for cur := m.head.next; cur.next != nil; cur = cur.next {
   186  		keys = append(keys, cur.key)
   187  	}
   188  	return
   189  }
   190  
   191  func (m *LinkedMap[K, V]) Values() (values []V) {
   192  	values = make([]V, 0, len(m.m))
   193  	for cur := m.head.next; cur.next != nil; cur = cur.next {
   194  		values = append(values, cur.value)
   195  	}
   196  	return
   197  }
   198  
   199  func (m *LinkedMap[K, V]) Entries() (entries []maps.Entry[K, V]) {
   200  	for cur := m.head.next; cur.next != nil; cur = cur.next {
   201  		entries = append(entries, cur.Entry())
   202  	}
   203  	return
   204  }
   205  
   206  func (m *LinkedMap[K, V]) Map() map[K]V {
   207  	mm := make(map[K]V, len(m.m))
   208  	for cur := m.head.next; cur.next != nil; cur = cur.next {
   209  		mm[cur.key] = cur.value
   210  	}
   211  	return mm
   212  }
   213  
   214  func (m *LinkedMap[K, V]) grow() int {
   215  	l := len(m.entries)
   216  	if l == cap(m.entries) {
   217  		m.entries = append(m.entries, nil)
   218  		m.entries = m.entries[:cap(m.entries)]
   219  		rawEntries := make([]LinkedMapEntry[K, V], cap(m.entries)-l)
   220  		for i := range rawEntries {
   221  			m.entries[i+l] = &rawEntries[i]
   222  		}
   223  		m.entries = m.entries[:l]
   224  	}
   225  	return l
   226  }
   227  
   228  func (m *LinkedMap[K, V]) newEntry(key K, value V) (e *LinkedMapEntry[K, V]) {
   229  	l := m.grow()
   230  	m.entries = m.entries[:l+1]
   231  	e = m.entries[l]
   232  	e.key = key
   233  	e.value = value
   234  	return m.entries[l]
   235  }
   236  
   237  func (m *LinkedMap[K, V]) freeEntry(e *LinkedMapEntry[K, V]) {
   238  	l := len(m.entries)
   239  	m.entries[l-1] = e
   240  	m.entries = m.entries[:l-1]
   241  }
   242  
   243  func (m *LinkedMap[K, V]) addLink(e *LinkedMapEntry[K, V], p *LinkedMapEntry[K, V]) {
   244  	e.prev = p
   245  	e.next = p.next
   246  	p.next.prev = e
   247  	p.next = e
   248  }
   249  
   250  func (m *LinkedMap[K, V]) removeLink(e *LinkedMapEntry[K, V]) {
   251  	e.prev.next = e.next
   252  	e.next.prev = e.prev
   253  	e.next, e.prev = nil, nil
   254  }
   255  
   256  func (m *LinkedMap[K, V]) push(e *LinkedMapEntry[K, V]) {
   257  	m.m[e.key] = e
   258  	m.addLink(e, m.tail.prev)
   259  }
   260  
   261  func (m *LinkedMap[K, V]) unshift(e *LinkedMapEntry[K, V]) {
   262  	m.m[e.key] = e
   263  	m.addLink(e, m.head)
   264  }
   265  
   266  func (m *LinkedMap[K, V]) insert(e, p *LinkedMapEntry[K, V]) {
   267  	m.m[e.key] = e
   268  	m.addLink(e, p)
   269  }
   270  
   271  func (m *LinkedMap[K, V]) remove(e *LinkedMapEntry[K, V]) {
   272  	delete(m.m, e.key)
   273  	m.removeLink(e)
   274  	m.freeEntry(e)
   275  }
   276  
   277  // Store 设置或添加指定 key 的对应的值,如果存在则设置,不存在则添加到尾部
   278  func (m *LinkedMap[K, V]) Store(key K, value V) {
   279  	if e, exist := m.m[key]; exist {
   280  		e.value = value
   281  		return
   282  	}
   283  	m.push(m.newEntry(key, value))
   284  }
   285  
   286  // Set 与 StoreHead 作用相同
   287  func (m *LinkedMap[K, V]) Set(key K, value V) (old V, exist bool) {
   288  	e, exist := m.m[key]
   289  	if exist {
   290  		old = e.value
   291  		e.value = value
   292  		return
   293  	}
   294  	m.unshift(m.newEntry(key, value))
   295  	return
   296  }
   297  
   298  // StoreHead 设置或添加指定 key 的对应的值,如果存在则设置并返回旧的值,不存在则添加到头部,返
   299  // 回值 exist 为 true 则表示指定 key 对应的值存在
   300  func (m *LinkedMap[K, V]) StoreHead(key K, value V) (old V, exist bool) {
   301  	e, exist := m.m[key]
   302  	if exist {
   303  		old = e.value
   304  		e.value = value
   305  		return
   306  	}
   307  	m.unshift(m.newEntry(key, value))
   308  	return
   309  }
   310  
   311  // StoreTail 设置或添加指定 key 的对应的值,如果存在则设置并返回旧的值,不存在则添加到尾部。返
   312  // 回值 exist 为 true 则表示指定 key 对应的值存在
   313  func (m *LinkedMap[K, V]) StoreTail(key K, value V) (old V, exist bool) {
   314  	e, exist := m.m[key]
   315  	if exist {
   316  		old = e.value
   317  		e.value = value
   318  		return
   319  	}
   320  	m.push(m.newEntry(key, value))
   321  	return
   322  }
   323  
   324  func (m *LinkedMap[K, V]) StoreBack(key K, value V, ref *LinkedMapEntry[K, V]) (old V, exist bool) {
   325  	e, exist := m.m[key]
   326  	if exist {
   327  		old = e.value
   328  		e.value = value
   329  		return
   330  	}
   331  	m.insert(m.newEntry(key, value), ref)
   332  	return
   333  }
   334  
   335  func (m *LinkedMap[K, V]) StoreFront(key K, value V, ref *LinkedMapEntry[K, V]) (old V, exist bool) {
   336  	e, exist := m.m[key]
   337  	if exist {
   338  		old = e.value
   339  		e.value = value
   340  		return
   341  	}
   342  	m.insert(m.newEntry(key, value), ref.prev)
   343  	return
   344  }
   345  
   346  // LoadOrStore 获取或添加指定 key 的对应的值,如果存在则获取,不存在则添加到尾部。返回值 exist
   347  // 为 true 则表示指定 key 对应的值存在
   348  func (m *LinkedMap[K, V]) LoadOrStore(key K, value V) (v V, exist bool) {
   349  	e, exist := m.m[key]
   350  	if exist {
   351  		return e.value, true
   352  	}
   353  	m.push(m.newEntry(key, value))
   354  	return value, false
   355  }
   356  
   357  // Replace 替换指定 key 的对应的值,如果不存在则不执行任何操作
   358  func (m *LinkedMap[K, V]) Replace(key K, value V) bool {
   359  	if e, exist := m.m[key]; exist {
   360  		e.value = value
   361  		return true
   362  	}
   363  	return false
   364  }
   365  
   366  // Push 向 LinkedMap 尾部添加指定键值对,如果存在则先移除旧的键值对。返回旧的键值对的值以及是否
   367  // 存在
   368  func (m *LinkedMap[K, V]) Push(key K, value V) (old V, exist bool) {
   369  	e, exist := m.m[key]
   370  	if exist {
   371  		old = e.value
   372  		m.remove(e)
   373  	}
   374  	m.push(m.newEntry(key, value))
   375  	return
   376  }
   377  
   378  // Unshift 向 LinkedMap 头部添加指定键值对,如果存在则先移除旧的键值对。返回旧的键值对的值以及
   379  // 是否存在
   380  func (m *LinkedMap[K, V]) Unshift(key K, value V) (old V, exist bool) {
   381  	e, exist := m.m[key]
   382  	if exist {
   383  		old = e.value
   384  		m.remove(e)
   385  	}
   386  	m.unshift(m.newEntry(key, value))
   387  	return
   388  }
   389  
   390  func (m *LinkedMap[K, V]) InsertBack(key K, value V, ref *LinkedMapEntry[K, V]) (old V, exist bool) {
   391  	e, exist := m.m[key]
   392  	if exist {
   393  		old = e.value
   394  		m.remove(e)
   395  	}
   396  	m.insert(m.newEntry(key, value), ref)
   397  	return
   398  }
   399  
   400  func (m *LinkedMap[K, V]) InsertFront(key K, value V, ref *LinkedMapEntry[K, V]) (old V, exist bool) {
   401  	e, exist := m.m[key]
   402  	if exist {
   403  		old = e.value
   404  		m.remove(e)
   405  	}
   406  	m.insert(m.newEntry(key, value), ref.prev)
   407  	return
   408  }
   409  
   410  func (m *LinkedMap[K, V]) Remove(key K) (old V, exist bool) {
   411  	e, exist := m.m[key]
   412  	if exist {
   413  		old = e.value
   414  		m.remove(e)
   415  		return
   416  	}
   417  	return
   418  }
   419  
   420  func (m *LinkedMap[K, V]) RemoveEntry(e *LinkedMapEntry[K, V]) bool {
   421  	if e.Removed() {
   422  		return false
   423  	}
   424  	m.remove(e)
   425  	return true
   426  }
   427  
   428  func (m *LinkedMap[K, V]) Delete(key K) {
   429  	if e, exist := m.m[key]; exist {
   430  		m.remove(e)
   431  	}
   432  }
   433  
   434  func (m *LinkedMap[K, V]) LoadAndDelete(key K) (v V, exist bool) {
   435  	e, exist := m.m[key]
   436  	if exist {
   437  		v = e.value
   438  		m.remove(e)
   439  	}
   440  	return
   441  }
   442  
   443  func (m *LinkedMap[K, V]) Shift() (v V, exist bool) {
   444  	if len(m.m) == 0 {
   445  		return
   446  	}
   447  	e := m.head.next
   448  	v, exist = e.value, true
   449  	m.remove(e)
   450  	return
   451  }
   452  
   453  func (m *LinkedMap[K, V]) ShiftKey() (k K, exist bool) {
   454  	if len(m.m) == 0 {
   455  		return
   456  	}
   457  	e := m.head.next
   458  	k, exist = e.key, true
   459  	m.remove(e)
   460  	return
   461  }
   462  
   463  func (m *LinkedMap[K, V]) ShiftEntry() (e maps.Entry[K, V], exist bool) {
   464  	if len(m.m) == 0 {
   465  		return
   466  	}
   467  	entry := m.head.next
   468  	e, exist = entry.Entry(), true
   469  	m.remove(entry)
   470  	return
   471  }
   472  
   473  func (m *LinkedMap[K, V]) Pop() (v V, exist bool) {
   474  	if len(m.m) == 0 {
   475  		return
   476  	}
   477  	e := m.tail.prev
   478  	v, exist = e.value, true
   479  	m.remove(e)
   480  	return
   481  }
   482  
   483  func (m *LinkedMap[K, V]) PopKey() (k K, exist bool) {
   484  	if len(m.m) == 0 {
   485  		return
   486  	}
   487  	e := m.tail.prev
   488  	k, exist = e.key, true
   489  	m.remove(e)
   490  	return
   491  }
   492  
   493  func (m *LinkedMap[K, V]) Clear() {
   494  	for _, e := range m.entries {
   495  		e.next, e.prev = nil, nil
   496  	}
   497  	for key := range m.m {
   498  		delete(m.m, key)
   499  	}
   500  	m.entries = m.entries[:0]
   501  	m.head.next = m.tail
   502  	m.tail.prev = m.head
   503  }