aboutsummaryrefslogtreecommitdiffstats
path: root/src/dyn_maps.adb
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2021-12-28 16:38:19 +0100
committerTristan Gingold <tgingold@free.fr>2021-12-28 19:03:35 +0100
commitc2ab0b7be948f9dc16da8185232fcb621f075b9f (patch)
tree06424bd39ffccca269ed4c8f25064c86ff20bf08 /src/dyn_maps.adb
parentc5eb6d2df0f6d8689c2031661f8bd34cccd60219 (diff)
downloadghdl-c2ab0b7be948f9dc16da8185232fcb621f075b9f.tar.gz
ghdl-c2ab0b7be948f9dc16da8185232fcb621f075b9f.tar.bz2
ghdl-c2ab0b7be948f9dc16da8185232fcb621f075b9f.zip
dyn_maps: add Get_Index_Soft.
Diffstat (limited to 'src/dyn_maps.adb')
-rw-r--r--src/dyn_maps.adb47
1 files changed, 36 insertions, 11 deletions
diff --git a/src/dyn_maps.adb b/src/dyn_maps.adb
index 3a118a430..970630193 100644
--- a/src/dyn_maps.adb
+++ b/src/dyn_maps.adb
@@ -66,16 +66,13 @@ package body Dyn_Maps is
Deallocate (Old_Hash_Table);
end Expand;
- procedure Get_Index
- (Inst : in out Instance; Params : Params_Type; Idx : out Index_Type)
+ function Get_Index_With_Hash
+ (Inst : Instance; Params : Params_Type; Hash_Value : Hash_Value_Type)
+ return Index_Type
is
- Hash_Value : Hash_Value_Type;
Hash_Index : Hash_Value_Type;
+ Idx : Index_Type;
begin
- -- Check if the package was initialized.
- pragma Assert (Inst.Hash_Table /= null);
-
- Hash_Value := Hash (Params);
Hash_Index := Hash_Value and (Inst.Size - 1);
Idx := Inst.Hash_Table (Hash_Index);
@@ -84,20 +81,48 @@ package body Dyn_Maps is
E : Element_Wrapper renames Inst.Els.Table (Idx);
begin
if E.Hash = Hash_Value and then Equal (E.Obj, Params) then
- return;
+ return Idx;
end if;
Idx := E.Next;
end;
end loop;
+ return No_Index;
+ end Get_Index_With_Hash;
+
+ function Get_Index_Soft (Inst : Instance; Params : Params_Type)
+ return Index_Type is
+ begin
+ -- Check if the package was initialized.
+ pragma Assert (Inst.Hash_Table /= null);
+
+ return Get_Index_With_Hash (Inst, Params, Hash (Params));
+ end Get_Index_Soft;
+
+ procedure Get_Index
+ (Inst : in out Instance; Params : Params_Type; Idx : out Index_Type)
+ is
+ Hash_Value : constant Hash_Value_Type := Hash (Params);
+ Hash_Index : Hash_Value_Type;
+ begin
+ -- Check if the package was initialized.
+ pragma Assert (Inst.Hash_Table /= null);
+
+ Idx := Get_Index_With_Hash (Inst, Params, Hash_Value);
+ if Idx /= No_Index then
+ return;
+ end if;
+
+ -- Insert.
+
-- Maybe expand the table.
if Hash_Value_Type (Wrapper_Tables.Last (Inst.Els)) > 2 * Inst.Size then
Expand (Inst);
-
- -- Recompute hash index.
- Hash_Index := Hash_Value and (Inst.Size - 1);
end if;
+ -- Compute hash index.
+ Hash_Index := Hash_Value and (Inst.Size - 1);
+
declare
Res : Object_Type;
Val : Value_Type;