github.com/turingchain2020/turingchain@v1.1.21/common/listmap/listmap.go (about)

     1  package listmap
     2  
     3  import (
     4  	"container/list"
     5  
     6  	"github.com/turingchain2020/turingchain/types"
     7  )
     8  
     9  //ListMap list 和 map 组合的一个数据结构体
    10  type ListMap struct {
    11  	m map[string]*list.Element
    12  	l *list.List
    13  }
    14  
    15  //New 创建一个新的数据结构
    16  func New() *ListMap {
    17  	return &ListMap{
    18  		m: make(map[string]*list.Element),
    19  		l: list.New(),
    20  	}
    21  }
    22  
    23  //Size 结构中的item 数目
    24  func (lm *ListMap) Size() int {
    25  	return len(lm.m)
    26  }
    27  
    28  //Exist 是否存在这个元素
    29  func (lm *ListMap) Exist(key string) bool {
    30  	_, ok := lm.m[key]
    31  	return ok
    32  }
    33  
    34  //GetItem 通过key 获取这个 item
    35  func (lm *ListMap) GetItem(key string) (interface{}, error) {
    36  	item, ok := lm.m[key]
    37  	if !ok {
    38  		return nil, types.ErrNotFound
    39  	}
    40  	return item.Value, nil
    41  }
    42  
    43  //Push 在队伍尾部插入
    44  func (lm *ListMap) Push(key string, value interface{}) {
    45  	if elm, ok := lm.m[key]; ok {
    46  		elm.Value = value
    47  		return
    48  	}
    49  	elm := lm.l.PushBack(value)
    50  	lm.m[key] = elm
    51  }
    52  
    53  //GetTop 获取队列头部的数据
    54  func (lm *ListMap) GetTop() interface{} {
    55  	elm := lm.l.Front()
    56  	if elm == nil {
    57  		return nil
    58  	}
    59  	return elm.Value
    60  }
    61  
    62  //Remove 删除某个key
    63  func (lm *ListMap) Remove(key string) interface{} {
    64  	if elm, ok := lm.m[key]; ok {
    65  		value := lm.l.Remove(elm)
    66  		delete(lm.m, key)
    67  		return value
    68  	}
    69  	return nil
    70  }
    71  
    72  //Walk 遍历整个结构,如果cb 返回false 那么停止遍历
    73  func (lm *ListMap) Walk(cb func(value interface{}) bool) {
    74  	for e := lm.l.Front(); e != nil; e = e.Next() {
    75  		if cb == nil {
    76  			return
    77  		}
    78  		if !cb(e.Value) {
    79  			return
    80  		}
    81  	}
    82  }