| 53 | } |
| 54 | |
| 55 | func (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 | } |