diff options
author | Tristan Gingold <tgingold@free.fr> | 2021-12-28 16:38:19 +0100 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2021-12-28 19:03:35 +0100 |
commit | c2ab0b7be948f9dc16da8185232fcb621f075b9f (patch) | |
tree | 06424bd39ffccca269ed4c8f25064c86ff20bf08 /src/dyn_maps.adb | |
parent | c5eb6d2df0f6d8689c2031661f8bd34cccd60219 (diff) | |
download | ghdl-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.adb | 47 |
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; |