diff gcc/ada/libgnat/a-stwiun.adb @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcc/ada/libgnat/a-stwiun.adb	Fri Oct 27 22:46:09 2017 +0900
@@ -0,0 +1,1095 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                         GNAT RUN-TIME COMPONENTS                         --
+--                                                                          --
+--           A D A . S T R I N G S . W I D E _ U N B O U N D E D            --
+--                                                                          --
+--                                 B o d y                                  --
+--                                                                          --
+--          Copyright (C) 1992-2017, Free Software Foundation, Inc.         --
+--                                                                          --
+-- 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.Strings.Wide_Fixed;
+with Ada.Strings.Wide_Search;
+with Ada.Unchecked_Deallocation;
+
+package body Ada.Strings.Wide_Unbounded is
+
+   ---------
+   -- "&" --
+   ---------
+
+   function "&"
+     (Left  : Unbounded_Wide_String;
+      Right : Unbounded_Wide_String) return Unbounded_Wide_String
+   is
+      L_Length : constant Natural := Left.Last;
+      R_Length : constant Natural := Right.Last;
+      Result   : Unbounded_Wide_String;
+
+   begin
+      Result.Last := L_Length + R_Length;
+
+      Result.Reference := new Wide_String (1 .. Result.Last);
+
+      Result.Reference (1 .. L_Length) :=
+        Left.Reference (1 .. Left.Last);
+      Result.Reference (L_Length + 1 .. Result.Last) :=
+        Right.Reference (1 .. Right.Last);
+
+      return Result;
+   end "&";
+
+   function "&"
+     (Left  : Unbounded_Wide_String;
+      Right : Wide_String) return Unbounded_Wide_String
+   is
+      L_Length : constant Natural := Left.Last;
+      Result   : Unbounded_Wide_String;
+
+   begin
+      Result.Last := L_Length + Right'Length;
+
+      Result.Reference := new Wide_String (1 .. Result.Last);
+
+      Result.Reference (1 .. L_Length) := Left.Reference (1 .. Left.Last);
+      Result.Reference (L_Length + 1 .. Result.Last) := Right;
+
+      return Result;
+   end "&";
+
+   function "&"
+     (Left  : Wide_String;
+      Right : Unbounded_Wide_String) return Unbounded_Wide_String
+   is
+      R_Length : constant Natural := Right.Last;
+      Result   : Unbounded_Wide_String;
+
+   begin
+      Result.Last := Left'Length + R_Length;
+
+      Result.Reference := new Wide_String (1 .. Result.Last);
+
+      Result.Reference (1 .. Left'Length) := Left;
+      Result.Reference (Left'Length + 1 .. Result.Last) :=
+        Right.Reference (1 .. Right.Last);
+
+      return Result;
+   end "&";
+
+   function "&"
+     (Left  : Unbounded_Wide_String;
+      Right : Wide_Character) return Unbounded_Wide_String
+   is
+      Result : Unbounded_Wide_String;
+
+   begin
+      Result.Last := Left.Last + 1;
+
+      Result.Reference := new Wide_String (1 .. Result.Last);
+
+      Result.Reference (1 .. Result.Last - 1) :=
+        Left.Reference (1 .. Left.Last);
+      Result.Reference (Result.Last) := Right;
+
+      return Result;
+   end "&";
+
+   function "&"
+     (Left  : Wide_Character;
+      Right : Unbounded_Wide_String) return Unbounded_Wide_String
+   is
+      Result : Unbounded_Wide_String;
+
+   begin
+      Result.Last := Right.Last + 1;
+
+      Result.Reference := new Wide_String (1 .. Result.Last);
+      Result.Reference (1) := Left;
+      Result.Reference (2 .. Result.Last) :=
+        Right.Reference (1 .. Right.Last);
+      return Result;
+   end "&";
+
+   ---------
+   -- "*" --
+   ---------
+
+   function "*"
+     (Left  : Natural;
+      Right : Wide_Character) return Unbounded_Wide_String
+   is
+      Result : Unbounded_Wide_String;
+
+   begin
+      Result.Last   := Left;
+
+      Result.Reference := new Wide_String (1 .. Left);
+      for J in Result.Reference'Range loop
+         Result.Reference (J) := Right;
+      end loop;
+
+      return Result;
+   end "*";
+
+   function "*"
+     (Left  : Natural;
+      Right : Wide_String) return Unbounded_Wide_String
+   is
+      Len    : constant Natural := Right'Length;
+      K      : Positive;
+      Result : Unbounded_Wide_String;
+
+   begin
+      Result.Last := Left * Len;
+
+      Result.Reference := new Wide_String (1 .. Result.Last);
+
+      K := 1;
+      for J in 1 .. Left loop
+         Result.Reference (K .. K + Len - 1) := Right;
+         K := K + Len;
+      end loop;
+
+      return Result;
+   end "*";
+
+   function "*"
+     (Left  : Natural;
+      Right : Unbounded_Wide_String) return Unbounded_Wide_String
+   is
+      Len    : constant Natural := Right.Last;
+      K      : Positive;
+      Result : Unbounded_Wide_String;
+
+   begin
+      Result.Last := Left * Len;
+
+      Result.Reference := new Wide_String (1 .. Result.Last);
+
+      K := 1;
+      for J in 1 .. Left loop
+         Result.Reference (K .. K + Len - 1) :=
+           Right.Reference (1 .. Right.Last);
+         K := K + Len;
+      end loop;
+
+      return Result;
+   end "*";
+
+   ---------
+   -- "<" --
+   ---------
+
+   function "<"
+     (Left  : Unbounded_Wide_String;
+      Right : Unbounded_Wide_String) return Boolean
+   is
+   begin
+      return
+        Left.Reference (1 .. Left.Last) < Right.Reference (1 .. Right.Last);
+   end "<";
+
+   function "<"
+     (Left  : Unbounded_Wide_String;
+      Right : Wide_String) return Boolean
+   is
+   begin
+      return Left.Reference (1 .. Left.Last) < Right;
+   end "<";
+
+   function "<"
+     (Left  : Wide_String;
+      Right : Unbounded_Wide_String) return Boolean
+   is
+   begin
+      return Left < Right.Reference (1 .. Right.Last);
+   end "<";
+
+   ----------
+   -- "<=" --
+   ----------
+
+   function "<="
+     (Left  : Unbounded_Wide_String;
+      Right : Unbounded_Wide_String) return Boolean
+   is
+   begin
+      return
+        Left.Reference (1 .. Left.Last) <= Right.Reference (1 .. Right.Last);
+   end "<=";
+
+   function "<="
+     (Left  : Unbounded_Wide_String;
+      Right : Wide_String) return Boolean
+   is
+   begin
+      return Left.Reference (1 .. Left.Last) <= Right;
+   end "<=";
+
+   function "<="
+     (Left  : Wide_String;
+      Right : Unbounded_Wide_String) return Boolean
+   is
+   begin
+      return Left <= Right.Reference (1 .. Right.Last);
+   end "<=";
+
+   ---------
+   -- "=" --
+   ---------
+
+   function "="
+     (Left  : Unbounded_Wide_String;
+      Right : Unbounded_Wide_String) return Boolean
+   is
+   begin
+      return
+        Left.Reference (1 .. Left.Last) = Right.Reference (1 .. Right.Last);
+   end "=";
+
+   function "="
+     (Left  : Unbounded_Wide_String;
+      Right : Wide_String) return Boolean
+   is
+   begin
+      return Left.Reference (1 .. Left.Last) = Right;
+   end "=";
+
+   function "="
+     (Left  : Wide_String;
+      Right : Unbounded_Wide_String) return Boolean
+   is
+   begin
+      return Left = Right.Reference (1 .. Right.Last);
+   end "=";
+
+   ---------
+   -- ">" --
+   ---------
+
+   function ">"
+     (Left  : Unbounded_Wide_String;
+      Right : Unbounded_Wide_String) return Boolean
+   is
+   begin
+      return
+        Left.Reference (1 .. Left.Last) > Right.Reference (1 .. Right.Last);
+   end ">";
+
+   function ">"
+     (Left  : Unbounded_Wide_String;
+      Right : Wide_String) return Boolean
+   is
+   begin
+      return Left.Reference (1 .. Left.Last) > Right;
+   end ">";
+
+   function ">"
+     (Left  : Wide_String;
+      Right : Unbounded_Wide_String) return Boolean
+   is
+   begin
+      return Left > Right.Reference (1 .. Right.Last);
+   end ">";
+
+   ----------
+   -- ">=" --
+   ----------
+
+   function ">="
+     (Left  : Unbounded_Wide_String;
+      Right : Unbounded_Wide_String) return Boolean
+   is
+   begin
+      return
+        Left.Reference (1 .. Left.Last) >= Right.Reference (1 .. Right.Last);
+   end ">=";
+
+   function ">="
+     (Left  : Unbounded_Wide_String;
+      Right : Wide_String) return Boolean
+   is
+   begin
+      return Left.Reference (1 .. Left.Last) >= Right;
+   end ">=";
+
+   function ">="
+     (Left  : Wide_String;
+      Right : Unbounded_Wide_String) return Boolean
+   is
+   begin
+      return Left >= Right.Reference (1 .. Right.Last);
+   end ">=";
+
+   ------------
+   -- Adjust --
+   ------------
+
+   procedure Adjust (Object : in out Unbounded_Wide_String) is
+   begin
+      --  Copy string, except we do not copy the statically allocated null
+      --  string, since it can never be deallocated. Note that we do not copy
+      --  extra string room here to avoid dragging unused allocated memory.
+
+      if Object.Reference /= Null_Wide_String'Access then
+         Object.Reference :=
+           new Wide_String'(Object.Reference (1 .. Object.Last));
+      end if;
+   end Adjust;
+
+   ------------
+   -- Append --
+   ------------
+
+   procedure Append
+     (Source   : in out Unbounded_Wide_String;
+      New_Item : Unbounded_Wide_String)
+   is
+   begin
+      Realloc_For_Chunk (Source, New_Item.Last);
+      Source.Reference (Source.Last + 1 .. Source.Last + New_Item.Last) :=
+        New_Item.Reference (1 .. New_Item.Last);
+      Source.Last := Source.Last + New_Item.Last;
+   end Append;
+
+   procedure Append
+     (Source   : in out Unbounded_Wide_String;
+      New_Item : Wide_String)
+   is
+   begin
+      Realloc_For_Chunk (Source, New_Item'Length);
+      Source.Reference (Source.Last + 1 .. Source.Last + New_Item'Length) :=
+        New_Item;
+      Source.Last := Source.Last + New_Item'Length;
+   end Append;
+
+   procedure Append
+     (Source   : in out Unbounded_Wide_String;
+      New_Item : Wide_Character)
+   is
+   begin
+      Realloc_For_Chunk (Source, 1);
+      Source.Reference (Source.Last + 1) := New_Item;
+      Source.Last := Source.Last + 1;
+   end Append;
+
+   -----------
+   -- Count --
+   -----------
+
+   function Count
+     (Source  : Unbounded_Wide_String;
+      Pattern : Wide_String;
+      Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
+      return Natural
+   is
+   begin
+      return
+        Wide_Search.Count
+          (Source.Reference (1 .. Source.Last), Pattern, Mapping);
+   end Count;
+
+   function Count
+     (Source  : Unbounded_Wide_String;
+      Pattern : Wide_String;
+      Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural
+   is
+   begin
+      return
+        Wide_Search.Count
+          (Source.Reference (1 .. Source.Last), Pattern, Mapping);
+   end Count;
+
+   function Count
+     (Source : Unbounded_Wide_String;
+      Set    : Wide_Maps.Wide_Character_Set) return Natural
+   is
+   begin
+      return
+        Wide_Search.Count
+        (Source.Reference (1 .. Source.Last), Set);
+   end Count;
+
+   ------------
+   -- Delete --
+   ------------
+
+   function Delete
+     (Source  : Unbounded_Wide_String;
+      From    : Positive;
+      Through : Natural) return Unbounded_Wide_String
+   is
+   begin
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Delete
+             (Source.Reference (1 .. Source.Last), From, Through));
+   end Delete;
+
+   procedure Delete
+     (Source  : in out Unbounded_Wide_String;
+      From    : Positive;
+      Through : Natural)
+   is
+   begin
+      if From > Through then
+         null;
+
+      elsif From < Source.Reference'First or else Through > Source.Last then
+         raise Index_Error;
+
+      else
+         declare
+            Len : constant Natural := Through - From + 1;
+
+         begin
+            Source.Reference (From .. Source.Last - Len) :=
+              Source.Reference (Through + 1 .. Source.Last);
+            Source.Last := Source.Last - Len;
+         end;
+      end if;
+   end Delete;
+
+   -------------
+   -- Element --
+   -------------
+
+   function Element
+     (Source : Unbounded_Wide_String;
+      Index  : Positive) return Wide_Character
+   is
+   begin
+      if Index <= Source.Last then
+         return Source.Reference (Index);
+      else
+         raise Strings.Index_Error;
+      end if;
+   end Element;
+
+   --------------
+   -- Finalize --
+   --------------
+
+   procedure Finalize (Object : in out Unbounded_Wide_String) is
+      procedure Deallocate is
+         new Ada.Unchecked_Deallocation (Wide_String, Wide_String_Access);
+
+   begin
+      --  Note: Don't try to free statically allocated null string
+
+      if Object.Reference /= Null_Wide_String'Access then
+         Deallocate (Object.Reference);
+         Object.Reference := Null_Unbounded_Wide_String.Reference;
+         Object.Last := 0;
+      end if;
+   end Finalize;
+
+   ----------------
+   -- Find_Token --
+   ----------------
+
+   procedure Find_Token
+     (Source : Unbounded_Wide_String;
+      Set    : Wide_Maps.Wide_Character_Set;
+      From   : Positive;
+      Test   : Strings.Membership;
+      First  : out Positive;
+      Last   : out Natural)
+   is
+   begin
+      Wide_Search.Find_Token
+        (Source.Reference (From .. Source.Last), Set, Test, First, Last);
+   end Find_Token;
+
+   procedure Find_Token
+     (Source : Unbounded_Wide_String;
+      Set    : Wide_Maps.Wide_Character_Set;
+      Test   : Strings.Membership;
+      First  : out Positive;
+      Last   : out Natural)
+   is
+   begin
+      Wide_Search.Find_Token
+        (Source.Reference (1 .. Source.Last), Set, Test, First, Last);
+   end Find_Token;
+
+   ----------
+   -- Free --
+   ----------
+
+   procedure Free (X : in out Wide_String_Access) is
+      procedure Deallocate is
+         new Ada.Unchecked_Deallocation (Wide_String, Wide_String_Access);
+
+   begin
+      --  Note: Do not try to free statically allocated null string
+
+      if X /= Null_Unbounded_Wide_String.Reference then
+         Deallocate (X);
+      end if;
+   end Free;
+
+   ----------
+   -- Head --
+   ----------
+
+   function Head
+     (Source : Unbounded_Wide_String;
+      Count  : Natural;
+      Pad    : Wide_Character := Wide_Space) return Unbounded_Wide_String
+   is
+   begin
+      return To_Unbounded_Wide_String
+        (Wide_Fixed.Head (Source.Reference (1 .. Source.Last), Count, Pad));
+   end Head;
+
+   procedure Head
+     (Source : in out Unbounded_Wide_String;
+      Count  : Natural;
+      Pad    : Wide_Character := Wide_Space)
+   is
+      Old : Wide_String_Access := Source.Reference;
+   begin
+      Source.Reference :=
+        new Wide_String'
+          (Wide_Fixed.Head (Source.Reference (1 .. Source.Last), Count, Pad));
+      Source.Last := Source.Reference'Length;
+      Free (Old);
+   end Head;
+
+   -----------
+   -- Index --
+   -----------
+
+   function Index
+     (Source  : Unbounded_Wide_String;
+      Pattern : Wide_String;
+      Going   : Strings.Direction := Strings.Forward;
+      Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
+      return Natural
+   is
+   begin
+      return
+        Wide_Search.Index
+          (Source.Reference (1 .. Source.Last), Pattern, Going, Mapping);
+   end Index;
+
+   function Index
+     (Source  : Unbounded_Wide_String;
+      Pattern : Wide_String;
+      Going   : Direction := Forward;
+      Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural
+   is
+   begin
+      return
+        Wide_Search.Index
+          (Source.Reference (1 .. Source.Last), Pattern, Going, Mapping);
+   end Index;
+
+   function Index
+     (Source : Unbounded_Wide_String;
+      Set    : Wide_Maps.Wide_Character_Set;
+      Test   : Strings.Membership := Strings.Inside;
+      Going  : Strings.Direction  := Strings.Forward) return Natural
+   is
+   begin
+      return Wide_Search.Index
+        (Source.Reference (1 .. Source.Last), Set, Test, Going);
+   end Index;
+
+   function Index
+     (Source  : Unbounded_Wide_String;
+      Pattern : Wide_String;
+      From    : Positive;
+      Going   : Direction := Forward;
+      Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
+      return Natural
+   is
+   begin
+      return
+        Wide_Search.Index
+          (Source.Reference (1 .. Source.Last), Pattern, From, Going, Mapping);
+   end Index;
+
+   function Index
+     (Source  : Unbounded_Wide_String;
+      Pattern : Wide_String;
+      From    : Positive;
+      Going   : Direction := Forward;
+      Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural
+   is
+   begin
+      return
+        Wide_Search.Index
+          (Source.Reference (1 .. Source.Last), Pattern, From, Going, Mapping);
+   end Index;
+
+   function Index
+     (Source  : Unbounded_Wide_String;
+      Set     : Wide_Maps.Wide_Character_Set;
+      From    : Positive;
+      Test    : Membership := Inside;
+      Going   : Direction := Forward) return Natural
+   is
+   begin
+      return
+        Wide_Search.Index
+          (Source.Reference (1 .. Source.Last), Set, From, Test, Going);
+   end Index;
+
+   function Index_Non_Blank
+     (Source : Unbounded_Wide_String;
+      Going  : Strings.Direction := Strings.Forward) return Natural
+   is
+   begin
+      return
+        Wide_Search.Index_Non_Blank
+          (Source.Reference (1 .. Source.Last), Going);
+   end Index_Non_Blank;
+
+   function Index_Non_Blank
+     (Source : Unbounded_Wide_String;
+      From   : Positive;
+      Going  : Direction := Forward) return Natural
+   is
+   begin
+      return
+        Wide_Search.Index_Non_Blank
+          (Source.Reference (1 .. Source.Last), From, Going);
+   end Index_Non_Blank;
+
+   ----------------
+   -- Initialize --
+   ----------------
+
+   procedure Initialize (Object : in out Unbounded_Wide_String) is
+   begin
+      Object.Reference := Null_Unbounded_Wide_String.Reference;
+      Object.Last      := 0;
+   end Initialize;
+
+   ------------
+   -- Insert --
+   ------------
+
+   function Insert
+     (Source   : Unbounded_Wide_String;
+      Before   : Positive;
+      New_Item : Wide_String) return Unbounded_Wide_String
+   is
+   begin
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Insert
+             (Source.Reference (1 .. Source.Last), Before, New_Item));
+   end Insert;
+
+   procedure Insert
+     (Source   : in out Unbounded_Wide_String;
+      Before   : Positive;
+      New_Item : Wide_String)
+   is
+   begin
+      if Before not in Source.Reference'First .. Source.Last + 1 then
+         raise Index_Error;
+      end if;
+
+      Realloc_For_Chunk (Source, New_Item'Length);
+
+      Source.Reference
+        (Before +  New_Item'Length .. Source.Last + New_Item'Length) :=
+           Source.Reference (Before .. Source.Last);
+
+      Source.Reference (Before .. Before + New_Item'Length - 1) := New_Item;
+      Source.Last := Source.Last + New_Item'Length;
+   end Insert;
+
+   ------------
+   -- Length --
+   ------------
+
+   function Length (Source : Unbounded_Wide_String) return Natural is
+   begin
+      return Source.Last;
+   end Length;
+
+   ---------------
+   -- Overwrite --
+   ---------------
+
+   function Overwrite
+     (Source   : Unbounded_Wide_String;
+      Position : Positive;
+      New_Item : Wide_String) return Unbounded_Wide_String
+   is
+   begin
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Overwrite
+            (Source.Reference (1 .. Source.Last), Position, New_Item));
+   end Overwrite;
+
+   procedure Overwrite
+     (Source    : in out Unbounded_Wide_String;
+      Position  : Positive;
+      New_Item  : Wide_String)
+   is
+      NL : constant Natural := New_Item'Length;
+   begin
+      if Position <= Source.Last - NL + 1 then
+         Source.Reference (Position .. Position + NL - 1) := New_Item;
+      else
+         declare
+            Old : Wide_String_Access := Source.Reference;
+         begin
+            Source.Reference := new Wide_String'
+              (Wide_Fixed.Overwrite
+                (Source.Reference (1 .. Source.Last), Position, New_Item));
+            Source.Last := Source.Reference'Length;
+            Free (Old);
+         end;
+      end if;
+   end Overwrite;
+
+   -----------------------
+   -- Realloc_For_Chunk --
+   -----------------------
+
+   procedure Realloc_For_Chunk
+     (Source     : in out Unbounded_Wide_String;
+      Chunk_Size : Natural)
+   is
+      Growth_Factor : constant := 32;
+      --  The growth factor controls how much extra space is allocated when
+      --  we have to increase the size of an allocated unbounded string. By
+      --  allocating extra space, we avoid the need to reallocate on every
+      --  append, particularly important when a string is built up by repeated
+      --  append operations of small pieces. This is expressed as a factor so
+      --  32 means add 1/32 of the length of the string as growth space.
+
+      Min_Mul_Alloc : constant := Standard'Maximum_Alignment;
+      --  Allocation will be done by a multiple of Min_Mul_Alloc This causes
+      --  no memory loss as most (all?) malloc implementations are obliged to
+      --  align the returned memory on the maximum alignment as malloc does not
+      --  know the target alignment.
+
+      S_Length : constant Natural := Source.Reference'Length;
+
+   begin
+      if Chunk_Size > S_Length - Source.Last then
+         declare
+            New_Size : constant Positive :=
+              S_Length + Chunk_Size + (S_Length / Growth_Factor);
+
+            New_Rounded_Up_Size : constant Positive :=
+              ((New_Size - 1) / Min_Mul_Alloc + 1) * Min_Mul_Alloc;
+
+            Tmp : constant Wide_String_Access :=
+              new Wide_String (1 .. New_Rounded_Up_Size);
+
+         begin
+            Tmp (1 .. Source.Last) := Source.Reference (1 .. Source.Last);
+            Free (Source.Reference);
+            Source.Reference := Tmp;
+         end;
+      end if;
+   end Realloc_For_Chunk;
+
+   ---------------------
+   -- Replace_Element --
+   ---------------------
+
+   procedure Replace_Element
+     (Source : in out Unbounded_Wide_String;
+      Index  : Positive;
+      By     : Wide_Character)
+   is
+   begin
+      if Index <= Source.Last then
+         Source.Reference (Index) := By;
+      else
+         raise Strings.Index_Error;
+      end if;
+   end Replace_Element;
+
+   -------------------
+   -- Replace_Slice --
+   -------------------
+
+   function Replace_Slice
+     (Source : Unbounded_Wide_String;
+      Low    : Positive;
+      High   : Natural;
+      By     : Wide_String) return Unbounded_Wide_String
+   is
+   begin
+      return To_Unbounded_Wide_String
+        (Wide_Fixed.Replace_Slice
+           (Source.Reference (1 .. Source.Last), Low, High, By));
+   end Replace_Slice;
+
+   procedure Replace_Slice
+     (Source : in out Unbounded_Wide_String;
+      Low    : Positive;
+      High   : Natural;
+      By     : Wide_String)
+   is
+      Old : Wide_String_Access := Source.Reference;
+   begin
+      Source.Reference := new Wide_String'
+        (Wide_Fixed.Replace_Slice
+           (Source.Reference (1 .. Source.Last), Low, High, By));
+      Source.Last := Source.Reference'Length;
+      Free (Old);
+   end Replace_Slice;
+
+   -------------------------------
+   -- Set_Unbounded_Wide_String --
+   -------------------------------
+
+   procedure Set_Unbounded_Wide_String
+     (Target : out Unbounded_Wide_String;
+      Source : Wide_String)
+   is
+   begin
+      Target.Last          := Source'Length;
+      Target.Reference     := new Wide_String (1 .. Source'Length);
+      Target.Reference.all := Source;
+   end Set_Unbounded_Wide_String;
+
+   -----------
+   -- Slice --
+   -----------
+
+   function Slice
+     (Source : Unbounded_Wide_String;
+      Low    : Positive;
+      High   : Natural) return Wide_String
+   is
+   begin
+      --  Note: test of High > Length is in accordance with AI95-00128
+
+      if Low > Source.Last + 1 or else High > Source.Last then
+         raise Index_Error;
+      else
+         return Source.Reference (Low .. High);
+      end if;
+   end Slice;
+
+   ----------
+   -- Tail --
+   ----------
+
+   function Tail
+     (Source : Unbounded_Wide_String;
+      Count  : Natural;
+      Pad    : Wide_Character := Wide_Space) return Unbounded_Wide_String is
+   begin
+      return To_Unbounded_Wide_String
+        (Wide_Fixed.Tail (Source.Reference (1 .. Source.Last), Count, Pad));
+   end Tail;
+
+   procedure Tail
+     (Source : in out Unbounded_Wide_String;
+      Count  : Natural;
+      Pad    : Wide_Character := Wide_Space)
+   is
+      Old : Wide_String_Access := Source.Reference;
+   begin
+      Source.Reference := new Wide_String'
+        (Wide_Fixed.Tail (Source.Reference (1 .. Source.Last), Count, Pad));
+      Source.Last := Source.Reference'Length;
+      Free (Old);
+   end Tail;
+
+   ------------------------------
+   -- To_Unbounded_Wide_String --
+   ------------------------------
+
+   function To_Unbounded_Wide_String
+     (Source : Wide_String)
+      return Unbounded_Wide_String
+   is
+      Result : Unbounded_Wide_String;
+   begin
+      Result.Last          := Source'Length;
+      Result.Reference     := new Wide_String (1 .. Source'Length);
+      Result.Reference.all := Source;
+      return Result;
+   end To_Unbounded_Wide_String;
+
+   function To_Unbounded_Wide_String
+     (Length : Natural) return Unbounded_Wide_String
+   is
+      Result : Unbounded_Wide_String;
+   begin
+      Result.Last      := Length;
+      Result.Reference := new Wide_String (1 .. Length);
+      return Result;
+   end To_Unbounded_Wide_String;
+
+   -------------------
+   -- To_Wide_String --
+   --------------------
+
+   function To_Wide_String
+     (Source : Unbounded_Wide_String)
+      return Wide_String
+   is
+   begin
+      return Source.Reference (1 .. Source.Last);
+   end To_Wide_String;
+
+   ---------------
+   -- Translate --
+   ---------------
+
+   function Translate
+     (Source  : Unbounded_Wide_String;
+      Mapping : Wide_Maps.Wide_Character_Mapping)
+      return Unbounded_Wide_String
+   is
+   begin
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Translate
+             (Source.Reference (1 .. Source.Last), Mapping));
+   end Translate;
+
+   procedure Translate
+     (Source  : in out Unbounded_Wide_String;
+      Mapping : Wide_Maps.Wide_Character_Mapping)
+   is
+   begin
+      Wide_Fixed.Translate (Source.Reference (1 .. Source.Last), Mapping);
+   end Translate;
+
+   function Translate
+     (Source  : Unbounded_Wide_String;
+      Mapping : Wide_Maps.Wide_Character_Mapping_Function)
+      return Unbounded_Wide_String
+   is
+   begin
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Translate
+            (Source.Reference (1 .. Source.Last), Mapping));
+   end Translate;
+
+   procedure Translate
+     (Source  : in out Unbounded_Wide_String;
+      Mapping : Wide_Maps.Wide_Character_Mapping_Function)
+   is
+   begin
+      Wide_Fixed.Translate (Source.Reference (1 .. Source.Last), Mapping);
+   end Translate;
+
+   ----------
+   -- Trim --
+   ----------
+
+   function Trim
+     (Source : Unbounded_Wide_String;
+      Side   : Trim_End) return Unbounded_Wide_String
+   is
+   begin
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Trim (Source.Reference (1 .. Source.Last), Side));
+   end Trim;
+
+   procedure Trim
+     (Source : in out Unbounded_Wide_String;
+      Side   : Trim_End)
+   is
+      Old : Wide_String_Access := Source.Reference;
+   begin
+      Source.Reference :=
+        new Wide_String'
+          (Wide_Fixed.Trim (Source.Reference (1 .. Source.Last), Side));
+      Source.Last      := Source.Reference'Length;
+      Free (Old);
+   end Trim;
+
+   function Trim
+     (Source : Unbounded_Wide_String;
+      Left   : Wide_Maps.Wide_Character_Set;
+      Right  : Wide_Maps.Wide_Character_Set)
+      return Unbounded_Wide_String
+   is
+   begin
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Trim
+             (Source.Reference (1 .. Source.Last), Left, Right));
+   end Trim;
+
+   procedure Trim
+     (Source : in out Unbounded_Wide_String;
+      Left   : Wide_Maps.Wide_Character_Set;
+      Right  : Wide_Maps.Wide_Character_Set)
+   is
+      Old : Wide_String_Access := Source.Reference;
+   begin
+      Source.Reference :=
+        new Wide_String'
+          (Wide_Fixed.Trim
+             (Source.Reference (1 .. Source.Last), Left, Right));
+      Source.Last      := Source.Reference'Length;
+      Free (Old);
+   end Trim;
+
+   ---------------------
+   -- Unbounded_Slice --
+   ---------------------
+
+   function Unbounded_Slice
+     (Source : Unbounded_Wide_String;
+      Low    : Positive;
+      High   : Natural) return Unbounded_Wide_String
+   is
+   begin
+      if Low > Source.Last + 1 or else High > Source.Last then
+         raise Index_Error;
+      else
+         return To_Unbounded_Wide_String (Source.Reference.all (Low .. High));
+      end if;
+   end Unbounded_Slice;
+
+   procedure Unbounded_Slice
+     (Source : Unbounded_Wide_String;
+      Target : out Unbounded_Wide_String;
+      Low    : Positive;
+      High   : Natural)
+   is
+   begin
+      if Low > Source.Last + 1 or else High > Source.Last then
+         raise Index_Error;
+      else
+         Target :=
+           To_Unbounded_Wide_String (Source.Reference.all (Low .. High));
+      end if;
+   end Unbounded_Slice;
+
+end Ada.Strings.Wide_Unbounded;