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 _ 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_Wide_Maps;
37with Ada.Strings.Wide_Wide_Superbounded;
38
39package Ada.Strings.Wide_Wide_Bounded is
40   pragma Preelaborate;
41
42   generic
43      Max : Positive;
44      --  Maximum length of a Bounded_Wide_Wide_String
45
46   package Generic_Bounded_Length is
47
48      Max_Length : constant Positive := Max;
49
50      type Bounded_Wide_Wide_String is private;
51      pragma Preelaborable_Initialization (Bounded_Wide_Wide_String);
52
53      Null_Bounded_Wide_Wide_String : constant Bounded_Wide_Wide_String;
54
55      subtype Length_Range is Natural range 0 .. Max_Length;
56
57      function Length (Source : Bounded_Wide_Wide_String) return Length_Range;
58
59      --------------------------------------------------------
60      -- Conversion, Concatenation, and Selection Functions --
61      --------------------------------------------------------
62
63      function To_Bounded_Wide_Wide_String
64        (Source : Wide_Wide_String;
65         Drop   : Truncation := Error) return Bounded_Wide_Wide_String;
66
67      function To_Wide_Wide_String
68        (Source : Bounded_Wide_Wide_String) return Wide_Wide_String;
69
70      procedure Set_Bounded_Wide_Wide_String
71        (Target : out Bounded_Wide_Wide_String;
72         Source : Wide_Wide_String;
73         Drop   : Truncation := Error);
74      pragma Ada_05 (Set_Bounded_Wide_Wide_String);
75
76      function Append
77        (Left  : Bounded_Wide_Wide_String;
78         Right : Bounded_Wide_Wide_String;
79         Drop  : Truncation  := Error) return Bounded_Wide_Wide_String;
80
81      function Append
82        (Left  : Bounded_Wide_Wide_String;
83         Right : Wide_Wide_String;
84         Drop  : Truncation := Error) return Bounded_Wide_Wide_String;
85
86      function Append
87        (Left  : Wide_Wide_String;
88         Right : Bounded_Wide_Wide_String;
89         Drop  : Truncation := Error) return Bounded_Wide_Wide_String;
90
91      function Append
92        (Left  : Bounded_Wide_Wide_String;
93         Right : Wide_Wide_Character;
94         Drop  : Truncation := Error) return Bounded_Wide_Wide_String;
95
96      function Append
97        (Left  : Wide_Wide_Character;
98         Right : Bounded_Wide_Wide_String;
99         Drop  : Truncation := Error) return Bounded_Wide_Wide_String;
100
101      procedure Append
102        (Source   : in out Bounded_Wide_Wide_String;
103         New_Item : Bounded_Wide_Wide_String;
104         Drop     : Truncation  := Error);
105
106      procedure Append
107        (Source   : in out Bounded_Wide_Wide_String;
108         New_Item : Wide_Wide_String;
109         Drop     : Truncation  := Error);
110
111      procedure Append
112        (Source   : in out Bounded_Wide_Wide_String;
113         New_Item : Wide_Wide_Character;
114         Drop     : Truncation  := Error);
115
116      function "&"
117        (Left  : Bounded_Wide_Wide_String;
118         Right : Bounded_Wide_Wide_String) return Bounded_Wide_Wide_String;
119
120      function "&"
121        (Left  : Bounded_Wide_Wide_String;
122         Right : Wide_Wide_String) return Bounded_Wide_Wide_String;
123
124      function "&"
125        (Left  : Wide_Wide_String;
126         Right : Bounded_Wide_Wide_String) return Bounded_Wide_Wide_String;
127
128      function "&"
129        (Left  : Bounded_Wide_Wide_String;
130         Right : Wide_Wide_Character) return Bounded_Wide_Wide_String;
131
132      function "&"
133        (Left  : Wide_Wide_Character;
134         Right : Bounded_Wide_Wide_String) return Bounded_Wide_Wide_String;
135
136      function Element
137        (Source : Bounded_Wide_Wide_String;
138         Index  : Positive) return Wide_Wide_Character;
139
140      procedure Replace_Element
141        (Source : in out Bounded_Wide_Wide_String;
142         Index  : Positive;
143         By     : Wide_Wide_Character);
144
145      function Slice
146        (Source : Bounded_Wide_Wide_String;
147         Low    : Positive;
148         High   : Natural) return Wide_Wide_String;
149
150      function Bounded_Slice
151        (Source : Bounded_Wide_Wide_String;
152         Low    : Positive;
153         High   : Natural) return Bounded_Wide_Wide_String;
154      pragma Ada_05 (Bounded_Slice);
155
156      procedure Bounded_Slice
157        (Source : Bounded_Wide_Wide_String;
158         Target : out Bounded_Wide_Wide_String;
159         Low    : Positive;
160         High   : Natural);
161      pragma Ada_05 (Bounded_Slice);
162
163      function "="
164        (Left  : Bounded_Wide_Wide_String;
165         Right : Bounded_Wide_Wide_String) return Boolean;
166
167      function "="
168        (Left  : Bounded_Wide_Wide_String;
169         Right : Wide_Wide_String) return Boolean;
170
171      function "="
172        (Left  : Wide_Wide_String;
173         Right : Bounded_Wide_Wide_String) return Boolean;
174
175      function "<"
176        (Left  : Bounded_Wide_Wide_String;
177         Right : Bounded_Wide_Wide_String) return Boolean;
178
179      function "<"
180        (Left  : Bounded_Wide_Wide_String;
181         Right : Wide_Wide_String) return Boolean;
182
183      function "<"
184        (Left  : Wide_Wide_String;
185         Right : Bounded_Wide_Wide_String) return Boolean;
186
187      function "<="
188        (Left  : Bounded_Wide_Wide_String;
189         Right : Bounded_Wide_Wide_String) return Boolean;
190
191      function "<="
192        (Left  : Bounded_Wide_Wide_String;
193         Right : Wide_Wide_String) return Boolean;
194
195      function "<="
196        (Left  : Wide_Wide_String;
197         Right : Bounded_Wide_Wide_String) return Boolean;
198
199      function ">"
200        (Left  : Bounded_Wide_Wide_String;
201         Right : Bounded_Wide_Wide_String) return Boolean;
202
203      function ">"
204        (Left  : Bounded_Wide_Wide_String;
205         Right : Wide_Wide_String) return Boolean;
206
207      function ">"
208        (Left  : Wide_Wide_String;
209         Right : Bounded_Wide_Wide_String) return Boolean;
210
211      function ">="
212        (Left  : Bounded_Wide_Wide_String;
213         Right : Bounded_Wide_Wide_String) return Boolean;
214
215      function ">="
216        (Left  : Bounded_Wide_Wide_String;
217         Right : Wide_Wide_String) return Boolean;
218
219      function ">="
220        (Left  : Wide_Wide_String;
221         Right : Bounded_Wide_Wide_String) return Boolean;
222
223      ----------------------
224      -- Search Functions --
225      ----------------------
226
227      function Index
228        (Source  : Bounded_Wide_Wide_String;
229         Pattern : Wide_Wide_String;
230         Going   : Direction := Forward;
231         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
232                     Wide_Wide_Maps.Identity)
233         return Natural;
234
235      function Index
236        (Source  : Bounded_Wide_Wide_String;
237         Pattern : Wide_Wide_String;
238         Going   : Direction := Forward;
239         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
240         return Natural;
241
242      function Index
243        (Source : Bounded_Wide_Wide_String;
244         Set    : Wide_Wide_Maps.Wide_Wide_Character_Set;
245         Test   : Membership := Inside;
246         Going  : Direction  := Forward) return Natural;
247
248      function Index
249        (Source  : Bounded_Wide_Wide_String;
250         Pattern : Wide_Wide_String;
251         From    : Positive;
252         Going   : Direction := Forward;
253         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
254                     Wide_Wide_Maps.Identity)
255         return Natural;
256      pragma Ada_05 (Index);
257
258      function Index
259        (Source  : Bounded_Wide_Wide_String;
260         Pattern : Wide_Wide_String;
261         From    : Positive;
262         Going   : Direction := Forward;
263         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
264         return Natural;
265      pragma Ada_05 (Index);
266
267      function Index
268        (Source : Bounded_Wide_Wide_String;
269         Set    : Wide_Wide_Maps.Wide_Wide_Character_Set;
270         From   : Positive;
271         Test   : Membership := Inside;
272         Going  : Direction := Forward) return Natural;
273      pragma Ada_05 (Index);
274
275      function Index_Non_Blank
276        (Source : Bounded_Wide_Wide_String;
277         Going  : Direction := Forward) return Natural;
278
279      function Index_Non_Blank
280        (Source : Bounded_Wide_Wide_String;
281         From   : Positive;
282         Going  : Direction := Forward) return Natural;
283      pragma Ada_05 (Index_Non_Blank);
284
285      function Count
286        (Source  : Bounded_Wide_Wide_String;
287         Pattern : Wide_Wide_String;
288         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
289                     Wide_Wide_Maps.Identity)
290         return Natural;
291
292      function Count
293        (Source  : Bounded_Wide_Wide_String;
294         Pattern : Wide_Wide_String;
295         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
296         return Natural;
297
298      function Count
299        (Source : Bounded_Wide_Wide_String;
300         Set    : Wide_Wide_Maps.Wide_Wide_Character_Set) return Natural;
301
302      procedure Find_Token
303        (Source : Bounded_Wide_Wide_String;
304         Set    : Wide_Wide_Maps.Wide_Wide_Character_Set;
305         From   : Positive;
306         Test   : Membership;
307         First  : out Positive;
308         Last   : out Natural);
309      pragma Ada_2012 (Find_Token);
310
311      procedure Find_Token
312        (Source : Bounded_Wide_Wide_String;
313         Set    : Wide_Wide_Maps.Wide_Wide_Character_Set;
314         Test   : Membership;
315         First  : out Positive;
316         Last   : out Natural);
317
318      ------------------------------------
319      -- String Translation Subprograms --
320      ------------------------------------
321
322      function Translate
323        (Source  : Bounded_Wide_Wide_String;
324         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
325         return Bounded_Wide_Wide_String;
326
327      procedure Translate
328        (Source  : in out Bounded_Wide_Wide_String;
329         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping);
330
331      function Translate
332        (Source  : Bounded_Wide_Wide_String;
333         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
334         return Bounded_Wide_Wide_String;
335
336      procedure Translate
337        (Source  : in out Bounded_Wide_Wide_String;
338         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function);
339
340      ---------------------------------------
341      -- String Transformation Subprograms --
342      ---------------------------------------
343
344      function Replace_Slice
345        (Source : Bounded_Wide_Wide_String;
346         Low    : Positive;
347         High   : Natural;
348         By     : Wide_Wide_String;
349         Drop   : Truncation := Error) return Bounded_Wide_Wide_String;
350
351      procedure Replace_Slice
352        (Source   : in out Bounded_Wide_Wide_String;
353         Low      : Positive;
354         High     : Natural;
355         By       : Wide_Wide_String;
356         Drop     : Truncation := Error);
357
358      function Insert
359        (Source   : Bounded_Wide_Wide_String;
360         Before   : Positive;
361         New_Item : Wide_Wide_String;
362         Drop     : Truncation := Error) return Bounded_Wide_Wide_String;
363
364      procedure Insert
365        (Source   : in out Bounded_Wide_Wide_String;
366         Before   : Positive;
367         New_Item : Wide_Wide_String;
368         Drop     : Truncation := Error);
369
370      function Overwrite
371        (Source   : Bounded_Wide_Wide_String;
372         Position : Positive;
373         New_Item : Wide_Wide_String;
374         Drop     : Truncation := Error) return Bounded_Wide_Wide_String;
375
376      procedure Overwrite
377        (Source    : in out Bounded_Wide_Wide_String;
378         Position  : Positive;
379         New_Item  : Wide_Wide_String;
380         Drop      : Truncation := Error);
381
382      function Delete
383        (Source  : Bounded_Wide_Wide_String;
384         From    : Positive;
385         Through : Natural) return Bounded_Wide_Wide_String;
386
387      procedure Delete
388        (Source  : in out Bounded_Wide_Wide_String;
389         From    : Positive;
390         Through : Natural);
391
392      ---------------------------------
393      -- String Selector Subprograms --
394      ---------------------------------
395
396      function Trim
397        (Source : Bounded_Wide_Wide_String;
398         Side   : Trim_End) return Bounded_Wide_Wide_String;
399
400      procedure Trim
401        (Source : in out Bounded_Wide_Wide_String;
402         Side   : Trim_End);
403
404      function Trim
405        (Source : Bounded_Wide_Wide_String;
406          Left  : Wide_Wide_Maps.Wide_Wide_Character_Set;
407          Right : Wide_Wide_Maps.Wide_Wide_Character_Set)
408          return Bounded_Wide_Wide_String;
409
410      procedure Trim
411        (Source : in out Bounded_Wide_Wide_String;
412         Left   : Wide_Wide_Maps.Wide_Wide_Character_Set;
413         Right  : Wide_Wide_Maps.Wide_Wide_Character_Set);
414
415      function Head
416        (Source : Bounded_Wide_Wide_String;
417         Count  : Natural;
418         Pad    : Wide_Wide_Character := Wide_Wide_Space;
419         Drop   : Truncation := Error) return Bounded_Wide_Wide_String;
420
421      procedure Head
422        (Source : in out Bounded_Wide_Wide_String;
423         Count  : Natural;
424         Pad    : Wide_Wide_Character  := Wide_Wide_Space;
425         Drop   : Truncation := Error);
426
427      function Tail
428        (Source : Bounded_Wide_Wide_String;
429         Count  : Natural;
430         Pad    : Wide_Wide_Character := Wide_Wide_Space;
431         Drop   : Truncation     := Error) return Bounded_Wide_Wide_String;
432
433      procedure Tail
434        (Source : in out Bounded_Wide_Wide_String;
435         Count  : Natural;
436         Pad    : Wide_Wide_Character := Wide_Wide_Space;
437         Drop   : Truncation     := Error);
438
439      ------------------------------------
440      -- String Constructor Subprograms --
441      ------------------------------------
442
443      function "*"
444        (Left  : Natural;
445         Right : Wide_Wide_Character) return Bounded_Wide_Wide_String;
446
447      function "*"
448        (Left  : Natural;
449         Right : Wide_Wide_String) return Bounded_Wide_Wide_String;
450
451      function "*"
452        (Left  : Natural;
453         Right : Bounded_Wide_Wide_String) return Bounded_Wide_Wide_String;
454
455      function Replicate
456        (Count : Natural;
457         Item  : Wide_Wide_Character;
458         Drop  : Truncation := Error) return Bounded_Wide_Wide_String;
459
460      function Replicate
461        (Count : Natural;
462         Item  : Wide_Wide_String;
463         Drop  : Truncation := Error) return Bounded_Wide_Wide_String;
464
465      function Replicate
466        (Count : Natural;
467         Item  : Bounded_Wide_Wide_String;
468         Drop  : Truncation := Error) return Bounded_Wide_Wide_String;
469
470   private
471      --  Most of the implementation is in the separate non generic package
472      --  Ada.Strings.Wide_Wide_Superbounded. Type Bounded_Wide_Wide_String is
473      --  derived from type Wide_Wide_Superbounded.Super_String with the
474      --  maximum length constraint. In almost all cases, the routines in
475      --  Wide_Wide_Superbounded can be called with no requirement to pass the
476      --  maximum length explicitly, since there is at least one
477      --  Bounded_Wide_Wide_String argument from which the maximum length can
478      --  be obtained. For all such routines, the implementation in this
479      --  private part is simply renaming of the corresponding routine in the
480      --  super bouded package.
481
482      --  The five exceptions are the * and Replicate routines operating on
483      --  character values. For these cases, we have a routine in the body
484      --  that calls the superbounded routine passing the maximum length
485      --  explicitly as an extra parameter.
486
487      type Bounded_Wide_Wide_String is
488        new Wide_Wide_Superbounded.Super_String (Max_Length);
489      --  Deriving Bounded_Wide_Wide_String from
490      --  Wide_Wide_Superbounded.Super_String is the real trick, it ensures
491      --  that the type Bounded_Wide_Wide_String declared in the generic
492      --  instantiation is compatible with the Super_String type declared in
493      --  the Wide_Wide_Superbounded package.
494
495      Null_Bounded_Wide_Wide_String : constant Bounded_Wide_Wide_String :=
496                                   (Max_Length         => Max_Length,
497                                    Current_Length     => 0,
498                                    Data               =>
499                                      (1 .. Max_Length =>
500                                        Wide_Wide_Superbounded.Wide_Wide_NUL));
501
502      pragma Inline (To_Bounded_Wide_Wide_String);
503
504      procedure Set_Bounded_Wide_Wide_String
505        (Target : out Bounded_Wide_Wide_String;
506         Source : Wide_Wide_String;
507         Drop   : Truncation := Error)
508         renames Set_Super_String;
509
510      function Length
511        (Source : Bounded_Wide_Wide_String) return Length_Range
512         renames Super_Length;
513
514      function To_Wide_Wide_String
515        (Source : Bounded_Wide_Wide_String) return Wide_Wide_String
516         renames Super_To_String;
517
518      function Append
519        (Left  : Bounded_Wide_Wide_String;
520         Right : Bounded_Wide_Wide_String;
521         Drop  : Truncation  := Error) return Bounded_Wide_Wide_String
522         renames Super_Append;
523
524      function Append
525        (Left  : Bounded_Wide_Wide_String;
526         Right : Wide_Wide_String;
527         Drop  : Truncation := Error) return Bounded_Wide_Wide_String
528         renames Super_Append;
529
530      function Append
531        (Left  : Wide_Wide_String;
532         Right : Bounded_Wide_Wide_String;
533         Drop  : Truncation := Error) return Bounded_Wide_Wide_String
534         renames Super_Append;
535
536      function Append
537        (Left  : Bounded_Wide_Wide_String;
538         Right : Wide_Wide_Character;
539         Drop  : Truncation := Error) return Bounded_Wide_Wide_String
540         renames Super_Append;
541
542      function Append
543        (Left  : Wide_Wide_Character;
544         Right : Bounded_Wide_Wide_String;
545         Drop  : Truncation := Error) return Bounded_Wide_Wide_String
546         renames Super_Append;
547
548      procedure Append
549        (Source   : in out Bounded_Wide_Wide_String;
550         New_Item : Bounded_Wide_Wide_String;
551         Drop     : Truncation  := Error)
552         renames Super_Append;
553
554      procedure Append
555        (Source   : in out Bounded_Wide_Wide_String;
556         New_Item : Wide_Wide_String;
557         Drop     : Truncation  := Error)
558         renames Super_Append;
559
560      procedure Append
561        (Source   : in out Bounded_Wide_Wide_String;
562         New_Item : Wide_Wide_Character;
563         Drop     : Truncation  := Error)
564         renames Super_Append;
565
566      function "&"
567        (Left  : Bounded_Wide_Wide_String;
568         Right : Bounded_Wide_Wide_String) return Bounded_Wide_Wide_String
569         renames Concat;
570
571      function "&"
572        (Left  : Bounded_Wide_Wide_String;
573         Right : Wide_Wide_String) return Bounded_Wide_Wide_String
574         renames Concat;
575
576      function "&"
577        (Left  : Wide_Wide_String;
578         Right : Bounded_Wide_Wide_String) return Bounded_Wide_Wide_String
579         renames Concat;
580
581      function "&"
582        (Left  : Bounded_Wide_Wide_String;
583         Right : Wide_Wide_Character) return Bounded_Wide_Wide_String
584         renames Concat;
585
586      function "&"
587        (Left  : Wide_Wide_Character;
588         Right : Bounded_Wide_Wide_String) return Bounded_Wide_Wide_String
589         renames Concat;
590
591      function Element
592        (Source : Bounded_Wide_Wide_String;
593         Index  : Positive) return Wide_Wide_Character
594         renames Super_Element;
595
596      procedure Replace_Element
597        (Source : in out Bounded_Wide_Wide_String;
598         Index  : Positive;
599         By     : Wide_Wide_Character)
600         renames Super_Replace_Element;
601
602      function Slice
603        (Source : Bounded_Wide_Wide_String;
604         Low    : Positive;
605         High   : Natural) return Wide_Wide_String
606         renames Super_Slice;
607
608      function Bounded_Slice
609        (Source : Bounded_Wide_Wide_String;
610         Low    : Positive;
611         High   : Natural) return Bounded_Wide_Wide_String
612         renames Super_Slice;
613
614      procedure Bounded_Slice
615        (Source : Bounded_Wide_Wide_String;
616         Target : out Bounded_Wide_Wide_String;
617         Low    : Positive;
618         High   : Natural)
619         renames Super_Slice;
620
621      function "="
622        (Left  : Bounded_Wide_Wide_String;
623         Right : Bounded_Wide_Wide_String) return Boolean
624         renames Equal;
625
626      function "="
627        (Left  : Bounded_Wide_Wide_String;
628         Right : Wide_Wide_String) return Boolean
629         renames Equal;
630
631      function "="
632        (Left  : Wide_Wide_String;
633         Right : Bounded_Wide_Wide_String) return Boolean
634         renames Equal;
635
636      function "<"
637        (Left  : Bounded_Wide_Wide_String;
638         Right : Bounded_Wide_Wide_String) return Boolean
639         renames Less;
640
641      function "<"
642        (Left  : Bounded_Wide_Wide_String;
643         Right : Wide_Wide_String) return Boolean
644         renames Less;
645
646      function "<"
647        (Left  : Wide_Wide_String;
648         Right : Bounded_Wide_Wide_String) return Boolean
649         renames Less;
650
651      function "<="
652        (Left  : Bounded_Wide_Wide_String;
653         Right : Bounded_Wide_Wide_String) return Boolean
654         renames Less_Or_Equal;
655
656      function "<="
657        (Left  : Bounded_Wide_Wide_String;
658         Right : Wide_Wide_String) return Boolean
659         renames Less_Or_Equal;
660
661      function "<="
662        (Left  : Wide_Wide_String;
663         Right : Bounded_Wide_Wide_String) return Boolean
664         renames Less_Or_Equal;
665
666      function ">"
667        (Left  : Bounded_Wide_Wide_String;
668         Right : Bounded_Wide_Wide_String) return Boolean
669         renames Greater;
670
671      function ">"
672        (Left  : Bounded_Wide_Wide_String;
673         Right : Wide_Wide_String) return Boolean
674         renames Greater;
675
676      function ">"
677        (Left  : Wide_Wide_String;
678         Right : Bounded_Wide_Wide_String) return Boolean
679         renames Greater;
680
681      function ">="
682        (Left  : Bounded_Wide_Wide_String;
683         Right : Bounded_Wide_Wide_String) return Boolean
684         renames Greater_Or_Equal;
685
686      function ">="
687        (Left  : Bounded_Wide_Wide_String;
688         Right : Wide_Wide_String) return Boolean
689         renames Greater_Or_Equal;
690
691      function ">="
692        (Left  : Wide_Wide_String;
693         Right : Bounded_Wide_Wide_String) return Boolean
694         renames Greater_Or_Equal;
695
696      function Index
697        (Source  : Bounded_Wide_Wide_String;
698         Pattern : Wide_Wide_String;
699         Going   : Direction := Forward;
700         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
701                     Wide_Wide_Maps.Identity)
702         return Natural
703         renames Super_Index;
704
705      function Index
706        (Source  : Bounded_Wide_Wide_String;
707         Pattern : Wide_Wide_String;
708         Going   : Direction := Forward;
709         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
710         return Natural
711         renames Super_Index;
712
713      function Index
714        (Source : Bounded_Wide_Wide_String;
715         Set    : Wide_Wide_Maps.Wide_Wide_Character_Set;
716         Test   : Membership := Inside;
717         Going  : Direction  := Forward) return Natural
718         renames Super_Index;
719
720      function Index
721        (Source  : Bounded_Wide_Wide_String;
722         Pattern : Wide_Wide_String;
723         From    : Positive;
724         Going   : Direction := Forward;
725         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
726                     Wide_Wide_Maps.Identity)
727         return Natural
728         renames Super_Index;
729
730      function Index
731        (Source  : Bounded_Wide_Wide_String;
732         Pattern : Wide_Wide_String;
733         From    : Positive;
734         Going   : Direction := Forward;
735         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
736         return Natural
737      renames Super_Index;
738
739      function Index
740        (Source : Bounded_Wide_Wide_String;
741         Set    : Wide_Wide_Maps.Wide_Wide_Character_Set;
742         From   : Positive;
743         Test   : Membership := Inside;
744         Going  : Direction := Forward) return Natural
745      renames Super_Index;
746
747      function Index_Non_Blank
748        (Source : Bounded_Wide_Wide_String;
749         Going  : Direction := Forward) return Natural
750         renames Super_Index_Non_Blank;
751
752      function Index_Non_Blank
753        (Source : Bounded_Wide_Wide_String;
754         From   : Positive;
755         Going  : Direction := Forward) return Natural
756         renames Super_Index_Non_Blank;
757
758      function Count
759        (Source  : Bounded_Wide_Wide_String;
760         Pattern : Wide_Wide_String;
761         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
762                     Wide_Wide_Maps.Identity)
763         return Natural
764         renames Super_Count;
765
766      function Count
767        (Source  : Bounded_Wide_Wide_String;
768         Pattern : Wide_Wide_String;
769         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
770         return Natural
771         renames Super_Count;
772
773      function Count
774        (Source : Bounded_Wide_Wide_String;
775         Set    : Wide_Wide_Maps.Wide_Wide_Character_Set) return Natural
776         renames Super_Count;
777
778      procedure Find_Token
779        (Source : Bounded_Wide_Wide_String;
780         Set    : Wide_Wide_Maps.Wide_Wide_Character_Set;
781         From   : Positive;
782         Test   : Membership;
783         First  : out Positive;
784         Last   : out Natural)
785         renames Super_Find_Token;
786
787      procedure Find_Token
788        (Source : Bounded_Wide_Wide_String;
789         Set    : Wide_Wide_Maps.Wide_Wide_Character_Set;
790         Test   : Membership;
791         First  : out Positive;
792         Last   : out Natural)
793         renames Super_Find_Token;
794
795      function Translate
796        (Source  : Bounded_Wide_Wide_String;
797         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
798         return Bounded_Wide_Wide_String
799         renames Super_Translate;
800
801      procedure Translate
802        (Source   : in out Bounded_Wide_Wide_String;
803         Mapping  : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
804         renames Super_Translate;
805
806      function Translate
807        (Source  : Bounded_Wide_Wide_String;
808         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
809         return Bounded_Wide_Wide_String
810         renames Super_Translate;
811
812      procedure Translate
813        (Source  : in out Bounded_Wide_Wide_String;
814         Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
815         renames Super_Translate;
816
817      function Replace_Slice
818        (Source : Bounded_Wide_Wide_String;
819         Low    : Positive;
820         High   : Natural;
821         By     : Wide_Wide_String;
822         Drop   : Truncation := Error) return Bounded_Wide_Wide_String
823         renames Super_Replace_Slice;
824
825      procedure Replace_Slice
826        (Source   : in out Bounded_Wide_Wide_String;
827         Low      : Positive;
828         High     : Natural;
829         By       : Wide_Wide_String;
830         Drop     : Truncation := Error)
831         renames Super_Replace_Slice;
832
833      function Insert
834        (Source   : Bounded_Wide_Wide_String;
835         Before   : Positive;
836         New_Item : Wide_Wide_String;
837         Drop     : Truncation := Error) return Bounded_Wide_Wide_String
838         renames Super_Insert;
839
840      procedure Insert
841        (Source   : in out Bounded_Wide_Wide_String;
842         Before   : Positive;
843         New_Item : Wide_Wide_String;
844         Drop     : Truncation := Error)
845         renames Super_Insert;
846
847      function Overwrite
848        (Source   : Bounded_Wide_Wide_String;
849         Position : Positive;
850         New_Item : Wide_Wide_String;
851         Drop     : Truncation := Error) return Bounded_Wide_Wide_String
852         renames Super_Overwrite;
853
854      procedure Overwrite
855        (Source    : in out Bounded_Wide_Wide_String;
856         Position  : Positive;
857         New_Item  : Wide_Wide_String;
858         Drop      : Truncation := Error)
859         renames Super_Overwrite;
860
861      function Delete
862        (Source  : Bounded_Wide_Wide_String;
863         From    : Positive;
864         Through : Natural) return Bounded_Wide_Wide_String
865         renames Super_Delete;
866
867      procedure Delete
868        (Source  : in out Bounded_Wide_Wide_String;
869         From    : Positive;
870         Through : Natural)
871         renames Super_Delete;
872
873      function Trim
874        (Source : Bounded_Wide_Wide_String;
875         Side   : Trim_End) return Bounded_Wide_Wide_String
876         renames Super_Trim;
877
878      procedure Trim
879        (Source : in out Bounded_Wide_Wide_String;
880         Side   : Trim_End)
881         renames Super_Trim;
882
883      function Trim
884        (Source : Bounded_Wide_Wide_String;
885         Left   : Wide_Wide_Maps.Wide_Wide_Character_Set;
886         Right  : Wide_Wide_Maps.Wide_Wide_Character_Set)
887         return Bounded_Wide_Wide_String
888         renames Super_Trim;
889
890      procedure Trim
891        (Source : in out Bounded_Wide_Wide_String;
892         Left   : Wide_Wide_Maps.Wide_Wide_Character_Set;
893         Right  : Wide_Wide_Maps.Wide_Wide_Character_Set)
894         renames Super_Trim;
895
896      function Head
897        (Source : Bounded_Wide_Wide_String;
898         Count  : Natural;
899         Pad    : Wide_Wide_Character := Wide_Wide_Space;
900         Drop   : Truncation     := Error) return Bounded_Wide_Wide_String
901         renames Super_Head;
902
903      procedure Head
904        (Source : in out Bounded_Wide_Wide_String;
905         Count  : Natural;
906         Pad    : Wide_Wide_Character := Wide_Wide_Space;
907         Drop   : Truncation     := Error)
908         renames Super_Head;
909
910      function Tail
911        (Source : Bounded_Wide_Wide_String;
912         Count  : Natural;
913         Pad    : Wide_Wide_Character := Wide_Wide_Space;
914         Drop   : Truncation     := Error) return Bounded_Wide_Wide_String
915         renames Super_Tail;
916
917      procedure Tail
918        (Source : in out Bounded_Wide_Wide_String;
919         Count  : Natural;
920         Pad    : Wide_Wide_Character := Wide_Wide_Space;
921         Drop   : Truncation := Error)
922         renames Super_Tail;
923
924      function "*"
925        (Left  : Natural;
926         Right : Bounded_Wide_Wide_String) return Bounded_Wide_Wide_String
927         renames Times;
928
929      function Replicate
930        (Count : Natural;
931         Item  : Bounded_Wide_Wide_String;
932         Drop  : Truncation := Error) return Bounded_Wide_Wide_String
933         renames Super_Replicate;
934
935   end Generic_Bounded_Length;
936
937end Ada.Strings.Wide_Wide_Bounded;
938