diff options
Diffstat (limited to 'src/interning.ads')
-rw-r--r-- | src/interning.ads | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/interning.ads b/src/interning.ads new file mode 100644 index 000000000..70573022e --- /dev/null +++ b/src/interning.ads @@ -0,0 +1,59 @@ +-- Type interning - set of unique objects. +-- Copyright (C) 2019 Tristan Gingold +-- +-- GHDL is free software; you can redistribute it and/or modify it under +-- the terms of the GNU General Public License as published by the Free +-- Software Foundation; either version 2, or (at your option) any later +-- version. +-- +-- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY +-- WARRANTY; without even the implied warranty of MERCHANTABILITY or +-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-- for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with GHDL; see the file COPYING. If not, write to the Free +-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA +-- 02111-1307, USA. + +with Types; use Types; +with Hash; use Hash; + +-- This generic package provides a factory to build unique objects. +-- Get will return an existing object or create a new one. +generic + -- Parameters of the object to be created. + type Params_Type (<>) is private; + + -- Object to be built and stored. + type Object_Type is private; + + -- Reduce PARAMS to a small value. + -- The required property is: Hash(P1) /= Hash(P2) => P1 /= P2. + with function Hash (Params : Params_Type) return Hash_Value_Type; + + -- Create an object from PARAMS. + with function Build (Params : Params_Type) return Object_Type; + + -- Return True iff OBJ is the object corresponding to PARAMS. + with function Equal (Obj : Object_Type; Params : Params_Type) + return Boolean; +package Interning is + -- Initialize. Required before any other operation. + procedure Init; + + -- If there is already an existing object for PARAMS, return it. + -- Otherwise create it. + function Get (Params : Params_Type) return Object_Type; + + type Index_Type is new Uns32; + No_Index : constant Index_Type := 0; + First_Index : constant Index_Type := 1; + + -- Get the number of elements in the table. + function Last_Index return Index_Type; + + -- Get an element by index. The index has no real meaning, but the + -- current implementation allocates index incrementally. + function Get_By_Index (Index : Index_Type) return Object_Type; +end Interning; |