A.4.8 Wide_Wide_String Handling
Facilities for handling strings of Wide_Wide_Character 
elements are found in the packages Strings.Wide_Wide_Maps, Strings.Wide_Wide_Fixed, 
Strings.Wide_Wide_Bounded, Strings.Wide_Wide_Unbounded, and Strings.Wide_Wide_Maps.Wide_Wide_Constants, 
and in the library functions Strings.Wide_Wide_Hash, Strings.Wide_Wide_Fixed.Wide_Wide_Hash, 
Strings.Wide_Wide_Bounded.Wide_Wide_Hash, Strings.Wide_Wide_Unbounded.Wide_Wide_Hash, 
Strings.Wide_Wide_Hash_Case_Insensitive, Strings.Wide_Wide_Fixed.Wide_Wide_Hash_Case_Insensitive, 
Strings.Wide_Wide_Bounded.Wide_Wide_Hash_Case_Insensitive, Strings.Wide_Wide_Unbounded.Wide_Wide_Hash_Case_Insensitive, 
Strings.Wide_Wide_Equal_Case_Insensitive, Strings.Wide_Wide_Fixed.Wide_Wide_Equal_Case_Insensitive, 
Strings.Wide_Wide_Bounded.Wide_Wide_Equal_Case_Insensitive, and Strings.Wide_Wide_Unbounded.Wide_Wide_Equal_Case_Insensitive. 
They provide the same string-handling operations as the corresponding 
packages and functions for strings of Character elements. 
Static Semantics
The library package 
Strings.Wide_Wide_Maps has the following declaration.
package Ada.Strings.Wide_Wide_Maps
   with Preelaborate, Nonblocking, Global => 
in out synchronized is 
   -- 
Representation for a set of Wide_Wide_Character values:
   type Wide_Wide_Character_Set 
is private
      with Preelaborable_Initialization;
   Null_Set : 
constant Wide_Wide_Character_Set;
 
   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 : 
in Wide_Wide_Character_Ranges)
         
return Wide_Wide_Character_Set;
 
   function To_Set (Span : 
in Wide_Wide_Character_Range)
         
return Wide_Wide_Character_Set;
 
   function To_Ranges (Set : 
in Wide_Wide_Character_Set)
         
return Wide_Wide_Character_Ranges;
 
   function "=" (Left, Right : in Wide_Wide_Character_Set) return Boolean;
   function "not" (Right : in Wide_Wide_Character_Set)
         return Wide_Wide_Character_Set;
   function "and" (Left, Right : in Wide_Wide_Character_Set)
         return Wide_Wide_Character_Set;
   function "or" (Left, Right : in Wide_Wide_Character_Set)
         return Wide_Wide_Character_Set;
   function "xor" (Left, Right : in Wide_Wide_Character_Set)
         return Wide_Wide_Character_Set;
   function "-" (Left, Right : in Wide_Wide_Character_Set)
         return Wide_Wide_Character_Set;
   function Is_In (Element : 
in Wide_Wide_Character;
                   Set     : 
in Wide_Wide_Character_Set)
         
return Boolean;
 
   function Is_Subset (Elements : 
in Wide_Wide_Character_Set;
                       Set      : 
in Wide_Wide_Character_Set)
         
return Boolean;
 
   function "<=" (Left  : in Wide_Wide_Character_Set;
                  Right : in Wide_Wide_Character_Set)
         return Boolean renames Is_Subset;
   -- 
Alternative representation for a set of Wide_Wide_Character values:
   subtype Wide_Wide_Character_Sequence 
is Wide_Wide_String;
   function To_Set (Sequence : 
in Wide_Wide_Character_Sequence)
         
return Wide_Wide_Character_Set;
 
   function To_Set (Singleton : 
in Wide_Wide_Character)
         
return Wide_Wide_Character_Set;
 
   function To_Sequence (Set : 
in Wide_Wide_Character_Set)
         
return Wide_Wide_Character_Sequence;
 
   -- 
Representation for a Wide_Wide_Character to Wide_Wide_Character
   -- 
mapping:
   type Wide_Wide_Character_Mapping 
is private
      with Preelaborable_Initialization;
   function Value (Map     : 
in Wide_Wide_Character_Mapping;
                   Element : 
in Wide_Wide_Character)
         
return Wide_Wide_Character;
 
   Identity : 
constant Wide_Wide_Character_Mapping;
 
   function To_Mapping (From, To : 
in Wide_Wide_Character_Sequence)
         
return Wide_Wide_Character_Mapping;
 
   function To_Domain (Map : 
in Wide_Wide_Character_Mapping)
         
return Wide_Wide_Character_Sequence;
 
   function To_Range (Map : 
in Wide_Wide_Character_Mapping)
         
return Wide_Wide_Character_Sequence;
 
   type Wide_Wide_Character_Mapping_Function 
is
         access function (From : 
in Wide_Wide_Character)
         
return Wide_Wide_Character;
 
private
   ... -- not specified by the language
end Ada.Strings.Wide_Wide_Maps;
The context clause for each of 
the packages Strings.Wide_Wide_Fixed, Strings.Wide_Wide_Bounded, and 
Strings.Wide_Wide_Unbounded identifies Strings.Wide_Wide_Maps instead 
of Strings.Maps.
  Types Wide_Wide_Character_Set and Wide_Wide_Character_Mapping 
need finalization.
For each of the packages 
Strings.Fixed, Strings.Bounded, Strings.Unbounded, and Strings.Maps.Constants, 
and for library functions Strings.Hash, Strings.Fixed.Hash, Strings.Bounded.Hash, 
Strings.Unbounded.Hash, Strings.Hash_Case_Insensitive, Strings.Fixed.Hash_Case_Insensitive, 
Strings.Bounded.Hash_Case_Insensitive, Strings.Unbounded.Hash_Case_Insensitive, 
Strings.Equal_Case_Insensitive, Strings.Fixed.Equal_Case_Insensitive, 
Strings.Bounded.Equal_Case_Insensitive, and Strings.Unbounded.Equal_Case_Insensitive, 
the corresponding wide wide string package or function has the same contents 
except that
Wide_Wide_Space replaces Space
Wide_Wide_Character replaces Character
Wide_Wide_String replaces String
Wide_Wide_Character_Set replaces Character_Set
Wide_Wide_Character_Mapping replaces Character_Mapping
Wide_Wide_Character_Mapping_Function replaces Character_Mapping_Function
Wide_Wide_Maps replaces Maps
Bounded_Wide_Wide_String replaces Bounded_String
Null_Bounded_Wide_Wide_String replaces Null_Bounded_String
To_Bounded_Wide_Wide_String replaces To_Bounded_String
To_Wide_Wide_String replaces To_String
Set_Bounded_Wide_Wide_String replaces Set_Bounded_String
Unbounded_Wide_Wide_String replaces Unbounded_String
Null_Unbounded_Wide_Wide_String replaces Null_Unbounded_String
Wide_Wide_String_Access replaces String_Access
To_Unbounded_Wide_Wide_String replaces To_Unbounded_String
Set_Unbounded_Wide_Wide_String replaces Set_Unbounded_String
The following additional 
declarations are present in Strings.Wide_Wide_Maps.Wide_Wide_Constants:
Character_Set : 
constant Wide_Wide_Maps.Wide_Wide_Character_Set;
-- 
Contains each Wide_Wide_Character value WWC such that
-- 
Characters.Conversions.Is_Character(WWC) is True
Wide_Character_Set : 
constant Wide_Wide_Maps.Wide_Wide_Character_Set;
-- 
Contains each Wide_Wide_Character value WWC such that
-- 
Characters.Conversions.Is_Wide_Character(WWC) is TrueEach Wide_Wide_Character_Set constant in the package 
Strings.Wide_Wide_Maps.Wide_Wide_Constants contains no values outside 
the Character portion of Wide_Wide_Character. Similarly, each Wide_Wide_Character_Mapping 
constant in this package is the identity mapping when applied to any 
element outside the Character portion of Wide_Wide_Character.
Aspect Pure is replaced by aspects Preelaborate, 
Nonblocking, Global => in out synchronized in Strings.Wide_Wide_Maps.Wide_Wide_Constants.
NOTE   If a null Wide_Wide_Character_Mapping_Function 
is passed to any of the Wide_Wide_String handling subprograms, Constraint_Error 
is propagated. 
 Ada 2005 and 2012 Editions sponsored in part by Ada-Europe
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe