1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-03-14 02:59:42 +01:00

refactor: check eq in f_eq

This commit is contained in:
Justin Lin 2022-04-11 11:05:13 +08:00
parent 9141a4db4b
commit a63bbb47fd
2 changed files with 25 additions and 3 deletions

View File

@ -1,13 +1,26 @@
use <_hashmap_put_impl.scad>;
_find_eq_search = function(lt, target, eq)
let(found = search([target], lt)[0])
found == [] ? -1 : found;
_find_eq_some = function(lt, target, eq)
let(
leng = len(lt),
indices = [for(i = 0; i < leng && !eq(lt[i], target); i = i + 1) undef],
leng_indices = len(indices)
)
leng_indices == leng ? -1 : leng_indices;
function _hashmap(kv_lt, leng, buckets, b_numbers, eq, hash) =
let(
end = leng - 1,
f_eq = is_undef(eq) ? _find_eq_search : _find_eq_some,
n_buckets_lt = [
for(i = 0, n_buckets = _hashmap_put(buckets, b_numbers, kv_lt[i][0], kv_lt[i][1], eq, hash), is_continue = i < end;
for(i = 0, n_buckets = _hashmap_put_by(buckets, b_numbers, kv_lt[i][0], kv_lt[i][1], eq, hash, f_eq), is_continue = i < end;
is_continue;
i = i + 1, is_continue = i < end, n_buckets = is_continue ? _hashmap_put(n_buckets, b_numbers, kv_lt[i][0], kv_lt[i][1], eq, hash) : undef)
i = i + 1, is_continue = i < end, n_buckets = is_continue ? _hashmap_put_by(n_buckets, b_numbers, kv_lt[i][0], kv_lt[i][1], eq, hash, f_eq) : undef)
n_buckets
]
)
_hashmap_put(n_buckets_lt[end - 1], b_numbers, kv_lt[end][0], kv_lt[end][1], eq, hash);
_hashmap_put_by(n_buckets_lt[end - 1], b_numbers, kv_lt[end][0], kv_lt[end][1], eq, hash, f_eq);

View File

@ -9,6 +9,15 @@ function _hashmap_put(buckets, b_numbers, key, value, eq, hash) =
k_idx != -1 ? _replace(buckets, b_numbers, bucket, key, value, b_idx, k_idx) :
_put(buckets, b_numbers, bucket, key, value, b_idx);
function _hashmap_put_by(buckets, b_numbers, key, value, eq, hash, f_eq) =
let(
b_idx = hash(key) % b_numbers,
bucket = buckets[b_idx],
k_idx = f_eq(bucket, key, eq)
)
k_idx != -1 ? _replace(buckets, b_numbers, bucket, key, value, b_idx, k_idx) :
_put(buckets, b_numbers, bucket, key, value, b_idx);
function _replace(buckets, b_numbers, bucket, key, value, b_idx, k_idx) =
let(leng_bucket = len(bucket))
[