1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT RUN-TIME COMPONENTS                         --
4--                                                                          --
5--                  A D A . S T R I N G S . B O U N D E D                   --
6--                                                                          --
7--                                 S p e c                                  --
8--                                                                          --
9--          Copyright (C) 1992-2003 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 2,  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.  See the GNU General Public License --
21-- for  more details.  You should have  received  a copy of the GNU General --
22-- Public License  distributed with GNAT;  see file COPYING.  If not, write --
23-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
24-- MA 02111-1307, USA.                                                      --
25--                                                                          --
26-- As a special exception,  if other files  instantiate  generics from this --
27-- unit, or you link  this unit with other files  to produce an executable, --
28-- this  unit  does not  by itself cause  the resulting  executable  to  be --
29-- covered  by the  GNU  General  Public  License.  This exception does not --
30-- however invalidate  any other reasons why  the executable file  might be --
31-- covered by the  GNU Public License.                                      --
32--                                                                          --
33-- GNAT was originally developed  by the GNAT team at  New York University. --
34-- Extensive contributions were provided by Ada Core Technologies Inc.      --
35--                                                                          --
36------------------------------------------------------------------------------
37
38with Ada.Strings.Maps;
39with Ada.Strings.Superbounded;
40
41package Ada.Strings.Bounded is
42pragma Preelaborate (Bounded);
43
44   generic
45      Max : Positive;
46      --  Maximum length of a Bounded_String
47
48   package Generic_Bounded_Length is
49
50      Max_Length : constant Positive := Max;
51
52      type Bounded_String is private;
53
54      Null_Bounded_String : constant Bounded_String;
55
56      subtype Length_Range is Natural range 0 .. Max_Length;
57
58      function Length (Source : in Bounded_String) return Length_Range;
59
60      --------------------------------------------------------
61      -- Conversion, Concatenation, and Selection Functions --
62      --------------------------------------------------------
63
64      function To_Bounded_String
65        (Source : in String;
66         Drop   : in Truncation := Error)
67         return   Bounded_String;
68
69      function To_String (Source : in Bounded_String) return String;
70
71      function Append
72        (Left, Right : in Bounded_String;
73         Drop        : in Truncation  := Error)
74         return        Bounded_String;
75
76      function Append
77        (Left  : in Bounded_String;
78         Right : in String;
79         Drop  : in Truncation := Error)
80         return  Bounded_String;
81
82      function Append
83        (Left  : in String;
84         Right : in Bounded_String;
85         Drop  : in Truncation := Error)
86         return  Bounded_String;
87
88      function Append
89        (Left  : in Bounded_String;
90         Right : in Character;
91         Drop  : in Truncation := Error)
92         return  Bounded_String;
93
94      function Append
95        (Left  : in Character;
96         Right : in Bounded_String;
97         Drop  : in Truncation := Error)
98         return  Bounded_String;
99
100      procedure Append
101        (Source   : in out Bounded_String;
102         New_Item : in Bounded_String;
103         Drop     : in Truncation  := Error);
104
105      procedure Append
106        (Source   : in out Bounded_String;
107         New_Item : in String;
108         Drop     : in Truncation  := Error);
109
110      procedure Append
111        (Source   : in out Bounded_String;
112         New_Item : in Character;
113         Drop     : in Truncation  := Error);
114
115      function "&"
116        (Left, Right : in Bounded_String)
117         return        Bounded_String;
118
119      function "&"
120        (Left  : in Bounded_String;
121         Right : in String)
122         return  Bounded_String;
123
124      function "&"
125        (Left  : in String;
126         Right : in Bounded_String)
127         return  Bounded_String;
128
129      function "&"
130        (Left  : in Bounded_String;
131         Right : in Character)
132         return  Bounded_String;
133
134      function "&"
135        (Left  : in Character;
136         Right : in Bounded_String)
137         return  Bounded_String;
138
139      function Element
140        (Source : in Bounded_String;
141         Index  : in Positive)
142         return   Character;
143
144      procedure Replace_Element
145        (Source : in out Bounded_String;
146         Index  : in Positive;
147         By     : in Character);
148
149      function Slice
150        (Source : in Bounded_String;
151         Low    : in Positive;
152         High   : in Natural)
153         return   String;
154
155      function "="  (Left, Right : in Bounded_String) return Boolean;
156
157      function "="
158        (Left  : in Bounded_String;
159         Right : in String)
160         return  Boolean;
161
162      function "="
163        (Left  : in String;
164         Right : in Bounded_String)
165         return  Boolean;
166
167      function "<"  (Left, Right : in Bounded_String) return Boolean;
168
169      function "<"
170        (Left  : in Bounded_String;
171         Right : in String)
172         return  Boolean;
173
174      function "<"
175        (Left  : in String;
176         Right : in Bounded_String)
177         return  Boolean;
178
179      function "<=" (Left, Right : in Bounded_String) return Boolean;
180
181      function "<="
182        (Left  : in Bounded_String;
183         Right : in String)
184         return  Boolean;
185
186      function "<="
187        (Left  : in String;
188         Right : in Bounded_String)
189         return  Boolean;
190
191      function ">"  (Left, Right : in Bounded_String) return Boolean;
192
193      function ">"
194        (Left  : in Bounded_String;
195         Right : in String)
196         return  Boolean;
197
198      function ">"
199        (Left  : in String;
200         Right : in Bounded_String)
201         return  Boolean;
202
203      function ">=" (Left, Right : in Bounded_String) return Boolean;
204
205      function ">="
206        (Left  : in Bounded_String;
207         Right : in String)
208         return  Boolean;
209
210      function ">="
211        (Left  : in String;
212         Right : in Bounded_String)
213         return  Boolean;
214
215      ----------------------
216      -- Search Functions --
217      ----------------------
218
219      function Index
220        (Source  : in Bounded_String;
221         Pattern : in String;
222         Going   : in Direction := Forward;
223         Mapping : in Maps.Character_Mapping := Maps.Identity)
224         return    Natural;
225
226      function Index
227        (Source  : in Bounded_String;
228         Pattern : in String;
229         Going   : in Direction := Forward;
230         Mapping : in Maps.Character_Mapping_Function)
231         return    Natural;
232
233      function Index
234        (Source : in Bounded_String;
235         Set    : in Maps.Character_Set;
236         Test   : in Membership := Inside;
237         Going  : in Direction  := Forward)
238         return   Natural;
239
240      function Index_Non_Blank
241        (Source : in Bounded_String;
242         Going  : in Direction := Forward)
243         return   Natural;
244
245      function Count
246        (Source  : in Bounded_String;
247         Pattern : in String;
248         Mapping : in Maps.Character_Mapping := Maps.Identity)
249         return    Natural;
250
251      function Count
252        (Source  : in Bounded_String;
253         Pattern : in String;
254         Mapping : in Maps.Character_Mapping_Function)
255         return    Natural;
256
257      function Count
258        (Source : in Bounded_String;
259         Set    : in Maps.Character_Set)
260         return   Natural;
261
262      procedure Find_Token
263        (Source : in Bounded_String;
264         Set    : in Maps.Character_Set;
265         Test   : in Membership;
266         First  : out Positive;
267         Last   : out Natural);
268
269      ------------------------------------
270      -- String Translation Subprograms --
271      ------------------------------------
272
273      function Translate
274        (Source   : in Bounded_String;
275         Mapping  : in Maps.Character_Mapping)
276         return     Bounded_String;
277
278      procedure Translate
279        (Source   : in out Bounded_String;
280         Mapping  : in Maps.Character_Mapping);
281
282      function Translate
283        (Source  : in Bounded_String;
284         Mapping : in Maps.Character_Mapping_Function)
285         return    Bounded_String;
286
287      procedure Translate
288        (Source  : in out Bounded_String;
289         Mapping : in Maps.Character_Mapping_Function);
290
291      ---------------------------------------
292      -- String Transformation Subprograms --
293      ---------------------------------------
294
295      function Replace_Slice
296        (Source   : in Bounded_String;
297         Low      : in Positive;
298         High     : in Natural;
299         By       : in String;
300         Drop     : in Truncation := Error)
301         return     Bounded_String;
302
303      procedure Replace_Slice
304        (Source   : in out Bounded_String;
305         Low      : in Positive;
306         High     : in Natural;
307         By       : in String;
308         Drop     : in Truncation := Error);
309
310      function Insert
311        (Source   : in Bounded_String;
312         Before   : in Positive;
313         New_Item : in String;
314         Drop     : in Truncation := Error)
315         return     Bounded_String;
316
317      procedure Insert
318        (Source   : in out Bounded_String;
319         Before   : in Positive;
320         New_Item : in String;
321         Drop     : in Truncation := Error);
322
323      function Overwrite
324        (Source    : in Bounded_String;
325         Position  : in Positive;
326         New_Item  : in String;
327         Drop      : in Truncation := Error)
328         return      Bounded_String;
329
330      procedure Overwrite
331        (Source    : in out Bounded_String;
332         Position  : in Positive;
333         New_Item  : in String;
334         Drop      : in Truncation := Error);
335
336      function Delete
337        (Source  : in Bounded_String;
338         From    : in Positive;
339         Through : in Natural)
340         return    Bounded_String;
341
342      procedure Delete
343        (Source  : in out Bounded_String;
344         From    : in Positive;
345         Through : in Natural);
346
347      ---------------------------------
348      -- String Selector Subprograms --
349      ---------------------------------
350
351      function Trim
352        (Source : in Bounded_String;
353         Side   : in Trim_End)
354         return   Bounded_String;
355
356      procedure Trim
357        (Source : in out Bounded_String;
358         Side   : in Trim_End);
359
360      function Trim
361        (Source  : in Bounded_String;
362          Left   : in Maps.Character_Set;
363          Right  : in Maps.Character_Set)
364          return   Bounded_String;
365
366      procedure Trim
367        (Source : in out Bounded_String;
368         Left   : in Maps.Character_Set;
369         Right  : in Maps.Character_Set);
370
371      function Head
372        (Source : in Bounded_String;
373         Count  : in Natural;
374         Pad    : in Character := Space;
375         Drop   : in Truncation := Error)
376         return   Bounded_String;
377
378      procedure Head
379        (Source : in out Bounded_String;
380         Count  : in Natural;
381         Pad    : in Character  := Space;
382         Drop   : in Truncation := Error);
383
384      function Tail
385        (Source : in Bounded_String;
386         Count  : in Natural;
387         Pad    : in Character  := Space;
388         Drop   : in Truncation := Error)
389         return Bounded_String;
390
391      procedure Tail
392        (Source : in out Bounded_String;
393         Count  : in Natural;
394         Pad    : in Character  := Space;
395         Drop   : in Truncation := Error);
396
397      ------------------------------------
398      -- String Constructor Subprograms --
399      ------------------------------------
400
401      function "*"
402        (Left  : in Natural;
403         Right : in Character)
404         return  Bounded_String;
405
406      function "*"
407        (Left  : in Natural;
408         Right : in String)
409         return  Bounded_String;
410
411      function "*"
412        (Left  : in Natural;
413         Right : in Bounded_String)
414         return  Bounded_String;
415
416      function Replicate
417        (Count : in Natural;
418         Item  : in Character;
419         Drop  : in Truncation := Error)
420         return  Bounded_String;
421
422      function Replicate
423        (Count : in Natural;
424         Item  : in String;
425         Drop  : in Truncation := Error)
426         return  Bounded_String;
427
428      function Replicate
429        (Count : in Natural;
430         Item  : in Bounded_String;
431         Drop  : in Truncation := Error)
432         return  Bounded_String;
433
434   private
435
436      --  Most of the implementation is in the non generic package
437      --  Ada.Strings.Superbounded. Type Bounded_String is derived from type
438      --  Superbounded.Super_String with the maximum length constraint.
439      --  Except for five, all subprograms are renames of subprograms that
440      --  are inherited from Superbounded.Super_String.
441
442      type Bounded_String is new Superbounded.Super_String (Max_Length);
443
444      Null_Bounded_String : constant Bounded_String :=
445        (Max_Length     => Max_Length,
446         Current_Length => 0,
447         Data           => (1 .. Max_Length => ASCII.NUL));
448
449      pragma Inline (To_Bounded_String);
450
451      function Length (Source : in Bounded_String) return Length_Range
452        renames Super_Length;
453
454      function To_String (Source : in Bounded_String) return String
455        renames Super_To_String;
456
457      function Append
458        (Left, Right : in Bounded_String;
459         Drop        : in Truncation  := Error)
460         return        Bounded_String
461        renames Super_Append;
462
463      function Append
464        (Left  : in Bounded_String;
465         Right : in String;
466         Drop  : in Truncation := Error)
467         return  Bounded_String
468        renames Super_Append;
469
470      function Append
471        (Left  : in String;
472         Right : in Bounded_String;
473         Drop  : in Truncation := Error)
474         return  Bounded_String
475        renames Super_Append;
476
477      function Append
478        (Left  : in Bounded_String;
479         Right : in Character;
480         Drop  : in Truncation := Error)
481         return  Bounded_String
482        renames Super_Append;
483
484      function Append
485        (Left  : in Character;
486         Right : in Bounded_String;
487         Drop  : in Truncation := Error)
488         return  Bounded_String
489        renames Super_Append;
490
491      procedure Append
492        (Source   : in out Bounded_String;
493         New_Item : in Bounded_String;
494         Drop     : in Truncation  := Error)
495        renames Super_Append;
496
497      procedure Append
498        (Source   : in out Bounded_String;
499         New_Item : in String;
500         Drop     : in Truncation  := Error)
501        renames Super_Append;
502
503      procedure Append
504        (Source   : in out Bounded_String;
505         New_Item : in Character;
506         Drop     : in Truncation  := Error)
507        renames Super_Append;
508
509      function "&"
510        (Left, Right : in Bounded_String)
511         return        Bounded_String
512        renames Concat;
513
514      function "&"
515        (Left  : in Bounded_String;
516         Right : in String)
517         return  Bounded_String
518        renames Concat;
519
520      function "&"
521        (Left  : in String;
522         Right : in Bounded_String)
523         return  Bounded_String
524        renames Concat;
525
526      function "&"
527        (Left  : in Bounded_String;
528         Right : in Character)
529         return  Bounded_String
530        renames Concat;
531
532      function "&"
533        (Left  : in Character;
534         Right : in Bounded_String)
535         return  Bounded_String
536        renames Concat;
537
538      function Element
539        (Source : in Bounded_String;
540         Index  : in Positive)
541         return   Character
542        renames Super_Element;
543
544      procedure Replace_Element
545        (Source : in out Bounded_String;
546         Index  : in Positive;
547         By     : in Character)
548        renames Super_Replace_Element;
549
550      function Slice
551        (Source : in Bounded_String;
552         Low    : in Positive;
553         High   : in Natural)
554         return   String
555        renames Super_Slice;
556
557      function "="  (Left, Right : in Bounded_String) return Boolean
558        renames Equal;
559
560      function "="
561        (Left  : in Bounded_String;
562         Right : in String)
563         return  Boolean
564        renames Equal;
565
566      function "="
567        (Left  : in String;
568         Right : in Bounded_String)
569         return  Boolean
570        renames Equal;
571
572      function "<"  (Left, Right : in Bounded_String) return Boolean
573        renames Less;
574
575      function "<"
576        (Left  : in Bounded_String;
577         Right : in String)
578         return  Boolean
579        renames Less;
580
581      function "<"
582        (Left  : in String;
583         Right : in Bounded_String)
584         return  Boolean
585        renames Less;
586
587      function "<=" (Left, Right : in Bounded_String) return Boolean
588        renames Less_Or_Equal;
589
590      function "<="
591        (Left  : in Bounded_String;
592         Right : in String)
593         return  Boolean
594        renames Less_Or_Equal;
595
596      function "<="
597        (Left  : in String;
598         Right : in Bounded_String)
599         return  Boolean
600        renames Less_Or_Equal;
601
602      function ">"  (Left, Right : in Bounded_String) return Boolean
603        renames Greater;
604
605      function ">"
606        (Left  : in Bounded_String;
607         Right : in String)
608         return  Boolean
609        renames Greater;
610
611      function ">"
612        (Left  : in String;
613         Right : in Bounded_String)
614         return  Boolean
615        renames Greater;
616
617      function ">=" (Left, Right : in Bounded_String) return Boolean
618        renames Greater_Or_Equal;
619
620      function ">="
621        (Left  : in Bounded_String;
622         Right : in String)
623         return  Boolean
624        renames Greater_Or_Equal;
625
626      function ">="
627        (Left  : in String;
628         Right : in Bounded_String)
629         return  Boolean
630        renames Greater_Or_Equal;
631
632      function Index
633        (Source  : in Bounded_String;
634         Pattern : in String;
635         Going   : in Direction := Forward;
636         Mapping : in Maps.Character_Mapping := Maps.Identity)
637         return    Natural
638        renames Super_Index;
639
640      function Index
641        (Source  : in Bounded_String;
642         Pattern : in String;
643         Going   : in Direction := Forward;
644         Mapping : in Maps.Character_Mapping_Function)
645         return    Natural
646        renames Super_Index;
647
648      function Index
649        (Source : in Bounded_String;
650         Set    : in Maps.Character_Set;
651         Test   : in Membership := Inside;
652         Going  : in Direction  := Forward)
653         return   Natural
654        renames Super_Index;
655
656      function Index_Non_Blank
657        (Source : in Bounded_String;
658         Going  : in Direction := Forward)
659         return   Natural
660        renames Super_Index_Non_Blank;
661
662      function Count
663        (Source  : in Bounded_String;
664         Pattern : in String;
665         Mapping : in Maps.Character_Mapping := Maps.Identity)
666         return    Natural
667        renames Super_Count;
668
669      function Count
670        (Source  : in Bounded_String;
671         Pattern : in String;
672         Mapping : in Maps.Character_Mapping_Function)
673         return    Natural
674        renames Super_Count;
675
676      function Count
677        (Source : in Bounded_String;
678         Set    : in Maps.Character_Set)
679         return   Natural
680        renames Super_Count;
681
682      procedure Find_Token
683        (Source : in Bounded_String;
684         Set    : in Maps.Character_Set;
685         Test   : in Membership;
686         First  : out Positive;
687         Last   : out Natural)
688        renames Super_Find_Token;
689
690      function Translate
691        (Source   : in Bounded_String;
692         Mapping  : in Maps.Character_Mapping)
693         return     Bounded_String
694        renames Super_Translate;
695
696      procedure Translate
697        (Source   : in out Bounded_String;
698         Mapping  : in Maps.Character_Mapping)
699        renames Super_Translate;
700
701      function Translate
702        (Source  : in Bounded_String;
703         Mapping : in Maps.Character_Mapping_Function)
704         return    Bounded_String
705        renames Super_Translate;
706
707      procedure Translate
708        (Source  : in out Bounded_String;
709         Mapping : in Maps.Character_Mapping_Function)
710        renames Super_Translate;
711
712      function Replace_Slice
713        (Source   : in Bounded_String;
714         Low      : in Positive;
715         High     : in Natural;
716         By       : in String;
717         Drop     : in Truncation := Error)
718         return     Bounded_String
719        renames Super_Replace_Slice;
720
721      procedure Replace_Slice
722        (Source   : in out Bounded_String;
723         Low      : in Positive;
724         High     : in Natural;
725         By       : in String;
726         Drop     : in Truncation := Error)
727        renames Super_Replace_Slice;
728
729      function Insert
730        (Source   : in Bounded_String;
731         Before   : in Positive;
732         New_Item : in String;
733         Drop     : in Truncation := Error)
734         return     Bounded_String
735        renames Super_Insert;
736
737      procedure Insert
738        (Source   : in out Bounded_String;
739         Before   : in Positive;
740         New_Item : in String;
741         Drop     : in Truncation := Error)
742        renames Super_Insert;
743
744      function Overwrite
745        (Source    : in Bounded_String;
746         Position  : in Positive;
747         New_Item  : in String;
748         Drop      : in Truncation := Error)
749         return      Bounded_String
750        renames Super_Overwrite;
751
752      procedure Overwrite
753        (Source    : in out Bounded_String;
754         Position  : in Positive;
755         New_Item  : in String;
756         Drop      : in Truncation := Error)
757        renames Super_Overwrite;
758
759      function Delete
760        (Source  : in Bounded_String;
761         From    : in Positive;
762         Through : in Natural)
763         return    Bounded_String
764        renames Super_Delete;
765
766      procedure Delete
767        (Source  : in out Bounded_String;
768         From    : in Positive;
769         Through : in Natural)
770        renames Super_Delete;
771
772      function Trim
773        (Source : in Bounded_String;
774         Side   : in Trim_End)
775         return   Bounded_String
776        renames Super_Trim;
777
778      procedure Trim
779        (Source : in out Bounded_String;
780         Side   : in Trim_End)
781        renames Super_Trim;
782
783      function Trim
784        (Source  : in Bounded_String;
785          Left   : in Maps.Character_Set;
786          Right  : in Maps.Character_Set)
787          return   Bounded_String
788        renames Super_Trim;
789
790      procedure Trim
791        (Source : in out Bounded_String;
792         Left   : in Maps.Character_Set;
793         Right  : in Maps.Character_Set)
794        renames Super_Trim;
795
796      function Head
797        (Source : in Bounded_String;
798         Count  : in Natural;
799         Pad    : in Character := Space;
800         Drop   : in Truncation := Error)
801         return   Bounded_String
802        renames Super_Head;
803
804      procedure Head
805        (Source : in out Bounded_String;
806         Count  : in Natural;
807         Pad    : in Character  := Space;
808         Drop   : in Truncation := Error)
809        renames Super_Head;
810
811      function Tail
812        (Source : in Bounded_String;
813         Count  : in Natural;
814         Pad    : in Character  := Space;
815         Drop   : in Truncation := Error)
816         return Bounded_String
817        renames Super_Tail;
818
819      procedure Tail
820        (Source : in out Bounded_String;
821         Count  : in Natural;
822         Pad    : in Character  := Space;
823         Drop   : in Truncation := Error)
824        renames Super_Tail;
825
826      function "*"
827        (Left  : in Natural;
828         Right : in Bounded_String)
829         return  Bounded_String
830        renames Times;
831
832      function Replicate
833        (Count : in Natural;
834         Item  : in Bounded_String;
835         Drop  : in Truncation := Error)
836         return  Bounded_String
837         renames Super_Replicate;
838
839   end Generic_Bounded_Length;
840
841end Ada.Strings.Bounded;
842