diff --git a/src/util/map/_impl/_hashmap_impl.scad b/src/util/map/_impl/_hashmap_impl.scad index b02e24f0..0b4373d7 100644 --- a/src/util/map/_impl/_hashmap_impl.scad +++ b/src/util/map/_impl/_hashmap_impl.scad @@ -1,5 +1,6 @@ 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 : - _hashmap(kv_lt, leng, _hashmap_put(buckets, kv_lt[i][0], kv_lt[i][1], eq, hash), eq, hash, i + 1); \ No newline at end of file + 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); \ No newline at end of file diff --git a/src/util/map/_impl/_hashmap_put_impl.scad b/src/util/map/_impl/_hashmap_put_impl.scad index 56c183b0..3dd01e08 100644 --- a/src/util/map/_impl/_hashmap_put_impl.scad +++ b/src/util/map/_impl/_hashmap_put_impl.scad @@ -1,23 +1,21 @@ use <../../some.scad>; use <../../find_index.scad>; -function _hashmap_put(map, key, value, eq, hash) = +function _hashmap_put(buckets, b_numbers, key, value, eq, hash) = let( - b_idx = hash(key) % len(map), - bucket = map[b_idx], + b_idx = hash(key) % b_numbers, + bucket = buckets[b_idx], k_idx = find_index(bucket, function(kv) eq(kv[0], key)) ) - k_idx != -1 ? _replace(map, bucket, key, value, b_idx, k_idx) : - _put(map, bucket, key, value, b_idx); + 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(map, bucket, key, value, b_idx, k_idx) = +function _replace(buckets, b_numbers, bucket, key, value, b_idx, k_idx) = let( leng_bucket = len(bucket), - n_bucket = [for(i = 0; i < leng_bucket; i = i + 1) i == k_idx ? [key, value] : bucket[i]], - leng_map = len(map) + n_bucket = [for(i = 0; i < leng_bucket; i = i + 1) i == k_idx ? [key, value] : bucket[i]] ) - [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) = - let(leng_map = len(map)) - [for(i = 0; i < leng_map; i = i + 1) i == b_idx ? concat(bucket, [[key, value]]) : map[i]]; \ No newline at end of file +function _put(buckets, b_numbers, bucket, key, value, b_idx) = + [for(i = 0; i < b_numbers; i = i + 1) i == b_idx ? concat(bucket, [[key, value]]) : buckets[i]]; \ No newline at end of file diff --git a/src/util/map/hashmap.scad b/src/util/map/hashmap.scad index e1b14e9a..ee7f4a94 100644 --- a/src/util/map/hashmap.scad +++ b/src/util/map/hashmap.scad @@ -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, buckets = [for(i = [0:b_numbers - 1]) []] ) - kv_lt_undef ? buckets : _hashmap(kv_lt, leng_kv_lt, buckets, eq, hash); \ No newline at end of file + kv_lt_undef ? buckets : _hashmap(kv_lt, leng_kv_lt, buckets, b_numbers, eq, hash); \ No newline at end of file diff --git a/src/util/map/hashmap_put.scad b/src/util/map/hashmap_put.scad index 77c4eb25..f3958020 100644 --- a/src/util/map/hashmap_put.scad +++ b/src/util/map/hashmap_put.scad @@ -12,4 +12,4 @@ use <../../__comm__/_str_hash.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)) = - _hashmap_put(map, key, value, eq, hash); \ No newline at end of file + _hashmap_put(map, len(map), key, value, eq, hash); \ No newline at end of file