* type bucketType struct { hash [bucketSize]byte key [bucketSize]keyType value [bucketSize]valueType } */
(key, value interface{})
| 54 | */ |
| 55 | |
| 56 | func (m *Map) Add(key, value interface{}) { |
| 57 | // hack to avoid figuring out a hash function |
| 58 | keyi := key.(int) |
| 59 | |
| 60 | bucketi := keyi % m.bucketCount |
| 61 | tophash := byte(keyi) |
| 62 | if tophash == 0 { |
| 63 | tophash = 1 |
| 64 | } |
| 65 | |
| 66 | bucket := m.buckets.Elem().Index(bucketi) |
| 67 | hashesField := bucket.Field(0) |
| 68 | keys := bucket.Field(1) |
| 69 | values := bucket.Field(2) |
| 70 | |
| 71 | hashes := hashesField.Addr().Interface().(*hashBucket) |
| 72 | for i, v := range *hashes { |
| 73 | if v == 0 { |
| 74 | (*hashes)[i] = tophash |
| 75 | keys.Index(i).Set(reflect.ValueOf(key)) |
| 76 | values.Index(i).Set(reflect.ValueOf(value)) |
| 77 | return |
| 78 | } |
| 79 | } |
| 80 | |
| 81 | (*hashes)[0] = tophash |
| 82 | keys.Index(0).Set(reflect.ValueOf(key)) |
| 83 | values.Index(0).Set(reflect.ValueOf(value)) |
| 84 | } |