static bool SlowRekey(IntMap *m) { IntMap tmp; tmp.init(); for (IntMap::Range r = m->all(); !r.empty(); r.popFront()) { if (NewKeyFunction::shouldBeRemoved(r.front().key)) continue; uint32_t hi = NewKeyFunction::rekey(r.front().key); if (tmp.has(hi)) return false; tmp.putNew(hi, r.front().value); } m->clear(); for (IntMap::Range r = tmp.all(); !r.empty(); r.popFront()) { m->putNew(r.front().key, r.front().value); } return true; }
// Add entries to a HashMap using lookupWithDefault until either we get an OOM, // or the table has been resized a few times. static bool LookupWithDefaultUntilResize() { IntMap m; if (!m.init()) return false; // Add entries until we've resized the table four times. size_t lastCapacity = m.capacity(); size_t resizes = 0; uint32_t key = 0; while (resizes < 4) { if (!m.lookupWithDefault(key++, 0)) return false; size_t capacity = m.capacity(); if (capacity != lastCapacity) { resizes++; lastCapacity = capacity; } } return true; }