------------------------------------------------------------------------------
--                                                                          --
--                         GNAT RUNTIME COMPONENTS                          --
--                                                                          --
--               ADA.WIDE_WIDE_TEXT_IO.WIDE_WIDE_UNBOUNDED_IO               --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
-- 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. --
--                                                                          --
------------------------------------------------------------------------------

--  Note: historically GNAT provided these subprograms as a child of the
--  package Ada.Strings.Wide_Wide_Unbounded. So we implement this new Ada 2005
--  package by renaming the subprograms in that child. This is a more
--  straightforward implementation anyway, since we need access to the
--  internal representation of Unbounded_Wide_Wide_String.


with Ada.Strings.Wide_Wide_Unbounded;
with Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO;

package Ada.Wide_Wide_Text_IO.Wide_Wide_Unbounded_IO is

   procedure Put
     (File : File_Type;
      Item : Strings.Wide_Wide_Unbounded.Unbounded_Wide_Wide_String)
   renames Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO.Put;

   procedure Put
     (Item : Strings.Wide_Wide_Unbounded.Unbounded_Wide_Wide_String)
   renames Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO.Put;

   procedure Put_Line
     (File : Wide_Wide_Text_IO.File_Type;
      Item : Strings.Wide_Wide_Unbounded.Unbounded_Wide_Wide_String)
   renames Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO.Put_Line;

   procedure Put_Line
     (Item : Strings.Wide_Wide_Unbounded.Unbounded_Wide_Wide_String)
   renames Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO.Put_Line;

   function Get_Line
     (File : File_Type)
      return Strings.Wide_Wide_Unbounded.Unbounded_Wide_Wide_String
   renames Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO.Get_Line;

   function Get_Line
     return Strings.Wide_Wide_Unbounded.Unbounded_Wide_Wide_String
   renames Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO.Get_Line;

   procedure Get_Line
      (File : File_Type;
       Item : out Strings.Wide_Wide_Unbounded.Unbounded_Wide_Wide_String)
   renames Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO.Get_Line;

   procedure Get_Line
     (Item : out Strings.Wide_Wide_Unbounded.Unbounded_Wide_Wide_String)
   renames Ada.Strings.Wide_Wide_Unbounded.Wide_Wide_Text_IO.Get_Line;

end Ada.Wide_Wide_Text_IO.Wide_Wide_Unbounded_IO;
