1
2
3
4
5 package ssa
6
7 import "cmd/internal/src"
8
9
10
11
12 type sparseEntryPos struct {
13 key ID
14 val int32
15 pos src.XPos
16 }
17
18 type sparseMapPos struct {
19 dense []sparseEntryPos
20 sparse []int32
21 }
22
23
24
25 func newSparseMapPos(n int) *sparseMapPos {
26 return &sparseMapPos{dense: nil, sparse: make([]int32, n)}
27 }
28
29 func (s *sparseMapPos) cap() int {
30 return len(s.sparse)
31 }
32
33 func (s *sparseMapPos) size() int {
34 return len(s.dense)
35 }
36
37 func (s *sparseMapPos) contains(k ID) bool {
38 i := s.sparse[k]
39 return i < int32(len(s.dense)) && s.dense[i].key == k
40 }
41
42
43
44 func (s *sparseMapPos) get(k ID) int32 {
45 i := s.sparse[k]
46 if i < int32(len(s.dense)) && s.dense[i].key == k {
47 return s.dense[i].val
48 }
49 return -1
50 }
51
52 func (s *sparseMapPos) set(k ID, v int32, a src.XPos) {
53 i := s.sparse[k]
54 if i < int32(len(s.dense)) && s.dense[i].key == k {
55 s.dense[i].val = v
56 s.dense[i].pos = a
57 return
58 }
59 s.dense = append(s.dense, sparseEntryPos{k, v, a})
60 s.sparse[k] = int32(len(s.dense)) - 1
61 }
62
63 func (s *sparseMapPos) remove(k ID) {
64 i := s.sparse[k]
65 if i < int32(len(s.dense)) && s.dense[i].key == k {
66 y := s.dense[len(s.dense)-1]
67 s.dense[i] = y
68 s.sparse[y.key] = i
69 s.dense = s.dense[:len(s.dense)-1]
70 }
71 }
72
73 func (s *sparseMapPos) clear() {
74 s.dense = s.dense[:0]
75 }
76
77 func (s *sparseMapPos) contents() []sparseEntryPos {
78 return s.dense
79 }
80
View as plain text