From 8ea0c812a29acc78b64c145b0d7e58027bbb9208 Mon Sep 17 00:00:00 2001 From: ka-weihe Date: Tue, 26 May 2020 01:52:06 +0200 Subject: [PATCH] builtin: map.clone() --- vlib/builtin/map.v | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/vlib/builtin/map.v b/vlib/builtin/map.v index 15b2a9c1de..60355b6860 100644 --- a/vlib/builtin/map.v +++ b/vlib/builtin/map.v @@ -416,6 +416,38 @@ pub fn (m &map) keys() []string { return keys } +[unsafe_fn] +pub fn (d DenseArray) clone() DenseArray { + res := DenseArray { + value_bytes: d.value_bytes + cap: d.cap + size: d.size + deletes: d.deletes + keys: &string(malloc(d.cap * sizeof(string))) + values: byteptr(malloc(d.cap * d.value_bytes)) + } + C.memcpy(res.keys, d.keys, d.cap * sizeof(string)) + C.memcpy(res.values, d.values, d.cap * d.value_bytes) + return res +} + +[unsafe_fn] +pub fn (m map) clone() map { + metas_size := sizeof(u32) * (m.cap + 2 + m.extra_metas) + res := map{ + value_bytes: m.value_bytes + cap: m.cap + cached_hashbits: m.cached_hashbits + shift: m.shift + key_values: m.key_values.clone() + metas: &u32(malloc(metas_size)) + extra_metas: m.extra_metas + size: m.size + } + C.memcpy(res.metas, m.metas, metas_size) + return res +} + [unsafe_fn] pub fn (m &map) free() { free(m.metas)