mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +00:00
fix a bug of dict
orders
This commit is contained in:
parent
c87127dbbd
commit
ce295301fc
13
src/dict.cpp
13
src/dict.cpp
@ -63,24 +63,29 @@ namespace pkpy{
|
|||||||
|
|
||||||
void Dict::_rehash(){
|
void Dict::_rehash(){
|
||||||
Item* old_items = _items;
|
Item* old_items = _items;
|
||||||
int old_capacity = _capacity;
|
ItemNode* old_nodes = _nodes;
|
||||||
|
int old_head_idx = _head_idx;
|
||||||
|
|
||||||
_capacity *= 2;
|
_capacity *= 2;
|
||||||
_mask = _capacity - 1;
|
_mask = _capacity - 1;
|
||||||
_size = 0;
|
_size = 0;
|
||||||
_critical_size = _capacity*__LoadFactor+0.5f;
|
_critical_size = _capacity*__LoadFactor+0.5f;
|
||||||
_head_idx = -1;
|
_head_idx = -1;
|
||||||
_tail_idx = -1;
|
_tail_idx = -1;
|
||||||
pool64.dealloc(_nodes);
|
|
||||||
_items = (Item*)pool128.alloc(_capacity * sizeof(Item));
|
_items = (Item*)pool128.alloc(_capacity * sizeof(Item));
|
||||||
memset(_items, 0, _capacity * sizeof(Item));
|
memset(_items, 0, _capacity * sizeof(Item));
|
||||||
_nodes = (ItemNode*)pool64.alloc(_capacity * sizeof(ItemNode));
|
_nodes = (ItemNode*)pool64.alloc(_capacity * sizeof(ItemNode));
|
||||||
memset(_nodes, -1, _capacity * sizeof(ItemNode));
|
memset(_nodes, -1, _capacity * sizeof(ItemNode));
|
||||||
|
|
||||||
for(int i=0; i<old_capacity; i++){
|
// copy old items to new dict
|
||||||
if(old_items[i].first == nullptr) continue;
|
int i = old_head_idx;
|
||||||
|
while(i != -1){
|
||||||
set(old_items[i].first, old_items[i].second);
|
set(old_items[i].first, old_items[i].second);
|
||||||
|
i = old_nodes[i].next;
|
||||||
}
|
}
|
||||||
pool128.dealloc(old_items);
|
pool128.dealloc(old_items);
|
||||||
|
pool64.dealloc(old_nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -80,4 +80,12 @@ for i in range(1000):
|
|||||||
assert len(a) == 1000
|
assert len(a) == 1000
|
||||||
for i in range(1000):
|
for i in range(1000):
|
||||||
del a[i]
|
del a[i]
|
||||||
assert len(a) == 0
|
assert len(a) == 0
|
||||||
|
|
||||||
|
a = {
|
||||||
|
str(i): i
|
||||||
|
for i in range(10)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, s in enumerate(a):
|
||||||
|
assert s == str(i)
|
Loading…
x
Reference in New Issue
Block a user