github.com/iEvan-lhr/exciting-tool@v0.0.0-20230504054234-8e983f73cdd2/map.go (about)

     1  package tools
     2  
     3  import (
     4  	"sync"
     5  )
     6  
     7  func Ok(value any, ok bool) any {
     8  	if ok {
     9  		return value
    10  	}
    11  	return nil
    12  }
    13  
    14  type Spider struct {
    15  	Values any
    16  	Key    []byte
    17  	Next   [255]*Spider
    18  	sync   sync.Mutex
    19  	reader *String
    20  	len    int
    21  }
    22  
    23  func (s *Spider) Add(key any, value any) {
    24  	spider := s.getWriteSpider(s.reader.coverWrite(key).buf)
    25  	//log.Println(spider)
    26  	spider.add(value)
    27  }
    28  
    29  func (s *Spider) add(value any) {
    30  	s.Values = value
    31  }
    32  
    33  func (s *Spider) Get(key any) any {
    34  	return s.getReadSpider(s.reader.coverWrite(key).buf).Values
    35  }
    36  
    37  func MakeSpider(key any, value any) *Spider {
    38  	spider := &Spider{}
    39  	spider.reader = &String{}
    40  	spider.Key = spider.reader.Append(key).buf
    41  	spider.getWriteSpider(spider.Key).add(value)
    42  	return spider
    43  }
    44  
    45  func (s *Spider) getWriteSpider(key []byte) *Spider {
    46  	temp := s
    47  	for i := 0; i < len(key); i++ {
    48  		if i == len(key)-1 {
    49  			if temp.Next[key[i]] != nil {
    50  				//位移至新地址
    51  				trans := temp.Next[key[i]]
    52  				temp.Next[key[i]] = &Spider{Key: key}
    53  				s.getWriteSpider(trans.Key).add(trans.Values)
    54  				s.addLen()
    55  				return temp.Next[key[i]]
    56  			} else {
    57  				s.addLen()
    58  				temp.Next[key[i]] = &Spider{Key: key}
    59  				return temp.Next[key[i]]
    60  			}
    61  		}
    62  		if temp.Next[key[i]] == nil {
    63  			temp.Next[key[i]] = &Spider{Key: key}
    64  			s.addLen()
    65  			return temp.Next[key[i]]
    66  		} else if checkBytes(temp.Next[key[i]].Key, key) {
    67  			return temp.Next[key[i]]
    68  		} else {
    69  			temp = temp.Next[key[i]]
    70  		}
    71  	}
    72  	return nil
    73  }
    74  
    75  func (s *Spider) getReadSpider(key []byte) *Spider {
    76  	temp := s
    77  	for i := 0; i < len(key); i++ {
    78  		if temp.Next[key[i]] == nil {
    79  			return &Spider{}
    80  		} else if checkBytes(temp.Next[key[i]].Key, key) {
    81  			return temp.Next[key[i]]
    82  		} else {
    83  			temp = temp.Next[key[i]]
    84  		}
    85  	}
    86  	return nil
    87  }
    88  
    89  func (s *Spider) addLen() {
    90  	s.sync.Lock()
    91  	s.len++
    92  	s.sync.Unlock()
    93  }
    94  
    95  func (s *Spider) Len() int {
    96  	return s.len
    97  }