From c57fbf40e641dc91652896ebd8d23ed5a451e498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Mon, 24 Oct 2011 22:49:42 +0100 Subject: [PATCH] extend support for hash tables. --- library/bhash.yap | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/library/bhash.yap b/library/bhash.yap index fef13940e..8049f22f3 100644 --- a/library/bhash.yap +++ b/library/bhash.yap @@ -17,7 +17,13 @@ It relies on dynamic array code. b_hash_update/3, b_hash_update/4, b_hash_insert_new/4, - b_hash_insert/4 + b_hash_insert/4, + b_hash_size/2, + b_hash_code/2, + is_b_hash/1, + b_hash_to_list/2, + b_hash_values_to_list/2, + b_hash_keys_to_list/2 ]). :- use_module(library(terms), [ term_hash/4 ]). @@ -27,6 +33,9 @@ It relies on dynamic array code. array_default_size(2048). +is_b_hash(V) :- !, fail. +is_b_hash(hash(_,_,_,_,_)). + b_hash_new(hash(Keys, Vals, Size, N, _, _)) :- array_default_size(Size), array(Keys, Size), @@ -43,6 +52,8 @@ b_hash_new(hash(Keys,Vals, Size, N, HashF, CmpF), Size, HashF, CmpF) :- array(Vals, Size), create_mutable(0, N). +b_hash_size(hash(_, _, Size, _, _, _), Size). + b_hash_lookup(Key, Val, hash(Keys, Vals, Size, _, F, CmpF)):- hash_f(Key, Size, Index, F), fetch_key(Keys, Index, Size, Key, CmpF, ActualIndex), @@ -188,3 +199,37 @@ cmp_f(F, A, B) :- cmp_f(F, A, B) :- call(F, A, B). +b_hash_to_list(hash(Keys, Vals, _, _, _, _), LKeyVals) :- + Keys =.. LKs, + Vals =.. LVs, + mklistpairs(LKs, LVs, LKeyVals). + +b_hash_keys_to_list(hash(Keys, _, _, _, _, _), LKeys) :- + Keys =.. LKs, + mklistels(LKs, LKeys). + +b_hash_keys_to_list(hash(_, Vals, _, _, _, _), LVals) :- + Vals =.. LVs, + mklisvals(LVs, LVals). + +mklistpairs([], [], []). +mklistpairs(V.LKs, _.LVs, KeyVals) :- var(V), !, + mklistpairs(LKs, LVs, KeyVals). +mklistpairs(K.LKs, V.LVs, (K-VV).KeyVals) :- + get_mutable(VV, V), + mklistpairs(LKs, LVs, KeyVals). + +mklistels([], []). +mklistels(V.Es, NEls) :- var(V), !, + mklistels(Els, Nels). +mklistels(K.Els, K.NEls) :- + mklistels(Els, NEls). + +mklistvals([], []). +mklistvals(V.Es, NVals) :- var(V), !, + mklistvals(Vals, Nvals). +mklistvals(K.Vals, KK.NVals) :- + get_mutable(KK, K), + mklistvals(Vals, NVals). + +