Skip to content

Commit c9c9c23

Browse files
committed
misc
1 parent 6af77e8 commit c9c9c23

File tree

1 file changed

+26
-27
lines changed

1 file changed

+26
-27
lines changed
Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,77 @@
11
package cacheset
22

33
import (
4-
"github.com/emirpasic/gods/lists/singlylinkedlist"
4+
"github.com/emirpasic/gods/sets/linkedhashset"
55
"strconv"
66
"sync"
77
)
88

99
var lock sync.RWMutex
1010

1111
type CacheSet struct {
12-
table map[interface{}]struct{}
13-
ordering *singlylinkedlist.List
12+
table *linkedhashset.Set
1413
maxSize int
1514
}
1615

1716
var itemExists = struct{}{}
1817

1918
func New(maxSize int) *CacheSet {
20-
set := &CacheSet{
21-
table: make(map[interface{}]struct{}),
22-
ordering: singlylinkedlist.New(),
23-
maxSize: maxSize,
19+
s := &CacheSet{
20+
table: linkedhashset.New(),
21+
maxSize: maxSize,
2422
}
25-
return set
23+
return s
2624
}
2725

2826
func (set *CacheSet) Add(item interface{}) {
2927
lock.Lock()
3028
defer lock.Unlock()
31-
var contains bool
32-
if _, contains = set.table[item]; !contains {
29+
if !set.table.Contains(item) {
3330
set.removeExceeded()
34-
set.table[item] = itemExists
35-
set.ordering.Append(item)
31+
set.table.Add(item)
3632
}
3733
}
3834

3935
func (set *CacheSet) removeExceeded() {
40-
for set.ordering.Size() >= set.maxSize {
41-
item, exist := set.ordering.Get(0)
42-
if exist {
43-
set.ordering.Remove(0)
44-
delete(set.table, item)
45-
}
36+
removalCount := set.table.Size() - set.maxSize
37+
if removalCount < 0 {
38+
return
39+
}
40+
var removals []interface{}
41+
iterator := set.table.Iterator()
42+
43+
for i := removalCount; i >= 0; i-- {
44+
iterator.Next()
45+
removals = append(removals, iterator.Value())
46+
}
47+
for _, removal := range removals {
48+
set.table.Remove(removal)
4649
}
4750
}
4851

4952
func (set *CacheSet) Contains(item interface{}) bool {
5053
lock.RLock()
5154
defer lock.RUnlock()
52-
if _, contains := set.table[item]; !contains {
53-
return false
54-
}
55-
return true
55+
return set.table.Contains(item)
5656
}
5757

5858
func (set *CacheSet) Empty() bool {
5959
lock.Lock()
6060
defer lock.Unlock()
61-
return set.Size() == 0
61+
return set.table. Size() == 0
6262
}
6363

6464
func (set *CacheSet) Size() int {
65-
return set.ordering.Size()
65+
return set.table.Size()
6666
}
6767

6868
func (set *CacheSet) Clear() {
6969
lock.Lock()
7070
defer lock.Unlock()
71-
set.table = make(map[interface{}]struct{})
72-
set.ordering.Clear()
71+
set.table = linkedhashset.New()
7372
}
7473

7574
func (set *CacheSet) String() string {
76-
return "CacheSet[" + strconv.Itoa(set.ordering.Size()) + "]"
75+
return "CacheSet[" + strconv.Itoa(set.Size()) + "]"
7776
}
7877

0 commit comments

Comments
 (0)