--
-- Copyright (C) 2014-2022, AdaCore
-- SPDX-License-Identifier: Apache-2.0
--
with Ada.Unchecked_Conversion;
with System.Storage_Elements;
with Interfaces;
package body Gpr_Parser_Support.Hashes is
-------------
-- Combine --
-------------
function Combine (L, R : Hash_Type) return Hash_Type is
use Interfaces;
-- The following is a translation from Boost's uint32_t hash function
C1 : constant Unsigned_32 := 16#cc9e2d51#;
C2 : constant Unsigned_32 := 16#1b873593#;
H1 : Unsigned_32 := Unsigned_32 (L);
K1 : Unsigned_32 := Unsigned_32 (R);
begin
K1 := K1 * C1;
K1 := Rotate_Left (K1, 15);
K1 := K1 * C2;
H1 := H1 xor K1;
H1 := Rotate_Left (H1, 13);
H1 := H1 * 5 + 16#e6546b64#;
return Hash_Type (H1);
end Combine;
-------------
-- Combine --
-------------
function Combine (Hashes : Hash_Array) return Hash_Type is
Result : Hash_Type := Initial_Hash;
begin
for H of Hashes loop
Result := Combine (Result, H);
end loop;
return Result;
end Combine;
------------------
-- Hash_Address --
------------------
function Hash_Address (Addr : System.Address) return Hash_Type is
use System, System.Storage_Elements;
Result : constant Integer_Address :=
To_Integer (Addr) / (2 ** Ignored_LSB);
begin
return Hash_Type'Mod (Result);
end Hash_Address;
-----------------
-- Hash_Access --
-----------------
function Hash_Access (Acc : Object_Access) return Hash_Type is
use System;
function Convert is new Ada.Unchecked_Conversion
(Object_Access, System.Address);
function Hash is new Hash_Address (Word_Size / Storage_Unit);
begin
return Hash (Convert (Acc));
end Hash_Access;
end Gpr_Parser_Support.Hashes;