73 lines
1.2 KiB
Go
73 lines
1.2 KiB
Go
package external
|
|
|
|
import (
|
|
"hash/crc32"
|
|
"strconv"
|
|
)
|
|
|
|
func hashcode(s string) int {
|
|
v := int(crc32.ChecksumIEEE([]byte(s)))
|
|
if v >= 0 {
|
|
return v
|
|
}
|
|
return -v
|
|
}
|
|
|
|
func hashString(v interface{}) int {
|
|
return hashcode(v.(string))
|
|
}
|
|
|
|
func hashInt(v interface{}) int {
|
|
return hashcode(strconv.Itoa(v.(int)))
|
|
}
|
|
|
|
// setIDFunc is the function to identify the unique id for the item of set
|
|
type setIDFunc func(interface{}) int
|
|
|
|
// set is a structure to distinct instance
|
|
type set struct {
|
|
idFunc setIDFunc
|
|
idMap map[int]interface{}
|
|
}
|
|
|
|
// newSet will expected a list, reserving only one item with same id and return a set-collection
|
|
func newSet(idFunc setIDFunc, vL []interface{}) *set {
|
|
s := &set{
|
|
idMap: make(map[int]interface{}, len(vL)),
|
|
idFunc: idFunc,
|
|
}
|
|
|
|
for _, v := range vL {
|
|
s.Add(v)
|
|
}
|
|
|
|
return s
|
|
}
|
|
|
|
func (s *set) Add(v interface{}) {
|
|
id := s.idFunc(v)
|
|
if _, ok := s.idMap[id]; !ok {
|
|
s.idMap[id] = v
|
|
}
|
|
}
|
|
|
|
func (s *set) Remove(v interface{}) {
|
|
delete(s.idMap, s.idFunc(v))
|
|
}
|
|
|
|
func (s *set) List() []interface{} {
|
|
vL := make([]interface{}, s.Len())
|
|
|
|
var i int
|
|
for _, v := range s.idMap {
|
|
vL[i] = v
|
|
i++
|
|
}
|
|
|
|
return vL
|
|
}
|
|
|
|
func (s *set) Len() int {
|
|
return len(s.idMap)
|
|
}
|