map: rename methods (#9657)
parent
6c1a43415e
commit
5273214ec2
|
@ -324,6 +324,10 @@ fn map_free_string(pkey voidptr) {
|
|||
fn map_free_nop(_ voidptr) {
|
||||
}
|
||||
|
||||
fn new_map(key_bytes int, value_bytes int, hash_fn MapHashFn, key_eq_fn MapEqFn, clone_fn MapCloneFn, free_fn MapFreeFn) map {
|
||||
return new_map_2(key_bytes, value_bytes, hash_fn, key_eq_fn, clone_fn, free_fn)
|
||||
}
|
||||
|
||||
fn new_map_2(key_bytes int, value_bytes int, hash_fn MapHashFn, key_eq_fn MapEqFn, clone_fn MapCloneFn, free_fn MapFreeFn) map {
|
||||
metasize := int(sizeof(u32) * (init_capicity + extra_metas_inc))
|
||||
// for now assume anything bigger than a pointer is a string
|
||||
|
@ -346,6 +350,11 @@ fn new_map_2(key_bytes int, value_bytes int, hash_fn MapHashFn, key_eq_fn MapEqF
|
|||
}
|
||||
}
|
||||
|
||||
fn new_map_init(hash_fn MapHashFn, key_eq_fn MapEqFn, clone_fn MapCloneFn, free_fn MapFreeFn, n int, key_bytes int, value_bytes int, keys voidptr, values voidptr) map {
|
||||
return new_map_init_2(hash_fn, key_eq_fn, clone_fn, free_fn, n, key_bytes, value_bytes,
|
||||
keys, values)
|
||||
}
|
||||
|
||||
fn new_map_init_2(hash_fn MapHashFn, key_eq_fn MapEqFn, clone_fn MapCloneFn, free_fn MapFreeFn, n int, key_bytes int, value_bytes int, keys voidptr, values voidptr) map {
|
||||
mut out := new_map_2(key_bytes, value_bytes, hash_fn, key_eq_fn, clone_fn, free_fn)
|
||||
// TODO pre-allocate n slots
|
||||
|
@ -434,6 +443,10 @@ fn (mut m map) ensure_extra_metas(probe_count u32) {
|
|||
}
|
||||
}
|
||||
|
||||
fn (mut m map) set(key voidptr, value voidptr) {
|
||||
m.set_1(key, value)
|
||||
}
|
||||
|
||||
// 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.
|
||||
// If the key already exists, its value is changed to the value of the new element.
|
||||
|
@ -531,6 +544,10 @@ fn (mut m map) cached_rehash(old_cap u32) {
|
|||
unsafe { free(old_metas) }
|
||||
}
|
||||
|
||||
fn (mut m map) get_and_set(key voidptr, zero voidptr) voidptr {
|
||||
return m.get_and_set_1(key, zero)
|
||||
}
|
||||
|
||||
// This method is used for assignment operators. If the argument-key
|
||||
// does not exist in the map, it's added to the map along with the zero/default value.
|
||||
// If the key exists, its respective value is returned.
|
||||
|
@ -559,6 +576,10 @@ fn (mut m map) get_and_set_1(key voidptr, zero voidptr) voidptr {
|
|||
return voidptr(0)
|
||||
}
|
||||
|
||||
fn (m &map) get(key voidptr, zero voidptr) voidptr {
|
||||
return m.get_1(key, zero)
|
||||
}
|
||||
|
||||
// If `key` matches the key of an element in the container,
|
||||
// the method returns a reference to its mapped value.
|
||||
// If not, a zero/default value is returned.
|
||||
|
@ -582,6 +603,10 @@ fn (m &map) get_1(key voidptr, zero voidptr) voidptr {
|
|||
return zero
|
||||
}
|
||||
|
||||
fn (m &map) get_check(key voidptr) voidptr {
|
||||
return m.get_1_check(key)
|
||||
}
|
||||
|
||||
// If `key` matches the key of an element in the container,
|
||||
// the method returns a reference to its mapped value.
|
||||
// If not, a zero pointer is returned.
|
||||
|
@ -606,6 +631,10 @@ fn (m &map) get_1_check(key voidptr) voidptr {
|
|||
return 0
|
||||
}
|
||||
|
||||
fn (m &map) exists(key voidptr) bool {
|
||||
return m.exists_1(key)
|
||||
}
|
||||
|
||||
// Checks whether a particular key exists in the map.
|
||||
fn (m &map) exists_1(key voidptr) bool {
|
||||
mut index, mut meta := m.key_to_index(key)
|
||||
|
@ -677,22 +706,8 @@ pub fn (mut m map) delete(key voidptr) {
|
|||
}
|
||||
}
|
||||
|
||||
// bootstrap
|
||||
// delete this
|
||||
pub fn (m &map) keys() []string {
|
||||
mut keys := []string{len: m.len}
|
||||
mut item := unsafe { &byte(keys.data) }
|
||||
for i := 0; i < m.key_values.len; i++ {
|
||||
if !m.key_values.has_index(i) {
|
||||
continue
|
||||
}
|
||||
unsafe {
|
||||
pkey := m.key_values.key(i)
|
||||
m.clone_fn(item, pkey)
|
||||
item = item + m.key_bytes
|
||||
}
|
||||
}
|
||||
return keys
|
||||
fn (m &map) keys() array {
|
||||
return m.keys_1()
|
||||
}
|
||||
|
||||
// Returns all keys in the map.
|
||||
|
|
|
@ -277,7 +277,7 @@ fn (mut g Gen) gen_map_equality_fn(left ast.Type) string {
|
|||
fn_builder.writeln('\tfor (int i = 0; i < a.key_values.len; ++i) {')
|
||||
fn_builder.writeln('\t\tif (!DenseArray_has_index(&a.key_values, i)) continue;')
|
||||
fn_builder.writeln('\t\tvoidptr k = DenseArray_key(&a.key_values, i);')
|
||||
fn_builder.writeln('\t\tif (!map_exists_1(&b, k)) return false;')
|
||||
fn_builder.writeln('\t\tif (!map_exists(&b, k)) return false;')
|
||||
kind := g.table.type_kind(value_typ)
|
||||
if kind == .function {
|
||||
value_sym := g.table.get_type_symbol(value_typ)
|
||||
|
@ -292,44 +292,44 @@ fn (mut g Gen) gen_map_equality_fn(left ast.Type) string {
|
|||
fn_builder.write_string(', ')
|
||||
}
|
||||
}
|
||||
fn_builder.writeln(') = *(voidptr*)map_get_1(&a, k, &(voidptr[]){ 0 });')
|
||||
fn_builder.writeln(') = *(voidptr*)map_get(&a, k, &(voidptr[]){ 0 });')
|
||||
} else {
|
||||
fn_builder.writeln('\t\t$ptr_value_typ v = *($ptr_value_typ*)map_get_1(&a, k, &($ptr_value_typ[]){ 0 });')
|
||||
fn_builder.writeln('\t\t$ptr_value_typ v = *($ptr_value_typ*)map_get(&a, k, &($ptr_value_typ[]){ 0 });')
|
||||
}
|
||||
match kind {
|
||||
.string {
|
||||
fn_builder.writeln('\t\tif (!fast_string_eq(*(string*)map_get_1(&b, k, &(string[]){_SLIT("")}), v)) {')
|
||||
fn_builder.writeln('\t\tif (!fast_string_eq(*(string*)map_get(&b, k, &(string[]){_SLIT("")}), v)) {')
|
||||
}
|
||||
.sum_type {
|
||||
eq_fn := g.gen_sumtype_equality_fn(value_typ)
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_sumtype_eq(*($ptr_value_typ*)map_get_1(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_sumtype_eq(*($ptr_value_typ*)map_get(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
|
||||
}
|
||||
.struct_ {
|
||||
eq_fn := g.gen_struct_equality_fn(value_typ)
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_struct_eq(*($ptr_value_typ*)map_get_1(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_struct_eq(*($ptr_value_typ*)map_get(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
|
||||
}
|
||||
.array {
|
||||
eq_fn := g.gen_array_equality_fn(value_typ)
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_arr_eq(*($ptr_value_typ*)map_get_1(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_arr_eq(*($ptr_value_typ*)map_get(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
|
||||
}
|
||||
.array_fixed {
|
||||
eq_fn := g.gen_fixed_array_equality_fn(value_typ)
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_arr_eq(*($ptr_value_typ*)map_get_1(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_arr_eq(*($ptr_value_typ*)map_get(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
|
||||
}
|
||||
.map {
|
||||
eq_fn := g.gen_map_equality_fn(value_typ)
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_map_eq(*($ptr_value_typ*)map_get_1(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_map_eq(*($ptr_value_typ*)map_get(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
|
||||
}
|
||||
.alias {
|
||||
eq_fn := g.gen_alias_equality_fn(value_typ)
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_alias_eq(*($ptr_value_typ*)map_get_1(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
|
||||
fn_builder.writeln('\t\tif (!${eq_fn}_alias_eq(*($ptr_value_typ*)map_get(&b, k, &($ptr_value_typ[]){ 0 }), v)) {')
|
||||
}
|
||||
.function {
|
||||
fn_builder.writeln('\t\tif (*(voidptr*)map_get_1(&b, k, &(voidptr[]){ 0 }) != v) {')
|
||||
fn_builder.writeln('\t\tif (*(voidptr*)map_get(&b, k, &(voidptr[]){ 0 }) != v) {')
|
||||
}
|
||||
else {
|
||||
println(kind)
|
||||
fn_builder.writeln('\t\tif (*($ptr_value_typ*)map_get_1(&b, k, &($ptr_value_typ[]){ 0 }) != v) {')
|
||||
fn_builder.writeln('\t\tif (*($ptr_value_typ*)map_get(&b, k, &($ptr_value_typ[]){ 0 }) != v) {')
|
||||
}
|
||||
}
|
||||
fn_builder.writeln('\t\t\treturn false;')
|
||||
|
|
|
@ -2183,9 +2183,9 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
|||
left_type := assign_stmt.left_types[i]
|
||||
left_sym := g.table.get_type_symbol(left_type)
|
||||
g.write_fn_ptr_decl(left_sym.info as ast.FnType, '_var_$left.pos.pos')
|
||||
g.write(' = *(voidptr*)map_get_1(')
|
||||
g.write(' = *(voidptr*)map_get(')
|
||||
} else {
|
||||
g.write('$styp _var_$left.pos.pos = *($styp*)map_get_1(')
|
||||
g.write('$styp _var_$left.pos.pos = *($styp*)map_get(')
|
||||
}
|
||||
if !left.left_type.is_ptr() {
|
||||
g.write('ADDR(map, ')
|
||||
|
@ -4118,9 +4118,9 @@ fn (mut g Gen) map_init(node ast.MapInit) {
|
|||
}
|
||||
if size > 0 {
|
||||
if value_typ.kind == .function {
|
||||
g.write('new_map_init_2($hash_fn, $key_eq_fn, $clone_fn, $free_fn, $size, sizeof($key_typ_str), sizeof(voidptr), _MOV(($key_typ_str[$size]){')
|
||||
g.write('new_map_init($hash_fn, $key_eq_fn, $clone_fn, $free_fn, $size, sizeof($key_typ_str), sizeof(voidptr), _MOV(($key_typ_str[$size]){')
|
||||
} else {
|
||||
g.write('new_map_init_2($hash_fn, $key_eq_fn, $clone_fn, $free_fn, $size, sizeof($key_typ_str), sizeof($value_typ_str), _MOV(($key_typ_str[$size]){')
|
||||
g.write('new_map_init($hash_fn, $key_eq_fn, $clone_fn, $free_fn, $size, sizeof($key_typ_str), sizeof($value_typ_str), _MOV(($key_typ_str[$size]){')
|
||||
}
|
||||
for expr in node.keys {
|
||||
g.expr(expr)
|
||||
|
@ -4140,7 +4140,7 @@ fn (mut g Gen) map_init(node ast.MapInit) {
|
|||
}
|
||||
g.write('}))')
|
||||
} else {
|
||||
g.write('new_map_2(sizeof($key_typ_str), sizeof($value_typ_str), $hash_fn, $key_eq_fn, $clone_fn, $free_fn)')
|
||||
g.write('new_map(sizeof($key_typ_str), sizeof($value_typ_str), $hash_fn, $key_eq_fn, $clone_fn, $free_fn)')
|
||||
}
|
||||
if g.is_shared {
|
||||
g.write('}, sizeof($shared_styp))')
|
||||
|
@ -5751,7 +5751,7 @@ fn (mut g Gen) type_default(typ_ ast.Type) string {
|
|||
info := sym.map_info()
|
||||
key_typ := g.table.get_type_symbol(info.key_type)
|
||||
hash_fn, key_eq_fn, clone_fn, free_fn := g.map_fn_ptrs(key_typ)
|
||||
return 'new_map_2(sizeof(${g.typ(info.key_type)}), sizeof(${g.typ(info.value_type)}), $hash_fn, $key_eq_fn, $clone_fn, $free_fn)'
|
||||
return 'new_map(sizeof(${g.typ(info.key_type)}), sizeof(${g.typ(info.value_type)}), $hash_fn, $key_eq_fn, $clone_fn, $free_fn)'
|
||||
}
|
||||
// User struct defined in another module.
|
||||
// if typ.contains('__') {
|
||||
|
|
|
@ -303,7 +303,7 @@ static void* g_live_info = NULL;
|
|||
// copy something to the heap
|
||||
#define HEAP(type, expr) ((type*)memdup((void*)&((type[]){expr}[0]), sizeof(type)))
|
||||
#define _PUSH_MANY(arr, val, tmp, tmp_typ) {tmp_typ tmp = (val); array_push_many(arr, tmp.data, tmp.len);}
|
||||
#define _IN_MAP(val, m) map_exists_1(m, val)
|
||||
#define _IN_MAP(val, m) map_exists(m, val)
|
||||
|
||||
// unsigned/signed comparisons
|
||||
static inline bool _us32_gt(uint32_t a, int32_t b) { return a > INT32_MAX || (int32_t)a > b; }
|
||||
|
|
|
@ -630,7 +630,7 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
|
|||
}
|
||||
} else if left_sym.kind == .map {
|
||||
if node.name == 'keys' {
|
||||
name = 'map_keys_1'
|
||||
name = 'map_keys'
|
||||
}
|
||||
}
|
||||
if g.pref.obfuscate && g.cur_mod.name == 'main' && name.starts_with('main__')
|
||||
|
|
|
@ -302,12 +302,12 @@ fn (mut g Gen) index_of_map(node ast.IndexExpr, sym ast.TypeSymbol) {
|
|||
if g.is_assign_lhs && !g.is_arraymap_set && !get_and_set_types {
|
||||
if g.assign_op == .assign || info.value_type == ast.string_type {
|
||||
g.is_arraymap_set = true
|
||||
g.write('map_set_1(')
|
||||
g.write('map_set(')
|
||||
} else {
|
||||
if node.is_setter {
|
||||
g.write('(*(($elem_type_str*)map_get_and_set_1(')
|
||||
g.write('(*(($elem_type_str*)map_get_and_set(')
|
||||
} else {
|
||||
g.write('(*(($elem_type_str*)map_get_1(')
|
||||
g.write('(*(($elem_type_str*)map_get(')
|
||||
}
|
||||
}
|
||||
if !left_is_ptr || node.left_type.has_flag(.shared_f) {
|
||||
|
@ -344,9 +344,9 @@ fn (mut g Gen) index_of_map(node ast.IndexExpr, sym ast.TypeSymbol) {
|
|||
|| (g.is_assign_lhs && !g.is_arraymap_set && get_and_set_types) {
|
||||
zero := g.type_default(info.value_type)
|
||||
if node.is_setter {
|
||||
g.write('(*($elem_type_str*)map_get_and_set_1(')
|
||||
g.write('(*($elem_type_str*)map_get_and_set(')
|
||||
} else {
|
||||
g.write('(*($elem_type_str*)map_get_1(')
|
||||
g.write('(*($elem_type_str*)map_get(')
|
||||
}
|
||||
if !left_is_ptr {
|
||||
g.write('&')
|
||||
|
@ -368,18 +368,18 @@ fn (mut g Gen) index_of_map(node ast.IndexExpr, sym ast.TypeSymbol) {
|
|||
tmp_opt := if gen_or { g.new_tmp_var() } else { '' }
|
||||
tmp_opt_ptr := if gen_or { g.new_tmp_var() } else { '' }
|
||||
if gen_or {
|
||||
g.write('$elem_type_str* $tmp_opt_ptr = ($elem_type_str*)/*ee elem_ptr_typ */(map_get_1_check(')
|
||||
g.write('$elem_type_str* $tmp_opt_ptr = ($elem_type_str*)/*ee elem_ptr_typ */(map_get_check(')
|
||||
} else {
|
||||
if g.is_fn_index_call {
|
||||
if elem_typ.info is ast.FnType {
|
||||
g.write('((')
|
||||
g.write_fn_ptr_decl(&elem_typ.info, '')
|
||||
g.write(')(*(voidptr*)map_get_1(')
|
||||
g.write(')(*(voidptr*)map_get(')
|
||||
}
|
||||
} else if elem_typ.kind == .function {
|
||||
g.write('(*(voidptr*)map_get_1(')
|
||||
g.write('(*(voidptr*)map_get(')
|
||||
} else {
|
||||
g.write('(*($elem_type_str*)map_get_1(')
|
||||
g.write('(*($elem_type_str*)map_get(')
|
||||
}
|
||||
}
|
||||
if !left_is_ptr || node.left_type.has_flag(.shared_f) {
|
||||
|
|
|
@ -270,13 +270,13 @@ fn (mut g Gen) decode_map(key_type ast.Type, value_type ast.Type) string {
|
|||
if(!cJSON_IsObject(root) && !cJSON_IsNull(root)) {
|
||||
return (Option_Map_${styp}_$styp_v){ .state = 2, .err = v_error( string_add(_SLIT("Json element is not an object: "), tos2((byteptr)cJSON_PrintUnformatted(root))) )};
|
||||
}
|
||||
res = new_map_2(sizeof($styp), sizeof($styp_v), $hash_fn, $key_eq_fn, $clone_fn, $free_fn);
|
||||
res = new_map(sizeof($styp), sizeof($styp_v), $hash_fn, $key_eq_fn, $clone_fn, $free_fn);
|
||||
cJSON *jsval = NULL;
|
||||
cJSON_ArrayForEach(jsval, root)
|
||||
{
|
||||
$s
|
||||
string key = tos2((byteptr)jsval->string);
|
||||
map_set_1(&res, &key, &val);
|
||||
map_set(&res, &key, &val);
|
||||
}
|
||||
'
|
||||
}
|
||||
|
@ -299,7 +299,7 @@ fn (mut g Gen) encode_map(key_type ast.Type, value_type ast.Type) string {
|
|||
Array_$styp $keys_tmp = map_keys(&val);
|
||||
for (int i = 0; i < ${keys_tmp}.len; ++i) {
|
||||
$key
|
||||
cJSON_AddItemToObject(o, (char*) key.str, $fn_name_v ( *($styp_v*) map_get_1(&val, &key, &($styp_v[]) { $zero } ) ) );
|
||||
cJSON_AddItemToObject(o, (char*) key.str, $fn_name_v ( *($styp_v*) map_get(&val, &key, &($styp_v[]) { $zero } ) ) );
|
||||
}
|
||||
array_free(&$keys_tmp);
|
||||
'
|
||||
|
|
|
@ -178,7 +178,7 @@ pub fn mark_used(mut table ast.Table, pref &pref.Preferences, ast_files []ast.Fi
|
|||
if mfn.is_method {
|
||||
method_receiver_typename = table.type_to_str(mfn.receiver.typ)
|
||||
}
|
||||
if k in ['new_map_2', 'new_map_init_2', 'map_hash_string']
|
||||
if k in ['new_map', 'new_map_init', 'map_hash_string']
|
||||
|| method_receiver_typename == '&map' || method_receiver_typename == '&DenseArray'
|
||||
|| k.starts_with('map_') {
|
||||
walker.fn_decl(mut mfn)
|
||||
|
|
Loading…
Reference in New Issue