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 }