OSDN Git Service

2011-10-16 Tristan Gingold <gingold@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-stwiun-shared.ads
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-2011, 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
36 --  This version is supported on:
37 --    - all Alpha platforms
38 --    - all ia64 platforms
39 --    - all PowerPC platforms
40 --    - all SPARC V9 platforms
41 --    - all x86 platforms
42 --    - all x86_64 platforms
43
44 with Ada.Strings.Wide_Maps;
45 private with Ada.Finalization;
46 private with System.Atomic_Counters;
47
48 package Ada.Strings.Wide_Unbounded is
49    pragma Preelaborate;
50
51    type Unbounded_Wide_String is private;
52    pragma Preelaborable_Initialization (Unbounded_Wide_String);
53
54    Null_Unbounded_Wide_String : constant Unbounded_Wide_String;
55
56    function Length (Source : Unbounded_Wide_String) return Natural;
57
58    type Wide_String_Access is access all Wide_String;
59
60    procedure Free (X : in out Wide_String_Access);
61
62    --------------------------------------------------------
63    -- Conversion, Concatenation, and Selection Functions --
64    --------------------------------------------------------
65
66    function To_Unbounded_Wide_String
67      (Source : Wide_String) return Unbounded_Wide_String;
68
69    function To_Unbounded_Wide_String
70      (Length : Natural) return Unbounded_Wide_String;
71
72    function To_Wide_String
73      (Source : Unbounded_Wide_String) return Wide_String;
74
75    procedure Set_Unbounded_Wide_String
76      (Target : out Unbounded_Wide_String;
77       Source : Wide_String);
78    pragma Ada_05 (Set_Unbounded_Wide_String);
79
80    procedure Append
81      (Source   : in out Unbounded_Wide_String;
82       New_Item : Unbounded_Wide_String);
83
84    procedure Append
85      (Source   : in out Unbounded_Wide_String;
86       New_Item : Wide_String);
87
88    procedure Append
89      (Source   : in out Unbounded_Wide_String;
90       New_Item : Wide_Character);
91
92    function "&"
93      (Left  : Unbounded_Wide_String;
94       Right : Unbounded_Wide_String) return Unbounded_Wide_String;
95
96    function "&"
97      (Left  : Unbounded_Wide_String;
98       Right : Wide_String) return Unbounded_Wide_String;
99
100    function "&"
101      (Left  : Wide_String;
102       Right : Unbounded_Wide_String) return Unbounded_Wide_String;
103
104    function "&"
105      (Left  : Unbounded_Wide_String;
106       Right : Wide_Character) return Unbounded_Wide_String;
107
108    function "&"
109      (Left  : Wide_Character;
110       Right : Unbounded_Wide_String) return Unbounded_Wide_String;
111
112    function Element
113      (Source : Unbounded_Wide_String;
114       Index  : Positive) return Wide_Character;
115
116    procedure Replace_Element
117      (Source : in out Unbounded_Wide_String;
118       Index  : Positive;
119       By     : Wide_Character);
120
121    function Slice
122      (Source : Unbounded_Wide_String;
123       Low    : Positive;
124       High   : Natural) return Wide_String;
125
126    function Unbounded_Slice
127      (Source : Unbounded_Wide_String;
128       Low    : Positive;
129       High   : Natural) return Unbounded_Wide_String;
130    pragma Ada_05 (Unbounded_Slice);
131
132    procedure Unbounded_Slice
133      (Source : Unbounded_Wide_String;
134       Target : out Unbounded_Wide_String;
135       Low    : Positive;
136       High   : Natural);
137    pragma Ada_05 (Unbounded_Slice);
138
139    function "="
140      (Left  : Unbounded_Wide_String;
141       Right : Unbounded_Wide_String) return Boolean;
142
143    function "="
144      (Left  : Unbounded_Wide_String;
145       Right : Wide_String) return Boolean;
146
147    function "="
148      (Left  : Wide_String;
149       Right : Unbounded_Wide_String) return Boolean;
150
151    function "<"
152      (Left  : Unbounded_Wide_String;
153       Right : Unbounded_Wide_String) return Boolean;
154
155    function "<"
156      (Left  : Unbounded_Wide_String;
157       Right : Wide_String) return Boolean;
158
159    function "<"
160      (Left  : Wide_String;
161       Right : Unbounded_Wide_String) return Boolean;
162
163    function "<="
164      (Left  : Unbounded_Wide_String;
165       Right : Unbounded_Wide_String) return Boolean;
166
167    function "<="
168      (Left  : Unbounded_Wide_String;
169       Right : Wide_String) return Boolean;
170
171    function "<="
172      (Left  : Wide_String;
173       Right : Unbounded_Wide_String) return Boolean;
174
175    function ">"
176      (Left  : Unbounded_Wide_String;
177       Right : Unbounded_Wide_String) return Boolean;
178
179    function ">"
180      (Left  : Unbounded_Wide_String;
181       Right : Wide_String) return Boolean;
182
183    function ">"
184      (Left  : Wide_String;
185       Right : Unbounded_Wide_String) return Boolean;
186
187    function ">="
188      (Left  : Unbounded_Wide_String;
189       Right : Unbounded_Wide_String) return Boolean;
190
191    function ">="
192      (Left  : Unbounded_Wide_String;
193       Right : Wide_String) return Boolean;
194
195    function ">="
196      (Left  : Wide_String;
197       Right : Unbounded_Wide_String) return Boolean;
198
199    ------------------------
200    -- Search Subprograms --
201    ------------------------
202
203    function Index
204      (Source  : Unbounded_Wide_String;
205       Pattern : Wide_String;
206       Going   : Direction := Forward;
207       Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
208       return Natural;
209
210    function Index
211      (Source  : Unbounded_Wide_String;
212       Pattern : Wide_String;
213       Going   : Direction := Forward;
214       Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural;
215
216    function Index
217      (Source : Unbounded_Wide_String;
218       Set    : Wide_Maps.Wide_Character_Set;
219       Test   : Membership := Inside;
220       Going  : Direction  := Forward) return Natural;
221
222    function Index
223      (Source  : Unbounded_Wide_String;
224       Pattern : Wide_String;
225       From    : Positive;
226       Going   : Direction := Forward;
227       Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
228       return Natural;
229    pragma Ada_05 (Index);
230
231    function Index
232      (Source  : Unbounded_Wide_String;
233       Pattern : Wide_String;
234       From    : Positive;
235       Going   : Direction := Forward;
236       Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural;
237    pragma Ada_05 (Index);
238
239    function Index
240      (Source  : Unbounded_Wide_String;
241       Set     : Wide_Maps.Wide_Character_Set;
242       From    : Positive;
243       Test    : Membership := Inside;
244       Going   : Direction := Forward) return Natural;
245    pragma Ada_05 (Index);
246
247    function Index_Non_Blank
248      (Source : Unbounded_Wide_String;
249       Going  : Direction := Forward) return Natural;
250
251    function Index_Non_Blank
252      (Source : Unbounded_Wide_String;
253       From   : Positive;
254       Going  : Direction := Forward) return Natural;
255    pragma Ada_05 (Index_Non_Blank);
256
257    function Count
258      (Source  : Unbounded_Wide_String;
259       Pattern : Wide_String;
260       Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
261       return Natural;
262
263    function Count
264      (Source  : Unbounded_Wide_String;
265       Pattern : Wide_String;
266       Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural;
267
268    function Count
269      (Source : Unbounded_Wide_String;
270       Set    : Wide_Maps.Wide_Character_Set) return Natural;
271
272    procedure Find_Token
273      (Source : Unbounded_Wide_String;
274       Set    : Wide_Maps.Wide_Character_Set;
275       From   : Positive;
276       Test   : Membership;
277       First  : out Positive;
278       Last   : out Natural);
279    pragma Ada_2012 (Find_Token);
280
281    procedure Find_Token
282      (Source : Unbounded_Wide_String;
283       Set    : Wide_Maps.Wide_Character_Set;
284       Test   : Membership;
285       First  : out Positive;
286       Last   : out Natural);
287
288    ------------------------------------
289    -- String Translation Subprograms --
290    ------------------------------------
291
292    function Translate
293      (Source  : Unbounded_Wide_String;
294       Mapping : Wide_Maps.Wide_Character_Mapping)
295       return Unbounded_Wide_String;
296
297    procedure Translate
298      (Source  : in out Unbounded_Wide_String;
299       Mapping : Wide_Maps.Wide_Character_Mapping);
300
301    function Translate
302      (Source  : Unbounded_Wide_String;
303       Mapping : Wide_Maps.Wide_Character_Mapping_Function)
304       return Unbounded_Wide_String;
305
306    procedure Translate
307      (Source  : in out Unbounded_Wide_String;
308       Mapping : Wide_Maps.Wide_Character_Mapping_Function);
309
310    ---------------------------------------
311    -- String Transformation Subprograms --
312    ---------------------------------------
313
314    function Replace_Slice
315      (Source : Unbounded_Wide_String;
316       Low    : Positive;
317       High   : Natural;
318       By     : Wide_String) return Unbounded_Wide_String;
319
320    procedure Replace_Slice
321      (Source : in out Unbounded_Wide_String;
322       Low    : Positive;
323       High   : Natural;
324       By     : Wide_String);
325
326    function Insert
327      (Source   : Unbounded_Wide_String;
328       Before   : Positive;
329       New_Item : Wide_String) return Unbounded_Wide_String;
330
331    procedure Insert
332      (Source   : in out Unbounded_Wide_String;
333       Before   : Positive;
334       New_Item : Wide_String);
335
336    function Overwrite
337      (Source   : Unbounded_Wide_String;
338       Position : Positive;
339       New_Item : Wide_String) return Unbounded_Wide_String;
340
341    procedure Overwrite
342      (Source   : in out Unbounded_Wide_String;
343       Position : Positive;
344       New_Item : Wide_String);
345
346    function Delete
347      (Source  : Unbounded_Wide_String;
348       From    : Positive;
349       Through : Natural) return Unbounded_Wide_String;
350
351    procedure Delete
352      (Source  : in out Unbounded_Wide_String;
353       From    : Positive;
354       Through : Natural);
355
356    function Trim
357      (Source : Unbounded_Wide_String;
358       Side   : Trim_End) return Unbounded_Wide_String;
359
360    procedure Trim
361      (Source : in out Unbounded_Wide_String;
362       Side   : Trim_End);
363
364    function Trim
365      (Source : Unbounded_Wide_String;
366       Left   : Wide_Maps.Wide_Character_Set;
367       Right  : Wide_Maps.Wide_Character_Set) return Unbounded_Wide_String;
368
369    procedure Trim
370      (Source : in out Unbounded_Wide_String;
371       Left   : Wide_Maps.Wide_Character_Set;
372       Right  : Wide_Maps.Wide_Character_Set);
373
374    function Head
375      (Source : Unbounded_Wide_String;
376       Count  : Natural;
377       Pad    : Wide_Character := Wide_Space) return Unbounded_Wide_String;
378
379    procedure Head
380      (Source : in out Unbounded_Wide_String;
381       Count  : Natural;
382       Pad    : Wide_Character := Wide_Space);
383
384    function Tail
385      (Source : Unbounded_Wide_String;
386       Count  : Natural;
387       Pad    : Wide_Character := Wide_Space) return Unbounded_Wide_String;
388
389    procedure Tail
390      (Source : in out Unbounded_Wide_String;
391       Count  : Natural;
392       Pad    : Wide_Character := Wide_Space);
393
394    function "*"
395      (Left  : Natural;
396       Right : Wide_Character) return Unbounded_Wide_String;
397
398    function "*"
399      (Left  : Natural;
400       Right : Wide_String) return Unbounded_Wide_String;
401
402    function "*"
403      (Left  : Natural;
404       Right : Unbounded_Wide_String) return Unbounded_Wide_String;
405
406 private
407    pragma Inline (Length);
408
409    package AF renames Ada.Finalization;
410
411    type Shared_Wide_String (Max_Length : Natural) is limited record
412       Counter : System.Atomic_Counters.Atomic_Counter;
413       --  Reference counter
414
415       Last : Natural := 0;
416       Data : Wide_String (1 .. Max_Length);
417       --  Last is the index of last significant element of the Data. All
418       --  elements with larger indices are just an extra room.
419    end record;
420
421    type Shared_Wide_String_Access is access all Shared_Wide_String;
422
423    procedure Reference (Item : not null Shared_Wide_String_Access);
424    --  Increment reference counter.
425
426    procedure Unreference (Item : not null Shared_Wide_String_Access);
427    --  Decrement reference counter. Deallocate Item when ref counter is zero
428
429    function Can_Be_Reused
430      (Item   : Shared_Wide_String_Access;
431       Length : Natural) return Boolean;
432    --  Returns True if Shared_Wide_String can be reused. There are two criteria
433    --  when Shared_Wide_String can be reused: its reference counter must be one
434    --  (thus Shared_Wide_String is owned exclusively) and its size is
435    --  sufficient to store string with specified length effectively.
436
437    function Allocate (Max_Length : Natural) return Shared_Wide_String_Access;
438    --  Allocates new Shared_Wide_String with at least specified maximum length.
439    --  Actual maximum length of the allocated Shared_Wide_String can be
440    --  slightly greater. Returns reference to Empty_Shared_Wide_String when
441    --  requested length is zero.
442
443    Empty_Shared_Wide_String : aliased Shared_Wide_String (0);
444
445    function To_Unbounded (S : Wide_String) return Unbounded_Wide_String
446      renames To_Unbounded_Wide_String;
447    --  This renames are here only to be used in the pragma Stream_Convert
448
449    type Unbounded_Wide_String is new AF.Controlled with record
450       Reference : Shared_Wide_String_Access := Empty_Shared_Wide_String'Access;
451    end record;
452
453    --  The Unbounded_Wide_String uses several techniques to increase speed of
454    --  the application:
455
456    --   - implicit sharing or copy-on-write. Unbounded_Wide_String contains
457    --     only the reference to the data which is shared between several
458    --     instances. The shared data is reallocated only when its value is
459    --     changed and the object mutation can't be used or it is inefficient to
460    --     use it;
461
462    --   - object mutation. Shared data object can be reused without memory
463    --     reallocation when all of the following requirements are meat:
464    --      - shared data object don't used anywhere longer;
465    --      - its size is sufficient to store new value;
466    --      - the gap after reuse is less then some threshold.
467
468    --   - memory preallocation. Most of used memory allocation algorithms
469    --     aligns allocated segment on the some boundary, thus some amount of
470    --     additional memory can be preallocated without any impact. Such
471    --     preallocated memory can used later by Append/Insert operations
472    --     without reallocation.
473
474    --  Reference counting uses GCC builtin atomic operations, which allows to
475    --  safely share internal data between Ada tasks. Nevertheless, this not
476    --  make objects of Unbounded_Wide_String thread-safe, so each instance
477    --  can't be accessed by several tasks simultaneously.
478
479    pragma Stream_Convert (Unbounded_Wide_String, To_Unbounded, To_Wide_String);
480    --  Provide stream routines without dragging in Ada.Streams
481
482    pragma Finalize_Storage_Only (Unbounded_Wide_String);
483    --  Finalization is required only for freeing storage
484
485    overriding procedure Initialize (Object : in out Unbounded_Wide_String);
486    overriding procedure Adjust     (Object : in out Unbounded_Wide_String);
487    overriding procedure Finalize   (Object : in out Unbounded_Wide_String);
488
489    Null_Unbounded_Wide_String : constant Unbounded_Wide_String :=
490                                   (AF.Controlled with
491                                      Reference =>
492                                        Empty_Shared_Wide_String'Access);
493
494 end Ada.Strings.Wide_Unbounded;