map: encapsulate key clone operation on voidptr (#7327)

pull/7353/head
Nick Treleaven 2020-12-16 01:23:59 +00:00 committed by GitHub
parent 665e6cc957
commit 7c8fa62cc2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 22 additions and 11 deletions

View File

@ -139,6 +139,14 @@ fn (d &DenseArray) has_index(i int) bool {
return d.deletes == 0 || unsafe {d.all_deleted[i]} == 0 return d.deletes == 0 || unsafe {d.all_deleted[i]} == 0
} }
[inline]
fn (d &DenseArray) clone_key(dest voidptr, pkey voidptr) {
unsafe {
s := (*&string(pkey)).clone()
C.memcpy(dest, &s, d.key_bytes)
}
}
// Push element to array and return index // Push element to array and return index
// The growth-factor is roughly 1.125 `(x + (x >> 3))` // The growth-factor is roughly 1.125 `(x + (x >> 3))`
[inline] [inline]
@ -159,7 +167,7 @@ fn (mut d DenseArray) push(key voidptr, value voidptr) int {
d.all_deleted[push_index] = 0 d.all_deleted[push_index] = 0
} }
ptr := d.key(push_index) ptr := d.key(push_index)
C.memcpy(ptr, key, d.key_bytes) d.clone_key(ptr, key)
C.memcpy(byteptr(ptr) + d.key_bytes, value, d.value_bytes) C.memcpy(byteptr(ptr) + d.key_bytes, value, d.value_bytes)
} }
d.len++ d.len++
@ -316,8 +324,7 @@ fn (mut m map) ensure_extra_metas(probe_count u32) {
// Insert new element to the map. The element is inserted if its key is // Insert new element to the map. The element is inserted if its key is
// not equivalent to the key of any other element already in the container. // not equivalent to the key of any other element already in the container.
// If the key already exists, its value is changed to the value of the new element. // If the key already exists, its value is changed to the value of the new element.
fn (mut m map) set(k string, value voidptr) { fn (mut m map) set(key string, value voidptr) {
key := k.clone()
load_factor := f32(m.len << 1) / f32(m.cap) load_factor := f32(m.len << 1) / f32(m.cap)
if load_factor > max_load_factor { if load_factor > max_load_factor {
m.expand() m.expand()
@ -519,12 +526,14 @@ pub fn (mut m map) delete(key string) {
// Returns all keys in the map. // Returns all keys in the map.
pub fn (m &map) keys() []string { pub fn (m &map) keys() []string {
mut keys := []string{len: m.len} mut keys := []string{len: m.len}
mut j := 0 mut item := unsafe {byteptr(keys.data)}
if m.key_values.deletes == 0 { if m.key_values.deletes == 0 {
for i := 0; i < m.key_values.len; i++ { for i := 0; i < m.key_values.len; i++ {
pkey := unsafe {&string(m.key_values.key(i))} unsafe {
keys[j] = pkey.clone() pkey := m.key_values.key(i)
j++ m.key_values.clone_key(item, pkey)
item += m.key_bytes
}
} }
return keys return keys
} }
@ -532,15 +541,17 @@ pub fn (m &map) keys() []string {
if !m.key_values.has_index(i) { if !m.key_values.has_index(i) {
continue continue
} }
pkey := unsafe {&string(m.key_values.key(i))} unsafe {
keys[j] = pkey.clone() pkey := m.key_values.key(i)
j++ m.key_values.clone_key(item, pkey)
item += m.key_bytes
}
} }
return keys return keys
} }
[unsafe] [unsafe]
pub fn (d DenseArray) clone() DenseArray { pub fn (d &DenseArray) clone() DenseArray {
res := DenseArray{ res := DenseArray{
key_bytes: d.key_bytes key_bytes: d.key_bytes
value_bytes: d.value_bytes value_bytes: d.value_bytes