-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
42 lines (33 loc) · 902 Bytes
/
main.go
File metadata and controls
42 lines (33 loc) · 902 Bytes
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
package cowmap
import (
"sync/atomic"
"unsafe"
)
type Cowmap struct {
innerMap unsafe.Pointer
}
func New() *Cowmap {
innerMap := new(map[interface{}]interface{})
cowmap := &Cowmap{unsafe.Pointer(innerMap)}
return cowmap
}
func (h *Cowmap) Set(k interface{}, v interface{}) {
copyMap := make(map[interface{}]interface{})
innerMap := *(*map[interface{}]interface{})(atomic.LoadPointer(&h.innerMap))
for k, v := range innerMap {
copyMap[k] = v
}
copyMap[k] = v
cptr := unsafe.Pointer(©Map)
atomic.StorePointer(&h.innerMap, cptr)
}
func (h *Cowmap) Get(k interface{}) interface{} {
innerMap := *(*map[interface{}]interface{})(atomic.LoadPointer(&h.innerMap))
return innerMap[k]
}
func (h *Cowmap) Iterate(f func(k interface{}, v interface{})) {
innerMap := *(*map[interface{}]interface{})(atomic.LoadPointer(&h.innerMap))
for key, val := range innerMap {
f(key, val)
}
}