1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-08-13 18:24:28 +02:00

don't cal len repeatly

This commit is contained in:
Justin Lin
2021-05-03 17:15:33 +08:00
parent 5defe6e218
commit 3480f9be06
4 changed files with 15 additions and 16 deletions

View File

@@ -1,5 +1,6 @@
use <_hashmap_put_impl.scad>; use <_hashmap_put_impl.scad>;
function _hashmap(kv_lt, leng, buckets, eq, hash, i = 0) = function _hashmap(kv_lt, leng, buckets, b_numbers, eq, hash, i = 0) =
i == leng ? buckets : i == leng ? buckets :
_hashmap(kv_lt, leng, _hashmap_put(buckets, kv_lt[i][0], kv_lt[i][1], eq, hash), eq, hash, i + 1); let(n_buckets = _hashmap_put(buckets, b_numbers, kv_lt[i][0], kv_lt[i][1], eq, hash))
_hashmap(kv_lt, leng, n_buckets, b_numbers, eq, hash, i + 1);

View File

@@ -1,23 +1,21 @@
use <../../some.scad>; use <../../some.scad>;
use <../../find_index.scad>; use <../../find_index.scad>;
function _hashmap_put(map, key, value, eq, hash) = function _hashmap_put(buckets, b_numbers, key, value, eq, hash) =
let( let(
b_idx = hash(key) % len(map), b_idx = hash(key) % b_numbers,
bucket = map[b_idx], bucket = buckets[b_idx],
k_idx = find_index(bucket, function(kv) eq(kv[0], key)) k_idx = find_index(bucket, function(kv) eq(kv[0], key))
) )
k_idx != -1 ? _replace(map, bucket, key, value, b_idx, k_idx) : k_idx != -1 ? _replace(buckets, b_numbers, bucket, key, value, b_idx, k_idx) :
_put(map, bucket, key, value, b_idx); _put(buckets, b_numbers, bucket, key, value, b_idx);
function _replace(map, bucket, key, value, b_idx, k_idx) = function _replace(buckets, b_numbers, bucket, key, value, b_idx, k_idx) =
let( let(
leng_bucket = len(bucket), leng_bucket = len(bucket),
n_bucket = [for(i = 0; i < leng_bucket; i = i + 1) i == k_idx ? [key, value] : bucket[i]], n_bucket = [for(i = 0; i < leng_bucket; i = i + 1) i == k_idx ? [key, value] : bucket[i]]
leng_map = len(map)
) )
[for(i = 0; i < leng_map; i = i + 1) i == b_idx ? n_bucket : map[i]]; [for(i = 0; i < b_numbers; i = i + 1) i == b_idx ? n_bucket : buckets[i]];
function _put(map, bucket, key, value, b_idx) = function _put(buckets, b_numbers, bucket, key, value, b_idx) =
let(leng_map = len(map)) [for(i = 0; i < b_numbers; i = i + 1) i == b_idx ? concat(bucket, [[key, value]]) : buckets[i]];
[for(i = 0; i < leng_map; i = i + 1) i == b_idx ? concat(bucket, [[key, value]]) : map[i]];

View File

@@ -20,4 +20,4 @@ function hashmap(kv_lt, eq = function(e1, e2) e1 == e2, hash = function(e) _str_
(kv_lt_undef || leng_kv_lt < 256 ? 16 : ceil(sqrt(leng_kv_lt))) : number_of_buckets, (kv_lt_undef || leng_kv_lt < 256 ? 16 : ceil(sqrt(leng_kv_lt))) : number_of_buckets,
buckets = [for(i = [0:b_numbers - 1]) []] buckets = [for(i = [0:b_numbers - 1]) []]
) )
kv_lt_undef ? buckets : _hashmap(kv_lt, leng_kv_lt, buckets, eq, hash); kv_lt_undef ? buckets : _hashmap(kv_lt, leng_kv_lt, buckets, b_numbers, eq, hash);

View File

@@ -12,4 +12,4 @@ use <../../__comm__/_str_hash.scad>;
use <_impl/_hashmap_put_impl.scad>; use <_impl/_hashmap_put_impl.scad>;
function hashmap_put(map, key, value, eq = function(e1, e2) e1 == e2, hash = function(e) _str_hash(e)) = function hashmap_put(map, key, value, eq = function(e1, e2) e1 == e2, hash = function(e) _str_hash(e)) =
_hashmap_put(map, key, value, eq, hash); _hashmap_put(map, len(map), key, value, eq, hash);