mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-22 20:40:18 +00:00
Update namedict.h
This commit is contained in:
parent
42d8d375bc
commit
d2a2882e2a
@ -82,24 +82,15 @@ namespace pkpy{
|
|||||||
return reinterpret_cast<const PyVar*>(_keys + _capacity)[i];
|
return reinterpret_cast<const PyVar*>(_keys + _capacity)[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void _alloc(uint16_t capacity){
|
|
||||||
_keys = _dict_pool.alloc(capacity);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline static void _dealloc(StrName* head, uint16_t capacity){
|
|
||||||
if(head == nullptr) return;
|
|
||||||
_dict_pool.dealloc(head, capacity);
|
|
||||||
}
|
|
||||||
|
|
||||||
NameDict(uint16_t capacity=2, float load_factor=0.67, uint16_t hash_seed=kHashSeeds[0]):
|
NameDict(uint16_t capacity=2, float load_factor=0.67, uint16_t hash_seed=kHashSeeds[0]):
|
||||||
_capacity(capacity), _size(0), _load_factor(load_factor),
|
_capacity(capacity), _size(0), _load_factor(load_factor),
|
||||||
_hash_seed(hash_seed), _mask(capacity-1) {
|
_hash_seed(hash_seed), _mask(capacity-1) {
|
||||||
_alloc(capacity);
|
_keys = _dict_pool.alloc(capacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
NameDict(const NameDict& other) {
|
NameDict(const NameDict& other) {
|
||||||
memcpy(this, &other, sizeof(NameDict));
|
memcpy(this, &other, sizeof(NameDict));
|
||||||
_alloc(_capacity);
|
_keys = _dict_pool.alloc(_capacity);
|
||||||
for(int i=0; i<_capacity; i++){
|
for(int i=0; i<_capacity; i++){
|
||||||
_keys[i] = other._keys[i];
|
_keys[i] = other._keys[i];
|
||||||
value(i) = other.value(i);
|
value(i) = other.value(i);
|
||||||
@ -107,9 +98,9 @@ namespace pkpy{
|
|||||||
}
|
}
|
||||||
|
|
||||||
NameDict& operator=(const NameDict& other) {
|
NameDict& operator=(const NameDict& other) {
|
||||||
_dealloc(_keys, _capacity);
|
_dict_pool.dealloc(_keys, _capacity);
|
||||||
memcpy(this, &other, sizeof(NameDict));
|
memcpy(this, &other, sizeof(NameDict));
|
||||||
_alloc(_capacity);
|
_keys = _dict_pool.alloc(_capacity);
|
||||||
for(int i=0; i<_capacity; i++){
|
for(int i=0; i<_capacity; i++){
|
||||||
_keys[i] = other._keys[i];
|
_keys[i] = other._keys[i];
|
||||||
value(i) = other.value(i);
|
value(i) = other.value(i);
|
||||||
@ -168,7 +159,7 @@ namespace pkpy{
|
|||||||
_capacity = find_next_capacity(_capacity * 2);
|
_capacity = find_next_capacity(_capacity * 2);
|
||||||
_mask = _capacity - 1;
|
_mask = _capacity - 1;
|
||||||
}
|
}
|
||||||
_alloc(_capacity);
|
_keys = _dict_pool.alloc(_capacity);
|
||||||
for(uint16_t i=0; i<old_capacity; i++){
|
for(uint16_t i=0; i<old_capacity; i++){
|
||||||
if(old_keys[i].empty()) continue;
|
if(old_keys[i].empty()) continue;
|
||||||
bool ok; uint16_t j;
|
bool ok; uint16_t j;
|
||||||
@ -177,7 +168,7 @@ namespace pkpy{
|
|||||||
_keys[j] = old_keys[i];
|
_keys[j] = old_keys[i];
|
||||||
value(j) = old_values[i]; // std::move makes a segfault
|
value(j) = old_values[i]; // std::move makes a segfault
|
||||||
}
|
}
|
||||||
_dealloc(old_keys, old_capacity);
|
_dict_pool.dealloc(old_keys, old_capacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _try_perfect_rehash(){
|
void _try_perfect_rehash(){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user