-
Notifications
You must be signed in to change notification settings - Fork 1
/
client_map.go
92 lines (79 loc) · 2.68 KB
/
client_map.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package client
import (
"github.com/freddy33/qsm-go/model/m3point"
"unsafe"
)
type ClientPathNodeMap interface {
Size() int
GetPathNodeById(id m3point.Int64Id) *PathNodeCl
GetPathNode(p m3point.Point) *PathNodeCl
AddPathNode(pathNode *PathNodeCl) (*PathNodeCl, bool)
Clear()
RangePerId(visit func(id m3point.Int64Id, pn *PathNodeCl) bool, rc *m3point.RangeContext)
RangePerPoint(visit func(point m3point.Point, pn *PathNodeCl) bool, rc *m3point.RangeContext)
}
type ClientPointHashPathNodeMap struct {
idMap *m3point.NonBlockConcurrentMap
pointMap m3point.PointMap
}
/***************************************************************/
// ClientPointHashPathNodeMap Functions
/***************************************************************/
// TODO: This should be in path data entry of the env
var nbParallelProcesses = 8
func MakeHashPathNodeMap(initSize int) ClientPathNodeMap {
res := ClientPointHashPathNodeMap{
idMap: m3point.MakeNonBlockConcurrentMap(initSize),
pointMap: m3point.MakePointHashMap(initSize),
}
return &res
}
func (hnm *ClientPointHashPathNodeMap) Size() int {
return hnm.pointMap.Size()
}
func (hnm *ClientPointHashPathNodeMap) GetPathNodeById(id m3point.Int64Id) *PathNodeCl {
pn, ok := hnm.idMap.Load(id)
if ok {
return (*PathNodeCl)(pn)
}
return nil
}
func (hnm *ClientPointHashPathNodeMap) GetPathNode(p m3point.Point) *PathNodeCl {
pn, ok := hnm.pointMap.Get(p)
if ok {
return (*PathNodeCl)(pn)
}
return nil
}
func (hnm *ClientPointHashPathNodeMap) AddPathNode(pathNode *PathNodeCl) (*PathNodeCl, bool) {
if pathNode.id < 0 {
Log.Fatalf("cannot add unsaved node %s", pathNode.String())
return nil, false
}
p := pathNode.P()
up := unsafe.Pointer(pathNode)
pn, inserted := hnm.pointMap.LoadOrStore(p, up)
if inserted {
hnm.idMap.Store(pathNode.id, up)
}
return (*PathNodeCl)(pn), inserted
}
func (hnm *ClientPointHashPathNodeMap) Clear() {
rc := m3point.MakeRangeContext(false, nbParallelProcesses, Log)
hnm.pointMap.Range(func(point m3point.Point, value unsafe.Pointer) bool {
pn := (*PathNodeCl)(value)
pn.release()
return false
}, rc)
hnm.pointMap = m3point.MakePointHashMap(hnm.pointMap.InitSize())
}
func (hnm *ClientPointHashPathNodeMap) RangePerId(visit func(id m3point.Int64Id, pn *PathNodeCl) bool, rc *m3point.RangeContext) {
hnm.idMap.Range(func(key m3point.MurmurKey, value unsafe.Pointer) bool {
return visit(key.(m3point.Int64Id), (*PathNodeCl)(value))
}, rc)
}
func (hnm *ClientPointHashPathNodeMap) RangePerPoint(visit func(point m3point.Point, pn *PathNodeCl) bool, rc *m3point.RangeContext) {
hnm.pointMap.Range(func(point m3point.Point, value unsafe.Pointer) bool {
return visit(point, (*PathNodeCl)(value))
}, rc)
}