(newSize uintptr, loop bool)
| 294 | } |
| 295 | |
| 296 | func (m *Map[Key, Value]) grow(newSize uintptr, loop bool) { |
| 297 | defer m.resizing.CompareAndSwap(1, 0) |
| 298 | |
| 299 | for { |
| 300 | currentStore := m.store.Load() |
| 301 | if newSize == 0 { |
| 302 | newSize = uintptr(len(currentStore.index)) << 1 |
| 303 | } else { |
| 304 | newSize = roundUpPower2(newSize) |
| 305 | } |
| 306 | |
| 307 | index := make([]*ListElement[Key, Value], newSize) |
| 308 | header := (*reflect.SliceHeader)(unsafe.Pointer(&index)) |
| 309 | |
| 310 | newStore := &store[Key, Value]{ |
| 311 | keyShifts: strconv.IntSize - log2(newSize), |
| 312 | array: unsafe.Pointer(header.Data), // use address of slice data storage |
| 313 | index: index, |
| 314 | } |
| 315 | |
| 316 | m.fillIndexItems(newStore) // initialize new index slice with longer keys |
| 317 | |
| 318 | m.store.Store(newStore) |
| 319 | |
| 320 | m.fillIndexItems(newStore) // make sure that the new index is up-to-date with the current state of the linked list |
| 321 | |
| 322 | if !loop { |
| 323 | return |
| 324 | } |
| 325 | |
| 326 | // check if a new resize needs to be done already |
| 327 | count := uintptr(m.Len()) |
| 328 | if !m.isResizeNeeded(newStore, count) { |
| 329 | return |
| 330 | } |
| 331 | newSize = 0 // 0 means double the current size |
| 332 | } |
| 333 | } |
| 334 | |
| 335 | func (m *Map[Key, Value]) fillIndexItems(store *store[Key, Value]) { |
| 336 | first := m.linkedList.First() |
no test coverage detected