OSDN Git Service

2010-12-06 Jerry DeLisle <jvdelisle@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-stwiun.adb
index b421772..77e427f 100644 (file)
@@ -1,30 +1,28 @@
 ------------------------------------------------------------------------------
 --                                                                          --
---                         GNAT RUNTIME COMPONENTS                          --
+--                         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-2005 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2010, 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 2,  or (at your option) any later ver- --
+-- 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.  See the GNU General Public License --
--- for  more details.  You should have  received  a copy of the GNU General --
--- Public License  distributed with GNAT;  see file COPYING.  If not, write --
--- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
--- MA 02111-1307, USA.                                                      --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
 --                                                                          --
--- As a special exception,  if other files  instantiate  generics from this --
--- unit, or you link  this unit with other files  to produce an executable, --
--- this  unit  does not  by itself cause  the resulting  executable  to  be --
--- covered  by the  GNU  General  Public  License.  This exception does not --
--- however invalidate  any other reasons why  the executable file  might be --
--- covered by the  GNU Public License.                                      --
+-- 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.      --
@@ -39,16 +37,6 @@ package body Ada.Strings.Wide_Unbounded is
 
    use Ada.Finalization;
 
-   procedure Realloc_For_Chunk
-     (Source     : in out Unbounded_Wide_String;
-      Chunk_Size : Natural);
-   pragma Inline (Realloc_For_Chunk);
-   --  Adjust the size allocated for the string. Add at least Chunk_Size so it
-   --  is safe to add a string of this size at the end of the current
-   --  content. The real size allocated for the string is Chunk_Size + x %
-   --  of the current string size. This buffered handling makes the Append
-   --  unbounded wide string routines very fast.
-
    ---------
    -- "&" --
    ---------
@@ -142,7 +130,6 @@ package body Ada.Strings.Wide_Unbounded is
       Result.Reference (1) := Left;
       Result.Reference (2 .. Result.Last) :=
         Right.Reference (1 .. Right.Last);
-
       return Result;
    end "&";
 
@@ -157,7 +144,7 @@ package body Ada.Strings.Wide_Unbounded is
       Result : Unbounded_Wide_String;
 
    begin
-      Result.Last := Left;
+      Result.Last   := Left;
 
       Result.Reference := new Wide_String (1 .. Left);
       for J in Result.Reference'Range loop
@@ -195,7 +182,7 @@ package body Ada.Strings.Wide_Unbounded is
    is
       Len    : constant Natural := Right.Last;
       K      : Positive;
-      Result   : Unbounded_Wide_String;
+      Result : Unbounded_Wide_String;
 
    begin
       Result.Last := Left * Len;
@@ -203,7 +190,7 @@ package body Ada.Strings.Wide_Unbounded is
       Result.Reference := new Wide_String (1 .. Result.Last);
 
       K := 1;
-      for I in 1 .. Left loop
+      for J in 1 .. Left loop
          Result.Reference (K .. K + Len - 1) :=
            Right.Reference (1 .. Right.Last);
          K := K + Len;
@@ -363,10 +350,9 @@ package body Ada.Strings.Wide_Unbounded is
 
    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.
+      --  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 :=
@@ -417,13 +403,13 @@ package body Ada.Strings.Wide_Unbounded is
    function Count
      (Source  : Unbounded_Wide_String;
       Pattern : Wide_String;
-      Mapping : Wide_Maps.Wide_Character_Mapping :=
-                  Wide_Maps.Identity)
+      Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
       return Natural
    is
    begin
-      return Wide_Search.Count
-        (Source.Reference (1 .. Source.Last), Pattern, Mapping);
+      return
+        Wide_Search.Count
+          (Source.Reference (1 .. Source.Last), Pattern, Mapping);
    end Count;
 
    function Count
@@ -432,8 +418,9 @@ package body Ada.Strings.Wide_Unbounded is
       Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural
    is
    begin
-      return Wide_Search.Count
-        (Source.Reference (1 .. Source.Last), Pattern, Mapping);
+      return
+        Wide_Search.Count
+          (Source.Reference (1 .. Source.Last), Pattern, Mapping);
    end Count;
 
    function Count
@@ -441,7 +428,9 @@ package body Ada.Strings.Wide_Unbounded is
       Set    : Wide_Maps.Wide_Character_Set) return Natural
    is
    begin
-      return Wide_Search.Count (Source.Reference (1 .. Source.Last), Set);
+      return
+        Wide_Search.Count
+        (Source.Reference (1 .. Source.Last), Set);
    end Count;
 
    ------------
@@ -454,9 +443,10 @@ package body Ada.Strings.Wide_Unbounded is
       Through : Natural) return Unbounded_Wide_String
    is
    begin
-      return To_Unbounded_Wide_String
-        (Wide_Fixed.Delete
-           (Source.Reference (1 .. Source.Last), From, Through));
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Delete
+             (Source.Reference (1 .. Source.Last), From, Through));
    end Delete;
 
    procedure Delete
@@ -505,7 +495,7 @@ package body Ada.Strings.Wide_Unbounded is
 
    procedure Finalize (Object : in out Unbounded_Wide_String) is
       procedure Deallocate is
-        new Ada.Unchecked_Deallocation (Wide_String, Wide_String_Access);
+         new Ada.Unchecked_Deallocation (Wide_String, Wide_String_Access);
 
    begin
       --  Note: Don't try to free statically allocated null string
@@ -513,6 +503,7 @@ package body Ada.Strings.Wide_Unbounded is
       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;
 
@@ -523,6 +514,19 @@ package body Ada.Strings.Wide_Unbounded is
    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)
@@ -539,6 +543,7 @@ package body Ada.Strings.Wide_Unbounded is
    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
 
@@ -557,9 +562,8 @@ package body Ada.Strings.Wide_Unbounded is
       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));
+      return To_Unbounded_Wide_String
+        (Wide_Fixed.Head (Source.Reference (1 .. Source.Last), Count, Pad));
    end Head;
 
    procedure Head
@@ -568,10 +572,10 @@ package body Ada.Strings.Wide_Unbounded is
       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.Reference :=
+        new Wide_String'
+          (Wide_Fixed.Head (Source.Reference (1 .. Source.Last), Count, Pad));
       Source.Last := Source.Reference'Length;
       Free (Old);
    end Head;
@@ -584,12 +588,13 @@ package body Ada.Strings.Wide_Unbounded is
      (Source  : Unbounded_Wide_String;
       Pattern : Wide_String;
       Going   : Strings.Direction := Strings.Forward;
-      Mapping : Wide_Maps.Wide_Character_Mapping :=
-                        Wide_Maps.Identity) return Natural
+      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);
+      return
+        Wide_Search.Index
+          (Source.Reference (1 .. Source.Last), Pattern, Going, Mapping);
    end Index;
 
    function Index
@@ -599,8 +604,9 @@ package body Ada.Strings.Wide_Unbounded is
       Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural
    is
    begin
-      return Wide_Search.Index
-        (Source.Reference (1 .. Source.Last), Pattern, Going, Mapping);
+      return
+        Wide_Search.Index
+          (Source.Reference (1 .. Source.Last), Pattern, Going, Mapping);
    end Index;
 
    function Index
@@ -614,13 +620,65 @@ package body Ada.Strings.Wide_Unbounded is
         (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);
+      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;
 
    ----------------
@@ -643,9 +701,10 @@ package body Ada.Strings.Wide_Unbounded is
       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));
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Insert
+             (Source.Reference (1 .. Source.Last), Before, New_Item));
    end Insert;
 
    procedure Insert
@@ -658,7 +717,7 @@ package body Ada.Strings.Wide_Unbounded is
          raise Index_Error;
       end if;
 
-      Realloc_For_Chunk (Source, New_Item'Size);
+      Realloc_For_Chunk (Source, New_Item'Length);
 
       Source.Reference
         (Before +  New_Item'Length .. Source.Last + New_Item'Length) :=
@@ -687,9 +746,10 @@ package body Ada.Strings.Wide_Unbounded is
       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));
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Overwrite
+            (Source.Reference (1 .. Source.Last), Position, New_Item));
    end Overwrite;
 
    procedure Overwrite
@@ -698,15 +758,12 @@ package body Ada.Strings.Wide_Unbounded is
       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
@@ -725,18 +782,36 @@ package body Ada.Strings.Wide_Unbounded is
      (Source     : in out Unbounded_Wide_String;
       Chunk_Size : Natural)
    is
-      Growth_Factor : constant := 50;
-      S_Length      : constant Natural := Source.Reference'Length;
+      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
-            Alloc_Chunk_Size : constant Positive :=
-                                 Chunk_Size + (S_Length / Growth_Factor);
-            Tmp : Wide_String_Access;
+            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 := new Wide_String (1 .. S_Length + Alloc_Chunk_Size);
             Tmp (1 .. Source.Last) := Source.Reference (1 .. Source.Last);
             Free (Source.Reference);
             Source.Reference := Tmp;
@@ -772,20 +847,18 @@ package body Ada.Strings.Wide_Unbounded is
       By     : Wide_String) return Unbounded_Wide_String
    is
    begin
-      return
-        To_Unbounded_Wide_String
+      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)
+     (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
@@ -794,6 +867,20 @@ package body Ada.Strings.Wide_Unbounded is
       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 --
    -----------
@@ -808,7 +895,6 @@ package body Ada.Strings.Wide_Unbounded is
 
       if Low > Source.Last + 1 or else High > Source.Last then
          raise Index_Error;
-
       else
          return Source.Reference (Low .. High);
       end if;
@@ -821,8 +907,7 @@ package body Ada.Strings.Wide_Unbounded is
    function Tail
      (Source : Unbounded_Wide_String;
       Count  : Natural;
-      Pad    : Wide_Character := Wide_Space) return Unbounded_Wide_String
-   is
+      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));
@@ -834,7 +919,6 @@ package body Ada.Strings.Wide_Unbounded is
       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));
@@ -847,7 +931,8 @@ package body Ada.Strings.Wide_Unbounded is
    ------------------------------
 
    function To_Unbounded_Wide_String
-     (Source : Wide_String) return Unbounded_Wide_String
+     (Source : Wide_String)
+      return Unbounded_Wide_String
    is
       Result : Unbounded_Wide_String;
    begin
@@ -867,12 +952,13 @@ package body Ada.Strings.Wide_Unbounded is
       return Result;
    end To_Unbounded_Wide_String;
 
-   --------------------
+   -------------------
    -- To_Wide_String --
    --------------------
 
    function To_Wide_String
-     (Source : Unbounded_Wide_String) return Wide_String
+     (Source : Unbounded_Wide_String)
+      return Wide_String
    is
    begin
       return Source.Reference (1 .. Source.Last);
@@ -884,11 +970,14 @@ package body Ada.Strings.Wide_Unbounded is
 
    function Translate
      (Source  : Unbounded_Wide_String;
-      Mapping : Wide_Maps.Wide_Character_Mapping) return 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));
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Translate
+             (Source.Reference (1 .. Source.Last), Mapping));
    end Translate;
 
    procedure Translate
@@ -905,8 +994,10 @@ package body Ada.Strings.Wide_Unbounded is
       return Unbounded_Wide_String
    is
    begin
-      return To_Unbounded_Wide_String
-        (Wide_Fixed.Translate (Source.Reference (1 .. Source.Last), Mapping));
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Translate
+            (Source.Reference (1 .. Source.Last), Mapping));
    end Translate;
 
    procedure Translate
@@ -926,8 +1017,9 @@ package body Ada.Strings.Wide_Unbounded is
       Side   : Trim_End) return Unbounded_Wide_String
    is
    begin
-      return To_Unbounded_Wide_String
-        (Wide_Fixed.Trim (Source.Reference (1 .. Source.Last), Side));
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Trim (Source.Reference (1 .. Source.Last), Side));
    end Trim;
 
    procedure Trim
@@ -936,8 +1028,9 @@ package body Ada.Strings.Wide_Unbounded is
    is
       Old : Wide_String_Access := Source.Reference;
    begin
-      Source.Reference := new Wide_String'
-        (Wide_Fixed.Trim (Source.Reference (1 .. Source.Last), Side));
+      Source.Reference :=
+        new Wide_String'
+          (Wide_Fixed.Trim (Source.Reference (1 .. Source.Last), Side));
       Source.Last      := Source.Reference'Length;
       Free (Old);
    end Trim;
@@ -945,11 +1038,14 @@ package body Ada.Strings.Wide_Unbounded is
    function Trim
      (Source : Unbounded_Wide_String;
       Left   : Wide_Maps.Wide_Character_Set;
-      Right  : Wide_Maps.Wide_Character_Set) return Unbounded_Wide_String
+      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));
+      return
+        To_Unbounded_Wide_String
+          (Wide_Fixed.Trim
+             (Source.Reference (1 .. Source.Last), Left, Right));
    end Trim;
 
    procedure Trim
@@ -958,12 +1054,45 @@ package body Ada.Strings.Wide_Unbounded is
       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.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;