Utilización del tipo "ustring"

El tipo ustring (ustrings.ads, ustrings.adb) es un enriquecimiento desarrollado por la Ada Resorce Association del tipo estándar Unbounded_String (definido en el apéndice A.4.5 Unbounded-Length String Handling del manual de referencia de Ada). Implementa el TAD "cadena de caracteres de longitud variable acotada por Natural'Last" como un tipo private.

Para poder usarlo es necesario incluir:

    with ada.strings.unbounded,ustrings;
    use ada.strings.unbounded,ustrings;

antes del encabezamiento del programa o módulo que lo requiera. Desde ese momento, pueden declararse variables de tipo ustring (o indistintamente Unbounded_String):

    nombre:ustring;

Está definida la siguiente constante de tipo ustring que representa la cadena vacía:

    Null_Unbounded_String:constant Unbounded_String;

Las operaciones definidas para ustrings (o indistintamente Unbounded_String) son las siguientes.

Lectura y escritura desde/en fichero/teclado/pantalla de ustrings:

    procedure Get_Line(File:in File_Type; Item:out Unbounded_String);
    procedure Get_Line(Item:out Unbounded_String);

    procedure Put(File:in File_Type; Item:in Unbounded_String);
    procedure Put(Item:in Unbounded_String);

    procedure Put_Line(File:in File_Type; Item:in Unbounded_String);
    procedure Put_Line(Item:in Unbounded_String);

Longitud de un ustring:

    function Length(Source:in Unbounded_String) return Natural;

Intercambio del valor de dos variables de tipo ustring:

    procedure Swap(Left,Right:in out Unbounded_String);

Traducción entre ustring y string:

    function U(Source:String) return Unbounded_String;

    function S(Source:Unbounded_String) return String;

Saber si un ustring es vacío:

    function Empty(S:Unbounded_String) return Boolean;

Para añadir un ustring, un string o un carácter a un ustring:

    procedure Append(Source:in out Unbounded_String;
                     New_Item:in Unbounded_String);

    procedure Append(Source:in out Unbounded_String;
                     New_Item:in String);

    procedure Append(Source:in out Unbounded_String;
                     New_Item:in Character);

Concatenación de ustrings con ustrings, strings y caracteres:

    function "&"(Left,Right:in Unbounded_String)
             return Unbounded_String;

    function "&"(Left:in Unbounded_String; Right:in String)
             return Unbounded_String;

    function "&"(Left:in String; Right:in Unbounded_String)
             return Unbounded_String;

    function "&"(Left:in Unbounded_String; Right:in Character)
             return Unbounded_String;

    function "&"(Left:in Character; Right:in Unbounded_String)
             return Unbounded_String;

Consultar el carácter que ocupa una posición:

    function Element(Source:in Unbounded_String; Index:in Positive)
             return Character;

Sustituir el carácter que ocupa una posición:

    procedure Replace_Element(Source:in out Unbounded_String;
                              Index:in Positive;
                              By:in Character);

Extraer una rebanada de un ustring:

    function Slice(Source:in Unbounded_String;
                   Low:in Positive;
                   High:in Natural)
             return String;

Comparaciones entre ustrings y strings:

    function "="(Left,Right:in Unbounded_String) return Boolean;
    function "="(Left:in Unbounded_String; Right:in String) return Boolean;
    function "="(Left:in String; Right:in Unbounded_String) return Boolean;
    function "<"(Left,Right:in Unbounded_String) return Boolean;
    function "<"(Left:in Unbounded_String; Right:in String) return Boolean;
    function "<"(Left:in String; Right:in Unbounded_String) return Boolean;
    function "<="(Left,Right:in Unbounded_String) return Boolean;
    function "<="(Left:in Unbounded_String; Right:in String) return Boolean;
    function "<="(Left:in String; Right:in Unbounded_String) return Boolean;
    function ">"(Left,Right:in Unbounded_String) return Boolean;
    function ">"(Left:in Unbounded_String; Right:in String) return Boolean;
    function ">"(Left:in String; Right:in Unbounded_String) return Boolean;
    function ">="(Left,Right:in Unbounded_String) return Boolean;
    function ">="(Left:in Unbounded_String; Right:in String) return Boolean;
    function ">="(Left:in String; Right:in Unbounded_String) return Boolean;

Y muchas más (cuya utilidad puede consultarse en el  Manual de Referencia), como...

Funciones de búsqueda:

    function Index(Source:in Unbounded_String;
                   Pattern:in String;
                   Going:in Direction := Forward;
                   Mapping:in Maps.Character_Mapping:=Maps.Identity)
             return Natural;

    function Index(Source:in Unbounded_String;
                   Pattern:in String;
                   Going:in Direction:=Forward;
                   Mapping:in Maps.Character_Mapping_Function)
             return Natural;

    function Index(Source:in Unbounded_String;
                   Set:in Maps.Character_Set;
                   Test:in Membership:=Inside;
                   Going:in Direction:=Forward) return Natural;

    function Index_Non_Blank(Source:in Unbounded_String;
                            Going:in Direction:=Forward)
             return Natural;

    function Count(Source:in Unbounded_String;
                   Pattern:in String;
                   Mapping:in Maps.Character_Mapping:=Maps.Identity)
             return Natural;

    function Count(Source:in Unbounded_String;
                   Pattern:in String;
                   Mapping:in Maps.Character_Mapping_Function)
             return Natural;

    function Count(Source:in Unbounded_String;
                   Set:in Maps.Character_Set)
             return Natural;

    procedure Find_Token(Source:in Unbounded_String;
                         Set:in Maps.Character_Set;
                         Test:in Membership;
                         First:out Positive;
                         Last:out Natural);

Funciones de traducción:

    function Translate(Source:in Unbounded_String;
                       Mapping:in Maps.Character_Mapping)
             return Unbounded_String;

    procedure Translate(Source:in out Unbounded_String;
                        Mapping:in Maps.Character_Mapping);

    function Translate(Source:in Unbounded_String;
                       Mapping:in Maps.Character_Mapping_Function)
             return Unbounded_String;

    procedure Translate(Source:in out Unbounded_String;
                        Mapping:in Maps.Character_Mapping_Function);

Funciones de transformación:

    function Replace_Slice(Source:in Unbounded_String;
                           Low:in Positive;
                           High:in Natural;
                           By:in String)
             return Unbounded_String;

    procedure Replace_Slice(Source:in out Unbounded_String;
                            Low:in Positive;
                            High:in Natural;
                            By:in String);

    function Insert(Source:in Unbounded_String;
                    Before:in Positive;
                    New_Item:in String)
             return Unbounded_String;

    procedure Insert(Source:in out Unbounded_String;
                     Before:in Positive;
                     New_Item:in String);

    function Overwrite(Source:in Unbounded_String;
                       Position:in Positive;
                       New_Item:in String)
             return Unbounded_String;

    procedure Overwrite(Source:in out Unbounded_String;
                        Position:in Positive;
                        New_Item:in String);

    function Delete(Source:in Unbounded_String;
                    From:in Positive;
                    Through:in Natural)
             return Unbounded_String;

    procedure Delete(Source:in out Unbounded_String;
                     From:in Positive;
                     Through:in Natural);

    function Trim(Source:in Unbounded_String;
                  Side:in Trim_End)
             return Unbounded_String;

    procedure Trim(Source:in out Unbounded_String;
                   Side:in Trim_End);

    function Trim(Source:in Unbounded_String;
                  Left:in Maps.Character_Set;
                  Right:in Maps.Character_Set)
             return Unbounded_String;

    procedure Trim(Source:in out Unbounded_String;
                   Left:in Maps.Character_Set;
                   Right:in Maps.Character_Set);

    function Head(Source:in Unbounded_String;
                  Count:in Natural;
                  Pad:in Character:=Space)
             return Unbounded_String;

    procedure Head(Source:in out Unbounded_String;
                   Count:in Natural;
                   Pad:in Character:=Space);

    function Tail(Source:in Unbounded_String;
                  Count:in Natural;
                  Pad:in Character:=Space)
             return Unbounded_String;

    procedure Tail(Source:in out Unbounded_String;
                   Count:in Natural;
                   Pad:in Character:=Space);

    function "*"(Left:in Natural;
                 Right:in Character)
             return Unbounded_String;

    function "*"(Left:in Natural;
                 Right : in String)
             return Unbounded_String;

    function "*"(Left:in Natural;
                 Right:in Unbounded_String)
             return Unbounded_String;


Javier Campos
3 de noviembre de 1.999