| ------------------------------------------------------------------------------ |
| -- -- |
| -- GNAT RUN-TIME COMPONENTS -- |
| -- -- |
| -- A D A . S T R I N G S . W I D E _ W I D E _ M A P S -- |
| -- -- |
| -- S p e c -- |
| -- -- |
| -- Copyright (C) 1992-2022, Free Software Foundation, Inc. -- |
| -- -- |
| -- This specification is derived from the Ada Reference Manual for use with -- |
| -- GNAT. The copyright notice above, and the license provisions that follow -- |
| -- apply solely to the contents of the part following the private keyword. -- |
| -- -- |
| -- GNAT is free software; you can redistribute it and/or modify it under -- |
| -- terms of the GNU General Public License as published by the Free Soft- -- |
| -- ware Foundation; either version 3, or (at your option) any later ver- -- |
| -- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- |
| -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- |
| -- or FITNESS FOR A PARTICULAR PURPOSE. -- |
| -- -- |
| -- As a special exception under Section 7 of GPL version 3, you are granted -- |
| -- additional permissions described in the GCC Runtime Library Exception, -- |
| -- version 3.1, as published by the Free Software Foundation. -- |
| -- -- |
| -- You should have received a copy of the GNU General Public License and -- |
| -- a copy of the GCC Runtime Library Exception along with this program; -- |
| -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- |
| -- <http://www.gnu.org/licenses/>. -- |
| -- -- |
| -- GNAT was originally developed by the GNAT team at New York University. -- |
| -- Extensive contributions were provided by Ada Core Technologies Inc. -- |
| -- -- |
| ------------------------------------------------------------------------------ |
| |
| with Ada.Finalization; |
| |
| package Ada.Strings.Wide_Wide_Maps is |
| pragma Preelaborate; |
| |
| ------------------------------------------ |
| -- Wide_Wide_Character Set Declarations -- |
| ------------------------------------------ |
| |
| type Wide_Wide_Character_Set is private; |
| pragma Preelaborable_Initialization (Wide_Wide_Character_Set); |
| -- Representation for a set of Wide_Wide_Character values: |
| |
| Null_Set : constant Wide_Wide_Character_Set; |
| |
| ----------------------------------------------- |
| -- Constructors for Wide_Wide_Character Sets -- |
| ----------------------------------------------- |
| |
| type Wide_Wide_Character_Range is record |
| Low : Wide_Wide_Character; |
| High : Wide_Wide_Character; |
| end record; |
| -- Represents Wide_Wide_Character range Low .. High |
| |
| type Wide_Wide_Character_Ranges is |
| array (Positive range <>) of Wide_Wide_Character_Range; |
| |
| function To_Set |
| (Ranges : Wide_Wide_Character_Ranges) return Wide_Wide_Character_Set; |
| |
| function To_Set |
| (Span : Wide_Wide_Character_Range) return Wide_Wide_Character_Set; |
| |
| function To_Ranges |
| (Set : Wide_Wide_Character_Set) return Wide_Wide_Character_Ranges; |
| |
| --------------------------------------- |
| -- Operations on Wide Character Sets -- |
| --------------------------------------- |
| |
| function "=" (Left, Right : Wide_Wide_Character_Set) return Boolean; |
| |
| function "not" |
| (Right : Wide_Wide_Character_Set) return Wide_Wide_Character_Set; |
| |
| function "and" |
| (Left, Right : Wide_Wide_Character_Set) return Wide_Wide_Character_Set; |
| |
| function "or" |
| (Left, Right : Wide_Wide_Character_Set) return Wide_Wide_Character_Set; |
| |
| function "xor" |
| (Left, Right : Wide_Wide_Character_Set) return Wide_Wide_Character_Set; |
| |
| function "-" |
| (Left, Right : Wide_Wide_Character_Set) return Wide_Wide_Character_Set; |
| |
| function Is_In |
| (Element : Wide_Wide_Character; |
| Set : Wide_Wide_Character_Set) return Boolean; |
| |
| function Is_Subset |
| (Elements : Wide_Wide_Character_Set; |
| Set : Wide_Wide_Character_Set) return Boolean; |
| |
| function "<=" |
| (Left : Wide_Wide_Character_Set; |
| Right : Wide_Wide_Character_Set) return Boolean |
| renames Is_Subset; |
| |
| subtype Wide_Wide_Character_Sequence is Wide_Wide_String; |
| -- Alternative representation for a set of character values |
| |
| function To_Set |
| (Sequence : Wide_Wide_Character_Sequence) return Wide_Wide_Character_Set; |
| |
| function To_Set |
| (Singleton : Wide_Wide_Character) return Wide_Wide_Character_Set; |
| |
| function To_Sequence |
| (Set : Wide_Wide_Character_Set) return Wide_Wide_Character_Sequence; |
| |
| ---------------------------------------------- |
| -- Wide_Wide_Character Mapping Declarations -- |
| ---------------------------------------------- |
| |
| type Wide_Wide_Character_Mapping is private; |
| pragma Preelaborable_Initialization (Wide_Wide_Character_Mapping); |
| -- Representation for a wide character to wide character mapping: |
| |
| function Value |
| (Map : Wide_Wide_Character_Mapping; |
| Element : Wide_Wide_Character) return Wide_Wide_Character; |
| |
| Identity : constant Wide_Wide_Character_Mapping; |
| |
| -------------------------------------- |
| -- Operations on Wide Wide Mappings -- |
| --------------------------------------- |
| |
| function To_Mapping |
| (From, To : Wide_Wide_Character_Sequence) |
| return Wide_Wide_Character_Mapping; |
| |
| function To_Domain |
| (Map : Wide_Wide_Character_Mapping) return Wide_Wide_Character_Sequence; |
| |
| function To_Range |
| (Map : Wide_Wide_Character_Mapping) return Wide_Wide_Character_Sequence; |
| |
| type Wide_Wide_Character_Mapping_Function is |
| access function (From : Wide_Wide_Character) return Wide_Wide_Character; |
| |
| private |
| package AF renames Ada.Finalization; |
| |
| ----------------------------------------------- |
| -- Representation of Wide_Wide_Character_Set -- |
| ----------------------------------------------- |
| |
| -- A wide character set is represented as a sequence of wide character |
| -- ranges (i.e. an object of type Wide_Wide_Character_Ranges) in which the |
| -- following hold: |
| |
| -- The lower bound is 1 |
| -- The ranges are in order by increasing Low values |
| -- The ranges are non-overlapping and discontigous |
| |
| -- A character value is in the set if it is contained in one of the |
| -- ranges. The actual Wide_Wide_Character_Set value is a controlled pointer |
| -- to this Wide_Wide_Character_Ranges value. The use of a controlled type |
| -- is necessary to prevent storage leaks. |
| |
| type Wide_Wide_Character_Ranges_Access is |
| access all Wide_Wide_Character_Ranges; |
| |
| type Wide_Wide_Character_Set is new AF.Controlled with record |
| Set : Wide_Wide_Character_Ranges_Access; |
| end record; |
| |
| pragma Finalize_Storage_Only (Wide_Wide_Character_Set); |
| -- This avoids useless finalizations, and, more importantly avoids |
| -- incorrect attempts to finalize constants that are statically |
| -- declared here and in Ada.Strings.Wide_Wide_Maps, which is incorrect. |
| |
| procedure Initialize (Object : in out Wide_Wide_Character_Set); |
| procedure Adjust (Object : in out Wide_Wide_Character_Set); |
| procedure Finalize (Object : in out Wide_Wide_Character_Set); |
| |
| Null_Range : aliased constant Wide_Wide_Character_Ranges := []; |
| |
| Null_Set : constant Wide_Wide_Character_Set := |
| (AF.Controlled with |
| Set => Null_Range'Unrestricted_Access); |
| |
| --------------------------------------------------- |
| -- Representation of Wide_Wide_Character_Mapping -- |
| --------------------------------------------------- |
| |
| -- A wide character mapping is represented as two strings of equal |
| -- length, where any character appearing in Domain is mapped to the |
| -- corresponding character in Rangev. A character not appearing in |
| -- Domain is mapped to itself. The characters in Domain are sorted |
| -- in ascending order. |
| |
| -- The actual Wide_Wide_Character_Mapping value is a controlled record |
| -- that contains a pointer to a discriminated record containing the |
| -- range and domain values. |
| |
| -- Note: this representation is canonical, and the values stored in |
| -- Domain and Rangev are exactly the values that are returned by the |
| -- functions To_Domain and To_Range. The use of a controlled type is |
| -- necessary to prevent storage leaks. |
| |
| type Wide_Wide_Character_Mapping_Values (Length : Natural) is record |
| Domain : Wide_Wide_Character_Sequence (1 .. Length); |
| Rangev : Wide_Wide_Character_Sequence (1 .. Length); |
| end record; |
| |
| type Wide_Wide_Character_Mapping_Values_Access is |
| access all Wide_Wide_Character_Mapping_Values; |
| |
| type Wide_Wide_Character_Mapping is new AF.Controlled with record |
| Map : Wide_Wide_Character_Mapping_Values_Access; |
| end record; |
| |
| pragma Finalize_Storage_Only (Wide_Wide_Character_Mapping); |
| -- This avoids useless finalizations, and, more importantly avoids |
| -- incorrect attempts to finalize constants that are statically |
| -- declared here and in Ada.Strings.Wide_Wide_Maps, which is incorrect. |
| |
| procedure Initialize (Object : in out Wide_Wide_Character_Mapping); |
| procedure Adjust (Object : in out Wide_Wide_Character_Mapping); |
| procedure Finalize (Object : in out Wide_Wide_Character_Mapping); |
| |
| Null_Map : aliased constant Wide_Wide_Character_Mapping_Values := |
| (Length => 0, |
| Domain => "", |
| Rangev => ""); |
| |
| Identity : constant Wide_Wide_Character_Mapping := |
| (AF.Controlled with |
| Map => Null_Map'Unrestricted_Access); |
| |
| end Ada.Strings.Wide_Wide_Maps; |