MCPcopy Create free account
hub / github.com/egonelbre/exp / Add

Method Add

reflectmap/reflect_pointer.go:55–88  ·  view source on GitHub ↗
(key, value unsafe.Pointer)

Source from the content-addressed store, hash-verified

53}
54
55func (m *PointerMap) Add(key, value unsafe.Pointer) {
56 // hack to avoid figuring out a hash function
57 keyi := *(*int)(key)
58
59 bucketi := keyi % m.bucketCount
60 tophash := byte(keyi)
61 if tophash == 0 {
62 tophash = 1
63 }
64
65 bucket := m.buckets.Elem().Index(bucketi)
66 hashesField := bucket.Field(0)
67 keys := bucket.Field(1)
68 values := bucket.Field(2)
69
70 hashes := hashesField.Addr().Interface().(*hashBucket)
71 for i, v := range *hashes {
72 if v == 0 {
73 (*hashes)[i] = tophash
74 (*reflectvalue)(unsafe.Pointer(&m.tempKey)).ptr = key
75 keys.Index(i).Set(m.tempKey.Elem())
76 (*reflectvalue)(unsafe.Pointer(&m.tempValue)).ptr = value
77 values.Index(i).Set(m.tempValue.Elem())
78 return
79 }
80 }
81
82 i := 0
83 (*hashes)[i] = tophash
84 (*reflectvalue)(unsafe.Pointer(&m.tempKey)).ptr = key
85 keys.Index(i).Set(m.tempKey.Elem())
86 (*reflectvalue)(unsafe.Pointer(&m.tempValue)).ptr = value
87 values.Index(i).Set(m.tempValue.Elem())
88}

Callers 2

TestReflectPointerFunction · 0.95
BenchmarkReflectPointerFunction · 0.95

Calls 1

SetMethod · 0.65

Tested by 2

TestReflectPointerFunction · 0.76
BenchmarkReflectPointerFunction · 0.76