------------------------------------------------------------------------------
--                                                                          --
--                         GNAT RUNTIME COMPONENTS                          --
--                                                                          --
-- A D A . S T R I N G S . W I D E _ M A P S . W I D E _ C O N S T A N T S  --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--                            $Revision: 1.13 $                             --
--                                                                          --
-- This specification is adapted from the Ada Reference Manual for use with --
-- GNAT.  In accordance with the copyright of that document, you can freely --
-- copy and modify this specification,  provided that if you redistribute a --
-- modified version,  any changes that you have made are clearly indicated. --
--                                                                          --
------------------------------------------------------------------------------


with Ada.Characters.Wide_Latin_1;

package Ada.Strings.Wide_Maps.Wide_Constants is
pragma Preelaborate (Wide_Constants);

   package W renames Ada.Characters.Wide_Latin_1;

   Control_Set           : constant Wide_Maps.Wide_Character_Set;
   Graphic_Set           : constant Wide_Maps.Wide_Character_Set;
   Letter_Set            : constant Wide_Maps.Wide_Character_Set;
   Lower_Set             : constant Wide_Maps.Wide_Character_Set;
   Upper_Set             : constant Wide_Maps.Wide_Character_Set;
   Basic_Set             : constant Wide_Maps.Wide_Character_Set;
   Decimal_Digit_Set     : constant Wide_Maps.Wide_Character_Set;
   Hexadecimal_Digit_Set : constant Wide_Maps.Wide_Character_Set;
   Alphanumeric_Set      : constant Wide_Maps.Wide_Character_Set;
   Special_Graphic_Set   : constant Wide_Maps.Wide_Character_Set;
   ISO_646_Set           : constant Wide_Maps.Wide_Character_Set;
   Character_Set         : constant Wide_Maps.Wide_Character_Set;

   Lower_Case_Map        : constant Wide_Maps.Wide_Character_Mapping;
   --  Maps to lower case for letters, else identity

   Upper_Case_Map        : constant Wide_Maps.Wide_Character_Mapping;
   --  Maps to upper case for letters, else identity

   Basic_Map             : constant Wide_Maps.Wide_Character_Mapping;
   --  Maps to basic letter for letters, else identity

private
   subtype WC is Wide_Character;

   Control_Ranges           : aliased constant Wide_Character_Ranges :=
     ((W.NUL, W.US),
      (W.DEL, W.APC));

   Control_Set              : constant Wide_Character_Set            :=
                                Control_Ranges'Access;

   Graphic_Ranges           : aliased constant Wide_Character_Ranges :=
     ((W.' ',          W.Tilde),
      (WC'Val (256), WC'Last));

   Graphic_Set              : constant Wide_Character_Set            :=
                                Graphic_Ranges'Access;

   Letter_Ranges            : aliased constant Wide_Character_Ranges :=
     ((W.'A',                 W.'Z'),
      (W.'a',                 W.'z'),
      (W.UC_A_Grave,          W.UC_O_Diaeresis),
      (W.UC_O_Oblique_Stroke, W.LC_O_Diaeresis),
      (W.LC_O_Oblique_Stroke, W.LC_Y_Diaeresis));

   Letter_Set               : constant Wide_Character_Set            :=
                                Letter_Ranges'Access;

   Lower_Ranges             : aliased constant Wide_Character_Ranges :=
     (1 => (W.'a',                 W.'z'),
      2 => (W.LC_German_Sharp_S,   W.LC_O_Diaeresis),
      3 => (W.LC_O_Oblique_Stroke, W.LC_Y_Diaeresis));

   Lower_Set                : constant Wide_Character_Set            :=
                                Lower_Ranges'Access;

   Upper_Ranges             : aliased constant Wide_Character_Ranges :=
     (1 => (W.'A',                 W.'Z'),
      2 => (W.UC_A_Grave,          W.UC_O_Diaeresis),
      3 => (W.UC_O_Oblique_Stroke, W.UC_Icelandic_Thorn));

   Upper_Set                : constant Wide_Character_Set            :=
                                Upper_Ranges'Access;

   Basic_Ranges             : aliased constant Wide_Character_Ranges :=
     (1 => (W.'A',                 W.'Z'),
      2 => (W.'a',                 W.'z'),
      3 => (W.UC_AE_Diphthong,     W.UC_AE_Diphthong),
      4 => (W.LC_AE_Diphthong,     W.LC_AE_Diphthong),
      5 => (W.LC_German_Sharp_S,   W.LC_German_Sharp_S),
      6 => (W.UC_Icelandic_Thorn,  W.UC_Icelandic_Thorn),
      7 => (W.LC_Icelandic_Thorn,  W.LC_Icelandic_Thorn),
      8 => (W.UC_Icelandic_Eth,    W.UC_Icelandic_Eth),
      9 => (W.LC_Icelandic_Eth,    W.LC_Icelandic_Eth));

   Basic_Set                : constant Wide_Character_Set            :=
                                Basic_Ranges'Access;

   Decimal_Digit_Ranges     : aliased constant Wide_Character_Ranges :=
     (1 => (W.'0', W.'9'));

   Decimal_Digit_Set        : constant Wide_Character_Set :=
                                Decimal_Digit_Ranges'Access;

   Hexadecimal_Digit_Ranges : aliased constant Wide_Character_Ranges :=
     (1 => (W.'0', W.'9'),
      2 => (W.'A', W.'F'),
      3 => (W.'a', W.'f'));

   Hexadecimal_Digit_Set    : constant Wide_Character_Set :=
                                Hexadecimal_Digit_Ranges'Access;

   Alphanumeric_Ranges      : aliased constant Wide_Character_Ranges :=
     (1 => (W.'0',                 W.'9'),
      2 => (W.'A',                 W.'Z'),
      3 => (W.'a',                 W.'z'),
      4 => (W.UC_A_Grave,          W.UC_O_Diaeresis),
      5 => (W.UC_O_Oblique_Stroke, W.LC_O_Diaeresis),
      6 => (W.LC_O_Oblique_Stroke, W.LC_Y_Diaeresis));

   Alphanumeric_Set         : constant Wide_Character_Set            :=
                                Alphanumeric_Ranges'Access;

   Special_Graphic_Ranges   : aliased constant Wide_Character_Ranges :=
     (1 => (Wide_Space,            W.Solidus),
      2 => (W.Colon,               W.Commercial_At),
      3 => (W.Left_Square_Bracket, W.Grave),
      4 => (W.Left_Curly_Bracket,  W.Tilde),
      5 => (W.No_Break_Space,      W.Inverted_Question),
      6 => (W.Multiplication_Sign, W.Multiplication_Sign),
      7 => (W.Division_Sign,       W.Division_Sign));

   Special_Graphic_Set      : constant Wide_Character_Set            :=
                                Special_Graphic_Ranges'Access;

   ISO_646_Ranges           : aliased constant Wide_Character_Ranges :=
     (1 => (W.NUL, W.DEL));

   ISO_646_Set              : constant Wide_Character_Set            :=
                                ISO_646_Ranges'Access;

   Character_Ranges         : aliased constant Wide_Character_Ranges :=
     (1 => (W.NUL, WC'Val (255)));

   Character_Set            : constant Wide_Character_Set :=
                                Character_Ranges'Access;

   Lower_From : aliased constant Wide_Character_Sequence :=
     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"    &
      W.UC_A_Grave                   &
      W.UC_A_Acute                   &
      W.UC_A_Circumflex              &
      W.UC_A_Tilde                   &
      W.UC_A_Diaeresis               &
      W.UC_A_Ring                    &
      W.UC_AE_Diphthong              &
      W.UC_C_Cedilla                 &
      W.UC_E_Grave                   &
      W.UC_E_Acute                   &
      W.UC_E_Circumflex              &
      W.UC_E_Diaeresis               &
      W.UC_I_Grave                   &
      W.UC_I_Acute                   &
      W.UC_I_Circumflex              &
      W.UC_I_Diaeresis               &
      W.UC_Icelandic_Eth             &
      W.UC_N_Tilde                   &
      W.UC_O_Grave                   &
      W.UC_O_Acute                   &
      W.UC_O_Circumflex              &
      W.UC_O_Tilde                   &
      W.UC_O_Diaeresis               &
      W.UC_O_Oblique_Stroke          &
      W.UC_U_Grave                   &
      W.UC_U_Acute                   &
      W.UC_U_Circumflex              &
      W.UC_U_Diaeresis               &
      W.UC_Y_Acute                   &
      W.UC_Icelandic_Thorn;

   Lower_To : aliased constant Wide_Character_Sequence :=
     "abcdefghijklmnopqrstuvwxyz"    &
      W.LC_A_Grave                   &
      W.LC_A_Acute                   &
      W.LC_A_Circumflex              &
      W.LC_A_Tilde                   &
      W.LC_A_Diaeresis               &
      W.LC_A_Ring                    &
      W.LC_AE_Diphthong              &
      W.LC_C_Cedilla                 &
      W.LC_E_Grave                   &
      W.LC_E_Acute                   &
      W.LC_E_Circumflex              &
      W.LC_E_Diaeresis               &
      W.LC_I_Grave                   &
      W.LC_I_Acute                   &
      W.LC_I_Circumflex              &
      W.LC_I_Diaeresis               &
      W.LC_Icelandic_Eth             &
      W.LC_N_Tilde                   &
      W.LC_O_Grave                   &
      W.LC_O_Acute                   &
      W.LC_O_Circumflex              &
      W.LC_O_Tilde                   &
      W.LC_O_Diaeresis               &
      W.LC_O_Oblique_Stroke          &
      W.LC_U_Grave                   &
      W.LC_U_Acute                   &
      W.LC_U_Circumflex              &
      W.LC_U_Diaeresis               &
      W.LC_Y_Acute                   &
      W.LC_Icelandic_Thorn;

   Lower_Case_Map : constant Wide_Character_Mapping :=
     Wide_Character_Mapping' (Lower_From'Access, Lower_To'Access);

   Upper_From : aliased constant Wide_Character_Sequence :=
     "abcdefghijklmnopqrstuvwxyz"    &
      W.LC_A_Grave                   &
      W.LC_A_Acute                   &
      W.LC_A_Circumflex              &
      W.LC_A_Tilde                   &
      W.LC_A_Diaeresis               &
      W.LC_A_Ring                    &
      W.LC_AE_Diphthong              &
      W.LC_C_Cedilla                 &
      W.LC_E_Grave                   &
      W.LC_E_Acute                   &
      W.LC_E_Circumflex              &
      W.LC_E_Diaeresis               &
      W.LC_I_Grave                   &
      W.LC_I_Acute                   &
      W.LC_I_Circumflex              &
      W.LC_I_Diaeresis               &
      W.LC_Icelandic_Eth             &
      W.LC_N_Tilde                   &
      W.LC_O_Grave                   &
      W.LC_O_Acute                   &
      W.LC_O_Circumflex              &
      W.LC_O_Tilde                   &
      W.LC_O_Diaeresis               &
      W.LC_O_Oblique_Stroke          &
      W.LC_U_Grave                   &
      W.LC_U_Acute                   &
      W.LC_U_Circumflex              &
      W.LC_U_Diaeresis               &
      W.LC_Y_Acute                   &
      W.LC_Icelandic_Thorn;

   Upper_To : aliased constant Wide_Character_Sequence :=
     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"    &
      W.UC_A_Grave                   &
      W.UC_A_Acute                   &
      W.UC_A_Circumflex              &
      W.UC_A_Tilde                   &
      W.UC_A_Diaeresis               &
      W.UC_A_Ring                    &
      W.UC_AE_Diphthong              &
      W.UC_C_Cedilla                 &
      W.UC_E_Grave                   &
      W.UC_E_Acute                   &
      W.UC_E_Circumflex              &
      W.UC_E_Diaeresis               &
      W.UC_I_Grave                   &
      W.UC_I_Acute                   &
      W.UC_I_Circumflex              &
      W.UC_I_Diaeresis               &
      W.UC_Icelandic_Eth             &
      W.UC_N_Tilde                   &
      W.UC_O_Grave                   &
      W.UC_O_Acute                   &
      W.UC_O_Circumflex              &
      W.UC_O_Tilde                   &
      W.UC_O_Diaeresis               &
      W.UC_O_Oblique_Stroke          &
      W.UC_U_Grave                   &
      W.UC_U_Acute                   &
      W.UC_U_Circumflex              &
      W.UC_U_Diaeresis               &
      W.UC_Y_Acute                   &
      W.UC_Icelandic_Thorn;

   Upper_Case_Map : constant Wide_Character_Mapping :=
     Wide_Character_Mapping' (Upper_From'Access, Upper_To'Access);

   Basic_From : aliased constant Wide_Character_Sequence :=
      W.UC_A_Grave                    &
      W.UC_A_Acute                    &
      W.UC_A_Circumflex               &
      W.UC_A_Tilde                    &
      W.UC_A_Diaeresis                &
      W.UC_A_Ring                     &
      W.UC_C_Cedilla                  &
      W.UC_E_Grave                    &
      W.UC_E_Acute                    &
      W.UC_E_Circumflex               &
      W.UC_E_Diaeresis                &
      W.UC_I_Grave                    &
      W.UC_I_Acute                    &
      W.UC_I_Circumflex               &
      W.UC_I_Diaeresis                &
      W.UC_N_Tilde                    &
      W.UC_O_Grave                    &
      W.UC_O_Acute                    &
      W.UC_O_Circumflex               &
      W.UC_O_Tilde                    &
      W.UC_O_Diaeresis                &
      W.UC_O_Oblique_Stroke           &
      W.UC_U_Grave                    &
      W.UC_U_Acute                    &
      W.UC_U_Circumflex               &
      W.UC_U_Diaeresis                &
      W.UC_Y_Acute                    &
      W.LC_A_Grave                    &
      W.LC_A_Acute                    &
      W.LC_A_Circumflex               &
      W.LC_A_Tilde                    &
      W.LC_A_Diaeresis                &
      W.LC_A_Ring                     &
      W.LC_C_Cedilla                  &
      W.LC_E_Grave                    &
      W.LC_E_Acute                    &
      W.LC_E_Circumflex               &
      W.LC_E_Diaeresis                &
      W.LC_I_Grave                    &
      W.LC_I_Acute                    &
      W.LC_I_Circumflex               &
      W.LC_I_Diaeresis                &
      W.LC_N_Tilde                    &
      W.LC_O_Grave                    &
      W.LC_O_Acute                    &
      W.LC_O_Circumflex               &
      W.LC_O_Tilde                    &
      W.LC_O_Diaeresis                &
      W.LC_O_Oblique_Stroke           &
      W.LC_U_Grave                    &
      W.LC_U_Acute                    &
      W.LC_U_Circumflex               &
      W.LC_U_Diaeresis                &
      W.LC_Y_Acute                    &
      W.LC_Y_Diaeresis;

   Basic_To : aliased constant Wide_Character_Sequence :=
      'A'                           &  -- UC_A_Grave
      'A'                           &  -- UC_A_Acute
      'A'                           &  -- UC_A_Circumflex
      'A'                           &  -- UC_A_Tilde
      'A'                           &  -- UC_A_Diaeresis
      'A'                           &  -- UC_A_Ring
      'C'                           &  -- UC_C_Cedilla
      'E'                           &  -- UC_E_Grave
      'E'                           &  -- UC_E_Acute
      'E'                           &  -- UC_E_Circumflex
      'E'                           &  -- UC_E_Diaeresis
      'I'                           &  -- UC_I_Grave
      'I'                           &  -- UC_I_Acute
      'I'                           &  -- UC_I_Circumflex
      'I'                           &  -- UC_I_Diaeresis
      'N'                           &  -- UC_N_Tilde
      'O'                           &  -- UC_O_Grave
      'O'                           &  -- UC_O_Acute
      'O'                           &  -- UC_O_Circumflex
      'O'                           &  -- UC_O_Tilde
      'O'                           &  -- UC_O_Diaeresis
      'O'                           &  -- UC_O_Oblique_Stroke
      'U'                           &  -- UC_U_Grave
      'U'                           &  -- UC_U_Acute
      'U'                           &  -- UC_U_Circumflex
      'U'                           &  -- UC_U_Diaeresis
      'Y'                           &  -- UC_Y_Acute
      'a'                           &  -- LC_A_Grave
      'a'                           &  -- LC_A_Acute
      'a'                           &  -- LC_A_Circumflex
      'a'                           &  -- LC_A_Tilde
      'a'                           &  -- LC_A_Diaeresis
      'a'                           &  -- LC_A_Ring
      'c'                           &  -- LC_C_Cedilla
      'e'                           &  -- LC_E_Grave
      'e'                           &  -- LC_E_Acute
      'e'                           &  -- LC_E_Circumflex
      'e'                           &  -- LC_E_Diaeresis
      'i'                           &  -- LC_I_Grave
      'i'                           &  -- LC_I_Acute
      'i'                           &  -- LC_I_Circumflex
      'i'                           &  -- LC_I_Diaeresis
      'n'                           &  -- LC_N_Tilde
      'o'                           &  -- LC_O_Grave
      'o'                           &  -- LC_O_Acute
      'o'                           &  -- LC_O_Circumflex
      'o'                           &  -- LC_O_Tilde
      'o'                           &  -- LC_O_Diaeresis
      'o'                           &  -- LC_O_Oblique_Stroke
      'u'                           &  -- LC_U_Grave
      'u'                           &  -- LC_U_Acute
      'u'                           &  -- LC_U_Circumflex
      'u'                           &  -- LC_U_Diaeresis
      'y'                           &  -- LC_Y_Acute
      'y';                             -- LC_Y_Diaeresis

   Basic_Map : constant Wide_Character_Mapping :=
     Wide_Character_Mapping' (Basic_From'Access, Basic_To'Access);

end Ada.Strings.Wide_Maps.Wide_Constants;
