File : a-stzunb.ads


   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 --                                                                          --
  23 --                                                                          --
  24 --                                                                          --
  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 with Ada.Strings.Wide_Wide_Maps;
  37 with Ada.Finalization;
  38 
  39 package Ada.Strings.Wide_Wide_Unbounded is
  40    pragma Preelaborate;
  41 
  42    type Unbounded_Wide_Wide_String is private;
  43    pragma Preelaborable_Initialization (Unbounded_Wide_Wide_String);
  44 
  45    Null_Unbounded_Wide_Wide_String : constant Unbounded_Wide_Wide_String;
  46 
  47    function Length (Source : Unbounded_Wide_Wide_String) return Natural;
  48 
  49    type Wide_Wide_String_Access is access all Wide_Wide_String;
  50 
  51    procedure Free (X : in out Wide_Wide_String_Access);
  52 
  53    --------------------------------------------------------
  54    -- Conversion, Concatenation, and Selection Functions --
  55    --------------------------------------------------------
  56 
  57    function To_Unbounded_Wide_Wide_String
  58      (Source : Wide_Wide_String) return Unbounded_Wide_Wide_String;
  59 
  60    function To_Unbounded_Wide_Wide_String
  61      (Length : Natural) return Unbounded_Wide_Wide_String;
  62 
  63    function To_Wide_Wide_String
  64      (Source : Unbounded_Wide_Wide_String) return Wide_Wide_String;
  65 
  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);
  70 
  71    procedure Append
  72      (Source   : in out Unbounded_Wide_Wide_String;
  73       New_Item : Unbounded_Wide_Wide_String);
  74 
  75    procedure Append
  76      (Source   : in out Unbounded_Wide_Wide_String;
  77       New_Item : Wide_Wide_String);
  78 
  79    procedure Append
  80      (Source   : in out Unbounded_Wide_Wide_String;
  81       New_Item : Wide_Wide_Character);
  82 
  83    function "&"
  84      (Left  : Unbounded_Wide_Wide_String;
  85       Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
  86 
  87    function "&"
  88      (Left  : Unbounded_Wide_Wide_String;
  89       Right : Wide_Wide_String) return Unbounded_Wide_Wide_String;
  90 
  91    function "&"
  92      (Left  : Wide_Wide_String;
  93       Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
  94 
  95    function "&"
  96      (Left  : Unbounded_Wide_Wide_String;
  97       Right : Wide_Wide_Character) return Unbounded_Wide_Wide_String;
  98 
  99    function "&"
 100      (Left  : Wide_Wide_Character;
 101       Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
 102 
 103    function Element
 104      (Source : Unbounded_Wide_Wide_String;
 105       Index  : Positive) return Wide_Wide_Character;
 106 
 107    procedure Replace_Element
 108      (Source : in out Unbounded_Wide_Wide_String;
 109       Index  : Positive;
 110       By     : Wide_Wide_Character);
 111 
 112    function Slice
 113      (Source : Unbounded_Wide_Wide_String;
 114       Low    : Positive;
 115       High   : Natural) return Wide_Wide_String;
 116 
 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);
 122 
 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);
 129 
 130    function "="
 131      (Left  : Unbounded_Wide_Wide_String;
 132       Right : Unbounded_Wide_Wide_String) return Boolean;
 133 
 134    function "="
 135      (Left  : Unbounded_Wide_Wide_String;
 136       Right : Wide_Wide_String) return Boolean;
 137 
 138    function "="
 139      (Left  : Wide_Wide_String;
 140       Right : Unbounded_Wide_Wide_String) return Boolean;
 141 
 142    function "<"
 143      (Left  : Unbounded_Wide_Wide_String;
 144       Right : Unbounded_Wide_Wide_String) return Boolean;
 145 
 146    function "<"
 147      (Left  : Unbounded_Wide_Wide_String;
 148       Right : Wide_Wide_String) return Boolean;
 149 
 150    function "<"
 151      (Left  : Wide_Wide_String;
 152       Right : Unbounded_Wide_Wide_String) return Boolean;
 153 
 154    function "<="
 155      (Left  : Unbounded_Wide_Wide_String;
 156       Right : Unbounded_Wide_Wide_String) return Boolean;
 157 
 158    function "<="
 159      (Left  : Unbounded_Wide_Wide_String;
 160       Right : Wide_Wide_String) return Boolean;
 161 
 162    function "<="
 163      (Left  : Wide_Wide_String;
 164       Right : Unbounded_Wide_Wide_String) return Boolean;
 165 
 166    function ">"
 167      (Left  : Unbounded_Wide_Wide_String;
 168       Right : Unbounded_Wide_Wide_String) return Boolean;
 169 
 170    function ">"
 171      (Left  : Unbounded_Wide_Wide_String;
 172       Right : Wide_Wide_String) return Boolean;
 173 
 174    function ">"
 175      (Left  : Wide_Wide_String;
 176       Right : Unbounded_Wide_Wide_String) return Boolean;
 177 
 178    function ">="
 179      (Left  : Unbounded_Wide_Wide_String;
 180       Right : Unbounded_Wide_Wide_String) return Boolean;
 181 
 182    function ">="
 183      (Left  : Unbounded_Wide_Wide_String;
 184       Right : Wide_Wide_String) return Boolean;
 185 
 186    function ">="
 187      (Left  : Wide_Wide_String;
 188       Right : Unbounded_Wide_Wide_String) return Boolean;
 189 
 190    ------------------------
 191    -- Search Subprograms --
 192    ------------------------
 193 
 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;
 201 
 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;
 208 
 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;
 214 
 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);
 224 
 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);
 233 
 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);
 241 
 242    function Index_Non_Blank
 243      (Source : Unbounded_Wide_Wide_String;
 244       Going  : Direction := Forward) return Natural;
 245 
 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);
 251 
 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;
 258 
 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;
 264 
 265    function Count
 266      (Source : Unbounded_Wide_Wide_String;
 267       Set    : Wide_Wide_Maps.Wide_Wide_Character_Set) return Natural;
 268 
 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);
 277 
 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);
 284 
 285    ------------------------------------
 286    -- String Translation Subprograms --
 287    ------------------------------------
 288 
 289    function Translate
 290      (Source  : Unbounded_Wide_Wide_String;
 291       Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
 292       return Unbounded_Wide_Wide_String;
 293 
 294    procedure Translate
 295      (Source  : in out Unbounded_Wide_Wide_String;
 296       Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping);
 297 
 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;
 302 
 303    procedure Translate
 304      (Source  : in out Unbounded_Wide_Wide_String;
 305       Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function);
 306 
 307    ---------------------------------------
 308    -- String Transformation Subprograms --
 309    ---------------------------------------
 310 
 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;
 316 
 317    procedure Replace_Slice
 318      (Source : in out Unbounded_Wide_Wide_String;
 319       Low    : Positive;
 320       High   : Natural;
 321       By     : Wide_Wide_String);
 322 
 323    function Insert
 324      (Source   : Unbounded_Wide_Wide_String;
 325       Before   : Positive;
 326       New_Item : Wide_Wide_String) return Unbounded_Wide_Wide_String;
 327 
 328    procedure Insert
 329      (Source   : in out Unbounded_Wide_Wide_String;
 330       Before   : Positive;
 331       New_Item : Wide_Wide_String);
 332 
 333    function Overwrite
 334      (Source   : Unbounded_Wide_Wide_String;
 335       Position : Positive;
 336       New_Item : Wide_Wide_String) return Unbounded_Wide_Wide_String;
 337 
 338    procedure Overwrite
 339      (Source   : in out Unbounded_Wide_Wide_String;
 340       Position : Positive;
 341       New_Item : Wide_Wide_String);
 342 
 343    function Delete
 344      (Source  : Unbounded_Wide_Wide_String;
 345       From    : Positive;
 346       Through : Natural) return Unbounded_Wide_Wide_String;
 347 
 348    procedure Delete
 349      (Source  : in out Unbounded_Wide_Wide_String;
 350       From    : Positive;
 351       Through : Natural);
 352 
 353    function Trim
 354      (Source : Unbounded_Wide_Wide_String;
 355       Side   : Trim_End) return Unbounded_Wide_Wide_String;
 356 
 357    procedure Trim
 358      (Source : in out Unbounded_Wide_Wide_String;
 359       Side   : Trim_End);
 360 
 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;
 366 
 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);
 371 
 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;
 377 
 378    procedure Head
 379      (Source : in out Unbounded_Wide_Wide_String;
 380       Count  : Natural;
 381       Pad    : Wide_Wide_Character := Wide_Wide_Space);
 382 
 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;
 388 
 389    procedure Tail
 390      (Source : in out Unbounded_Wide_Wide_String;
 391       Count  : Natural;
 392       Pad    : Wide_Wide_Character := Wide_Wide_Space);
 393 
 394    function "*"
 395      (Left  : Natural;
 396       Right : Wide_Wide_Character) return Unbounded_Wide_Wide_String;
 397 
 398    function "*"
 399      (Left  : Natural;
 400       Right : Wide_Wide_String) return Unbounded_Wide_Wide_String;
 401 
 402    function "*"
 403      (Left  : Natural;
 404       Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
 405 
 406 private
 407    pragma Inline (Length);
 408 
 409    package AF renames Ada.Finalization;
 410 
 411    Null_Wide_Wide_String : aliased Wide_Wide_String := "";
 412 
 413    function To_Unbounded_Wide
 414      (S : Wide_Wide_String) return Unbounded_Wide_Wide_String
 415      renames To_Unbounded_Wide_Wide_String;
 416 
 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;
 421 
 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).
 428 
 429    pragma Stream_Convert
 430      (Unbounded_Wide_Wide_String, To_Unbounded_Wide, To_Wide_Wide_String);
 431 
 432    pragma Finalize_Storage_Only (Unbounded_Wide_Wide_String);
 433    --  Finalization is required only for freeing storage
 434 
 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.
 446 
 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;