1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT RUN-TIME COMPONENTS                         --
4--                                                                          --
5--           A D A . S T R I N G S . W I D E _ U N B O U N D E D            --
6--                                                                          --
7--                                 S p e c                                  --
8--                                                                          --
9--          Copyright (C) 1992-2010, Free Software Foundation, Inc.         --
10--                                                                          --
11-- This specification is derived from the Ada Reference Manual for use with --
12-- GNAT. The copyright notice above, and the license provisions that follow --
13-- apply solely to the  contents of the part following the private keyword. --
14--                                                                          --
15-- GNAT is free software;  you can  redistribute it  and/or modify it under --
16-- terms of the  GNU General Public License as published  by the Free Soft- --
17-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
18-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
19-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
20-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
21--                                                                          --
22-- As a special exception under Section 7 of GPL version 3, you are granted --
23-- additional permissions described in the GCC Runtime Library Exception,   --
24-- version 3.1, as published by the Free Software Foundation.               --
25--                                                                          --
26-- You should have received a copy of the GNU General Public License and    --
27-- a copy of the GCC Runtime Library Exception along with this program;     --
28-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
29-- <http://www.gnu.org/licenses/>.                                          --
30--                                                                          --
31-- GNAT was originally developed  by the GNAT team at  New York University. --
32-- Extensive contributions were provided by Ada Core Technologies Inc.      --
33--                                                                          --
34------------------------------------------------------------------------------
35
36with Ada.Strings.Wide_Maps;
37with Ada.Finalization;
38
39package Ada.Strings.Wide_Unbounded is
40   pragma Preelaborate;
41
42   type Unbounded_Wide_String is private;
43   pragma Preelaborable_Initialization (Unbounded_Wide_String);
44
45   Null_Unbounded_Wide_String : constant Unbounded_Wide_String;
46
47   function Length (Source : Unbounded_Wide_String) return Natural;
48
49   type Wide_String_Access is access all Wide_String;
50
51   procedure Free (X : in out Wide_String_Access);
52
53   --------------------------------------------------------
54   -- Conversion, Concatenation, and Selection Functions --
55   --------------------------------------------------------
56
57   function To_Unbounded_Wide_String
58     (Source : Wide_String) return Unbounded_Wide_String;
59
60   function To_Unbounded_Wide_String
61     (Length : Natural) return Unbounded_Wide_String;
62
63   function To_Wide_String
64     (Source : Unbounded_Wide_String)
65      return Wide_String;
66
67   procedure Set_Unbounded_Wide_String
68     (Target : out Unbounded_Wide_String;
69      Source : Wide_String);
70   pragma Ada_05 (Set_Unbounded_Wide_String);
71
72   procedure Append
73     (Source   : in out Unbounded_Wide_String;
74      New_Item : Unbounded_Wide_String);
75
76   procedure Append
77     (Source   : in out Unbounded_Wide_String;
78      New_Item : Wide_String);
79
80   procedure Append
81     (Source   : in out Unbounded_Wide_String;
82      New_Item : Wide_Character);
83
84   function "&"
85     (Left  : Unbounded_Wide_String;
86      Right : Unbounded_Wide_String) return Unbounded_Wide_String;
87
88   function "&"
89     (Left  : Unbounded_Wide_String;
90      Right : Wide_String) return Unbounded_Wide_String;
91
92   function "&"
93     (Left  : Wide_String;
94      Right : Unbounded_Wide_String) return Unbounded_Wide_String;
95
96   function "&"
97     (Left  : Unbounded_Wide_String;
98      Right : Wide_Character) return Unbounded_Wide_String;
99
100   function "&"
101     (Left  : Wide_Character;
102      Right : Unbounded_Wide_String) return Unbounded_Wide_String;
103
104   function Element
105     (Source : Unbounded_Wide_String;
106      Index  : Positive) return Wide_Character;
107
108   procedure Replace_Element
109     (Source : in out Unbounded_Wide_String;
110      Index  : Positive;
111      By     : Wide_Character);
112
113   function Slice
114     (Source : Unbounded_Wide_String;
115      Low    : Positive;
116      High   : Natural) return Wide_String;
117
118   function Unbounded_Slice
119     (Source : Unbounded_Wide_String;
120      Low    : Positive;
121      High   : Natural) return Unbounded_Wide_String;
122   pragma Ada_05 (Unbounded_Slice);
123
124   procedure Unbounded_Slice
125     (Source : Unbounded_Wide_String;
126      Target : out Unbounded_Wide_String;
127      Low    : Positive;
128      High   : Natural);
129   pragma Ada_05 (Unbounded_Slice);
130
131   function "="
132     (Left  : Unbounded_Wide_String;
133      Right : Unbounded_Wide_String) return Boolean;
134
135   function "="
136     (Left  : Unbounded_Wide_String;
137      Right : Wide_String) return Boolean;
138
139   function "="
140     (Left  : Wide_String;
141      Right : Unbounded_Wide_String) return Boolean;
142
143   function "<"
144     (Left  : Unbounded_Wide_String;
145      Right : Unbounded_Wide_String) return Boolean;
146
147   function "<"
148     (Left  : Unbounded_Wide_String;
149      Right : Wide_String) return Boolean;
150
151   function "<"
152     (Left  : Wide_String;
153      Right : Unbounded_Wide_String) return Boolean;
154
155   function "<="
156     (Left  : Unbounded_Wide_String;
157      Right : Unbounded_Wide_String) return Boolean;
158
159   function "<="
160     (Left  : Unbounded_Wide_String;
161      Right : Wide_String) return Boolean;
162
163   function "<="
164     (Left  : Wide_String;
165      Right : Unbounded_Wide_String) return Boolean;
166
167   function ">"
168     (Left  : Unbounded_Wide_String;
169      Right : Unbounded_Wide_String) return Boolean;
170
171   function ">"
172     (Left  : Unbounded_Wide_String;
173      Right : Wide_String) return Boolean;
174
175   function ">"
176     (Left  : Wide_String;
177      Right : Unbounded_Wide_String) return Boolean;
178
179   function ">="
180     (Left  : Unbounded_Wide_String;
181      Right : Unbounded_Wide_String) return Boolean;
182
183   function ">="
184     (Left  : Unbounded_Wide_String;
185      Right : Wide_String) return Boolean;
186
187   function ">="
188     (Left  : Wide_String;
189      Right : Unbounded_Wide_String) return Boolean;
190
191   ------------------------
192   -- Search Subprograms --
193   ------------------------
194
195   function Index
196     (Source  : Unbounded_Wide_String;
197      Pattern : Wide_String;
198      Going   : Direction := Forward;
199      Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
200      return Natural;
201
202   function Index
203     (Source  : Unbounded_Wide_String;
204      Pattern : Wide_String;
205      Going   : Direction := Forward;
206      Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural;
207
208   function Index
209     (Source : Unbounded_Wide_String;
210      Set    : Wide_Maps.Wide_Character_Set;
211      Test   : Membership := Inside;
212      Going  : Direction  := Forward) return Natural;
213
214   function Index
215     (Source  : Unbounded_Wide_String;
216      Pattern : Wide_String;
217      From    : Positive;
218      Going   : Direction := Forward;
219      Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
220      return Natural;
221   pragma Ada_05 (Index);
222
223   function Index
224     (Source  : Unbounded_Wide_String;
225      Pattern : Wide_String;
226      From    : Positive;
227      Going   : Direction := Forward;
228      Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural;
229   pragma Ada_05 (Index);
230
231   function Index
232     (Source  : Unbounded_Wide_String;
233      Set     : Wide_Maps.Wide_Character_Set;
234      From    : Positive;
235      Test    : Membership := Inside;
236      Going   : Direction := Forward) return Natural;
237   pragma Ada_05 (Index);
238
239   function Index_Non_Blank
240     (Source : Unbounded_Wide_String;
241      Going  : Direction := Forward) return Natural;
242
243   function Index_Non_Blank
244     (Source : Unbounded_Wide_String;
245      From   : Positive;
246      Going  : Direction := Forward) return Natural;
247   pragma Ada_05 (Index_Non_Blank);
248
249   function Count
250     (Source  : Unbounded_Wide_String;
251      Pattern : Wide_String;
252      Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
253      return Natural;
254
255   function Count
256     (Source  : Unbounded_Wide_String;
257      Pattern : Wide_String;
258      Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural;
259
260   function Count
261     (Source : Unbounded_Wide_String;
262      Set    : Wide_Maps.Wide_Character_Set) return Natural;
263
264   procedure Find_Token
265     (Source : Unbounded_Wide_String;
266      Set    : Wide_Maps.Wide_Character_Set;
267      From   : Positive;
268      Test   : Membership;
269      First  : out Positive;
270      Last   : out Natural);
271   pragma Ada_2012 (Find_Token);
272
273   procedure Find_Token
274     (Source : Unbounded_Wide_String;
275      Set    : Wide_Maps.Wide_Character_Set;
276      Test   : Membership;
277      First  : out Positive;
278      Last   : out Natural);
279
280   ------------------------------------
281   -- String Translation Subprograms --
282   ------------------------------------
283
284   function Translate
285     (Source  : Unbounded_Wide_String;
286      Mapping : Wide_Maps.Wide_Character_Mapping)
287      return Unbounded_Wide_String;
288
289   procedure Translate
290     (Source  : in out Unbounded_Wide_String;
291      Mapping : Wide_Maps.Wide_Character_Mapping);
292
293   function Translate
294     (Source  : Unbounded_Wide_String;
295      Mapping : Wide_Maps.Wide_Character_Mapping_Function)
296      return Unbounded_Wide_String;
297
298   procedure Translate
299     (Source  : in out Unbounded_Wide_String;
300      Mapping : Wide_Maps.Wide_Character_Mapping_Function);
301
302   ---------------------------------------
303   -- String Transformation Subprograms --
304   ---------------------------------------
305
306   function Replace_Slice
307     (Source : Unbounded_Wide_String;
308      Low    : Positive;
309      High   : Natural;
310      By     : Wide_String) return Unbounded_Wide_String;
311
312   procedure Replace_Slice
313     (Source : in out Unbounded_Wide_String;
314      Low    : Positive;
315      High   : Natural;
316      By     : Wide_String);
317
318   function Insert
319     (Source   : Unbounded_Wide_String;
320      Before   : Positive;
321      New_Item : Wide_String) return Unbounded_Wide_String;
322
323   procedure Insert
324     (Source   : in out Unbounded_Wide_String;
325      Before   : Positive;
326      New_Item : Wide_String);
327
328   function Overwrite
329     (Source   : Unbounded_Wide_String;
330      Position : Positive;
331      New_Item : Wide_String) return Unbounded_Wide_String;
332
333   procedure Overwrite
334     (Source   : in out Unbounded_Wide_String;
335      Position : Positive;
336      New_Item : Wide_String);
337
338   function Delete
339     (Source  : Unbounded_Wide_String;
340      From    : Positive;
341      Through : Natural) return Unbounded_Wide_String;
342
343   procedure Delete
344     (Source  : in out Unbounded_Wide_String;
345      From    : Positive;
346      Through : Natural);
347
348   function Trim
349     (Source : Unbounded_Wide_String;
350      Side   : Trim_End) return Unbounded_Wide_String;
351
352   procedure Trim
353     (Source : in out Unbounded_Wide_String;
354      Side   : Trim_End);
355
356   function Trim
357     (Source : Unbounded_Wide_String;
358      Left   : Wide_Maps.Wide_Character_Set;
359      Right  : Wide_Maps.Wide_Character_Set) return Unbounded_Wide_String;
360
361   procedure Trim
362     (Source : in out Unbounded_Wide_String;
363      Left   : Wide_Maps.Wide_Character_Set;
364      Right  : Wide_Maps.Wide_Character_Set);
365
366   function Head
367     (Source : Unbounded_Wide_String;
368      Count  : Natural;
369      Pad    : Wide_Character := Wide_Space) return Unbounded_Wide_String;
370
371   procedure Head
372     (Source : in out Unbounded_Wide_String;
373      Count  : Natural;
374      Pad    : Wide_Character := Wide_Space);
375
376   function Tail
377     (Source : Unbounded_Wide_String;
378      Count  : Natural;
379      Pad    : Wide_Character := Wide_Space) return Unbounded_Wide_String;
380
381   procedure Tail
382     (Source : in out Unbounded_Wide_String;
383      Count  : Natural;
384      Pad    : Wide_Character := Wide_Space);
385
386   function "*"
387     (Left  : Natural;
388      Right : Wide_Character) return Unbounded_Wide_String;
389
390   function "*"
391     (Left  : Natural;
392      Right : Wide_String) return Unbounded_Wide_String;
393
394   function "*"
395     (Left  : Natural;
396      Right : Unbounded_Wide_String) return Unbounded_Wide_String;
397
398private
399   pragma Inline (Length);
400
401   package AF renames Ada.Finalization;
402
403   Null_Wide_String : aliased Wide_String := "";
404
405   function To_Unbounded_Wide (S : Wide_String) return Unbounded_Wide_String
406     renames To_Unbounded_Wide_String;
407
408   type Unbounded_Wide_String is new AF.Controlled with record
409      Reference : Wide_String_Access := Null_Wide_String'Access;
410      Last      : Natural            := 0;
411   end record;
412
413   --  The Unbounded_Wide_String is using a buffered implementation to increase
414   --  speed of the Append/Delete/Insert procedures. The Reference string
415   --  pointer above contains the current string value and extra room at the
416   --  end to be used by the next Append routine. Last is the index of the
417   --  string ending character. So the current string value is really
418   --  Reference (1 .. Last).
419
420   pragma Stream_Convert
421     (Unbounded_Wide_String, To_Unbounded_Wide, To_Wide_String);
422
423   pragma Finalize_Storage_Only (Unbounded_Wide_String);
424   --  Finalization is required only for freeing storage
425
426   procedure Initialize (Object : in out Unbounded_Wide_String);
427   procedure Adjust     (Object : in out Unbounded_Wide_String);
428   procedure Finalize   (Object : in out Unbounded_Wide_String);
429
430   procedure Realloc_For_Chunk
431     (Source     : in out Unbounded_Wide_String;
432      Chunk_Size : Natural);
433   --  Adjust the size allocated for the string. Add at least Chunk_Size so it
434   --  is safe to add a string of this size at the end of the current content.
435   --  The real size allocated for the string is Chunk_Size + x of the current
436   --  string size. This buffered handling makes the Append unbounded string
437   --  routines very fast.
438
439   Null_Unbounded_Wide_String : constant Unbounded_Wide_String :=
440                                  (AF.Controlled with
441                                     Reference => Null_Wide_String'Access,
442                                     Last => 0);
443end Ada.Strings.Wide_Unbounded;
444