PR c++/54038
[official-gcc.git] / gcc / ada / a-stzunb.ads
blobfa7bc17d93de7065c77030a7aef3d57b448ac399
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT RUN-TIME COMPONENTS --
4 -- --
5 -- A D A . S T R I N G S . W I D E _ 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 ------------------------------------------------------------------------------
36 with Ada.Strings.Wide_Wide_Maps;
37 with Ada.Finalization;
39 package Ada.Strings.Wide_Wide_Unbounded is
40 pragma Preelaborate;
42 type Unbounded_Wide_Wide_String is private;
43 pragma Preelaborable_Initialization (Unbounded_Wide_Wide_String);
45 Null_Unbounded_Wide_Wide_String : constant Unbounded_Wide_Wide_String;
47 function Length (Source : Unbounded_Wide_Wide_String) return Natural;
49 type Wide_Wide_String_Access is access all Wide_Wide_String;
51 procedure Free (X : in out Wide_Wide_String_Access);
53 --------------------------------------------------------
54 -- Conversion, Concatenation, and Selection Functions --
55 --------------------------------------------------------
57 function To_Unbounded_Wide_Wide_String
58 (Source : Wide_Wide_String) return Unbounded_Wide_Wide_String;
60 function To_Unbounded_Wide_Wide_String
61 (Length : Natural) return Unbounded_Wide_Wide_String;
63 function To_Wide_Wide_String
64 (Source : Unbounded_Wide_Wide_String) return Wide_Wide_String;
66 procedure Set_Unbounded_Wide_Wide_String
67 (Target : out Unbounded_Wide_Wide_String;
68 Source : Wide_Wide_String);
69 pragma Ada_05 (Set_Unbounded_Wide_Wide_String);
71 procedure Append
72 (Source : in out Unbounded_Wide_Wide_String;
73 New_Item : Unbounded_Wide_Wide_String);
75 procedure Append
76 (Source : in out Unbounded_Wide_Wide_String;
77 New_Item : Wide_Wide_String);
79 procedure Append
80 (Source : in out Unbounded_Wide_Wide_String;
81 New_Item : Wide_Wide_Character);
83 function "&"
84 (Left : Unbounded_Wide_Wide_String;
85 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
87 function "&"
88 (Left : Unbounded_Wide_Wide_String;
89 Right : Wide_Wide_String) return Unbounded_Wide_Wide_String;
91 function "&"
92 (Left : Wide_Wide_String;
93 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
95 function "&"
96 (Left : Unbounded_Wide_Wide_String;
97 Right : Wide_Wide_Character) return Unbounded_Wide_Wide_String;
99 function "&"
100 (Left : Wide_Wide_Character;
101 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
103 function Element
104 (Source : Unbounded_Wide_Wide_String;
105 Index : Positive) return Wide_Wide_Character;
107 procedure Replace_Element
108 (Source : in out Unbounded_Wide_Wide_String;
109 Index : Positive;
110 By : Wide_Wide_Character);
112 function Slice
113 (Source : Unbounded_Wide_Wide_String;
114 Low : Positive;
115 High : Natural) return Wide_Wide_String;
117 function Unbounded_Slice
118 (Source : Unbounded_Wide_Wide_String;
119 Low : Positive;
120 High : Natural) return Unbounded_Wide_Wide_String;
121 pragma Ada_05 (Unbounded_Slice);
123 procedure Unbounded_Slice
124 (Source : Unbounded_Wide_Wide_String;
125 Target : out Unbounded_Wide_Wide_String;
126 Low : Positive;
127 High : Natural);
128 pragma Ada_05 (Unbounded_Slice);
130 function "="
131 (Left : Unbounded_Wide_Wide_String;
132 Right : Unbounded_Wide_Wide_String) return Boolean;
134 function "="
135 (Left : Unbounded_Wide_Wide_String;
136 Right : Wide_Wide_String) return Boolean;
138 function "="
139 (Left : Wide_Wide_String;
140 Right : Unbounded_Wide_Wide_String) return Boolean;
142 function "<"
143 (Left : Unbounded_Wide_Wide_String;
144 Right : Unbounded_Wide_Wide_String) return Boolean;
146 function "<"
147 (Left : Unbounded_Wide_Wide_String;
148 Right : Wide_Wide_String) return Boolean;
150 function "<"
151 (Left : Wide_Wide_String;
152 Right : Unbounded_Wide_Wide_String) return Boolean;
154 function "<="
155 (Left : Unbounded_Wide_Wide_String;
156 Right : Unbounded_Wide_Wide_String) return Boolean;
158 function "<="
159 (Left : Unbounded_Wide_Wide_String;
160 Right : Wide_Wide_String) return Boolean;
162 function "<="
163 (Left : Wide_Wide_String;
164 Right : Unbounded_Wide_Wide_String) return Boolean;
166 function ">"
167 (Left : Unbounded_Wide_Wide_String;
168 Right : Unbounded_Wide_Wide_String) return Boolean;
170 function ">"
171 (Left : Unbounded_Wide_Wide_String;
172 Right : Wide_Wide_String) return Boolean;
174 function ">"
175 (Left : Wide_Wide_String;
176 Right : Unbounded_Wide_Wide_String) return Boolean;
178 function ">="
179 (Left : Unbounded_Wide_Wide_String;
180 Right : Unbounded_Wide_Wide_String) return Boolean;
182 function ">="
183 (Left : Unbounded_Wide_Wide_String;
184 Right : Wide_Wide_String) return Boolean;
186 function ">="
187 (Left : Wide_Wide_String;
188 Right : Unbounded_Wide_Wide_String) return Boolean;
190 ------------------------
191 -- Search Subprograms --
192 ------------------------
194 function Index
195 (Source : Unbounded_Wide_Wide_String;
196 Pattern : Wide_Wide_String;
197 Going : Direction := Forward;
198 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
199 Wide_Wide_Maps.Identity)
200 return Natural;
202 function Index
203 (Source : Unbounded_Wide_Wide_String;
204 Pattern : Wide_Wide_String;
205 Going : Direction := Forward;
206 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
207 return Natural;
209 function Index
210 (Source : Unbounded_Wide_Wide_String;
211 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
212 Test : Membership := Inside;
213 Going : Direction := Forward) return Natural;
215 function Index
216 (Source : Unbounded_Wide_Wide_String;
217 Pattern : Wide_Wide_String;
218 From : Positive;
219 Going : Direction := Forward;
220 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
221 Wide_Wide_Maps.Identity)
222 return Natural;
223 pragma Ada_05 (Index);
225 function Index
226 (Source : Unbounded_Wide_Wide_String;
227 Pattern : Wide_Wide_String;
228 From : Positive;
229 Going : Direction := Forward;
230 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
231 return Natural;
232 pragma Ada_05 (Index);
234 function Index
235 (Source : Unbounded_Wide_Wide_String;
236 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
237 From : Positive;
238 Test : Membership := Inside;
239 Going : Direction := Forward) return Natural;
240 pragma Ada_05 (Index);
242 function Index_Non_Blank
243 (Source : Unbounded_Wide_Wide_String;
244 Going : Direction := Forward) return Natural;
246 function Index_Non_Blank
247 (Source : Unbounded_Wide_Wide_String;
248 From : Positive;
249 Going : Direction := Forward) return Natural;
250 pragma Ada_05 (Index_Non_Blank);
252 function Count
253 (Source : Unbounded_Wide_Wide_String;
254 Pattern : Wide_Wide_String;
255 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
256 Wide_Wide_Maps.Identity)
257 return Natural;
259 function Count
260 (Source : Unbounded_Wide_Wide_String;
261 Pattern : Wide_Wide_String;
262 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
263 return Natural;
265 function Count
266 (Source : Unbounded_Wide_Wide_String;
267 Set : Wide_Wide_Maps.Wide_Wide_Character_Set) return Natural;
269 procedure Find_Token
270 (Source : Unbounded_Wide_Wide_String;
271 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
272 From : Positive;
273 Test : Membership;
274 First : out Positive;
275 Last : out Natural);
276 pragma Ada_2012 (Find_Token);
278 procedure Find_Token
279 (Source : Unbounded_Wide_Wide_String;
280 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
281 Test : Membership;
282 First : out Positive;
283 Last : out Natural);
285 ------------------------------------
286 -- String Translation Subprograms --
287 ------------------------------------
289 function Translate
290 (Source : Unbounded_Wide_Wide_String;
291 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
292 return Unbounded_Wide_Wide_String;
294 procedure Translate
295 (Source : in out Unbounded_Wide_Wide_String;
296 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping);
298 function Translate
299 (Source : Unbounded_Wide_Wide_String;
300 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
301 return Unbounded_Wide_Wide_String;
303 procedure Translate
304 (Source : in out Unbounded_Wide_Wide_String;
305 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function);
307 ---------------------------------------
308 -- String Transformation Subprograms --
309 ---------------------------------------
311 function Replace_Slice
312 (Source : Unbounded_Wide_Wide_String;
313 Low : Positive;
314 High : Natural;
315 By : Wide_Wide_String) return Unbounded_Wide_Wide_String;
317 procedure Replace_Slice
318 (Source : in out Unbounded_Wide_Wide_String;
319 Low : Positive;
320 High : Natural;
321 By : Wide_Wide_String);
323 function Insert
324 (Source : Unbounded_Wide_Wide_String;
325 Before : Positive;
326 New_Item : Wide_Wide_String) return Unbounded_Wide_Wide_String;
328 procedure Insert
329 (Source : in out Unbounded_Wide_Wide_String;
330 Before : Positive;
331 New_Item : Wide_Wide_String);
333 function Overwrite
334 (Source : Unbounded_Wide_Wide_String;
335 Position : Positive;
336 New_Item : Wide_Wide_String) return Unbounded_Wide_Wide_String;
338 procedure Overwrite
339 (Source : in out Unbounded_Wide_Wide_String;
340 Position : Positive;
341 New_Item : Wide_Wide_String);
343 function Delete
344 (Source : Unbounded_Wide_Wide_String;
345 From : Positive;
346 Through : Natural) return Unbounded_Wide_Wide_String;
348 procedure Delete
349 (Source : in out Unbounded_Wide_Wide_String;
350 From : Positive;
351 Through : Natural);
353 function Trim
354 (Source : Unbounded_Wide_Wide_String;
355 Side : Trim_End) return Unbounded_Wide_Wide_String;
357 procedure Trim
358 (Source : in out Unbounded_Wide_Wide_String;
359 Side : Trim_End);
361 function Trim
362 (Source : Unbounded_Wide_Wide_String;
363 Left : Wide_Wide_Maps.Wide_Wide_Character_Set;
364 Right : Wide_Wide_Maps.Wide_Wide_Character_Set)
365 return Unbounded_Wide_Wide_String;
367 procedure Trim
368 (Source : in out Unbounded_Wide_Wide_String;
369 Left : Wide_Wide_Maps.Wide_Wide_Character_Set;
370 Right : Wide_Wide_Maps.Wide_Wide_Character_Set);
372 function Head
373 (Source : Unbounded_Wide_Wide_String;
374 Count : Natural;
375 Pad : Wide_Wide_Character := Wide_Wide_Space)
376 return Unbounded_Wide_Wide_String;
378 procedure Head
379 (Source : in out Unbounded_Wide_Wide_String;
380 Count : Natural;
381 Pad : Wide_Wide_Character := Wide_Wide_Space);
383 function Tail
384 (Source : Unbounded_Wide_Wide_String;
385 Count : Natural;
386 Pad : Wide_Wide_Character := Wide_Wide_Space)
387 return Unbounded_Wide_Wide_String;
389 procedure Tail
390 (Source : in out Unbounded_Wide_Wide_String;
391 Count : Natural;
392 Pad : Wide_Wide_Character := Wide_Wide_Space);
394 function "*"
395 (Left : Natural;
396 Right : Wide_Wide_Character) return Unbounded_Wide_Wide_String;
398 function "*"
399 (Left : Natural;
400 Right : Wide_Wide_String) return Unbounded_Wide_Wide_String;
402 function "*"
403 (Left : Natural;
404 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
406 private
407 pragma Inline (Length);
409 package AF renames Ada.Finalization;
411 Null_Wide_Wide_String : aliased Wide_Wide_String := "";
413 function To_Unbounded_Wide
414 (S : Wide_Wide_String) return Unbounded_Wide_Wide_String
415 renames To_Unbounded_Wide_Wide_String;
417 type Unbounded_Wide_Wide_String is new AF.Controlled with record
418 Reference : Wide_Wide_String_Access := Null_Wide_Wide_String'Access;
419 Last : Natural := 0;
420 end record;
422 -- The Unbounded_Wide_Wide_String is using a buffered implementation to
423 -- increase speed of the Append/Delete/Insert procedures. The Reference
424 -- string pointer above contains the current string value and extra room
425 -- at the end to be used by the next Append routine. Last is the index of
426 -- the string ending character. So the current string value is really
427 -- Reference (1 .. Last).
429 pragma Stream_Convert
430 (Unbounded_Wide_Wide_String, To_Unbounded_Wide, To_Wide_Wide_String);
432 pragma Finalize_Storage_Only (Unbounded_Wide_Wide_String);
433 -- Finalization is required only for freeing storage
435 procedure Initialize (Object : in out Unbounded_Wide_Wide_String);
436 procedure Adjust (Object : in out Unbounded_Wide_Wide_String);
437 procedure Finalize (Object : in out Unbounded_Wide_Wide_String);
438 procedure Realloc_For_Chunk
439 (Source : in out Unbounded_Wide_Wide_String;
440 Chunk_Size : Natural);
441 -- Adjust the size allocated for the string. Add at least Chunk_Size so it
442 -- is safe to add a string of this size at the end of the current content.
443 -- The real size allocated for the string is Chunk_Size + x of the current
444 -- string size. This buffered handling makes the Append unbounded string
445 -- routines very fast.
447 Null_Unbounded_Wide_Wide_String : constant Unbounded_Wide_Wide_String :=
448 (AF.Controlled with
449 Reference =>
450 Null_Wide_Wide_String'Access,
451 Last => 0);
452 end Ada.Strings.Wide_Wide_Unbounded;