Справочник Ada 95
A.4.5 Обработка строк неограниченной длины
В языке определённый пакет Strings.Unbounded предоставляет частный тип Unbounded_String и набор операций. Объект типа Unbounded_String представляет строку, нижняя граница которой равна 1, а длина может концептуально изменяться от 0 до Natural'Last. Подпрограммы для обработки строк фиксированной длины либо перегружены непосредственно для Unbounded_String, либо изменены по мере необходимости, чтобы отразить гибкость длины. Поскольку тип Unbounded_String является частным, предоставляются соответствующие операции конструктора и селектора.
Статическая семантика
Пакет библиотеки Strings.Unbounded имеет следующее объявление:
with Ada.Strings.Maps;
package Ada.Strings.Unbounded is
pragma Preelaborate(Unbounded);
package Ada.Strings.Unbounded is
pragma Preelaborate(Unbounded);
type Unbounded_String is private;
Null_Unbounded_String : constant Unbounded_String;
function Length (Source : in Unbounded_String) return Natural;
type String_Access is access all String;
procedure Free (X : in out String_Access);
procedure Free (X : in out String_Access);
-- Преобразование, конкатенация и функции выбора
function To_Unbounded_String (Source : in String)
return Unbounded_String;
return Unbounded_String;
function To_Unbounded_String (Length : in Natural)
return Unbounded_String;
return Unbounded_String;
function To_String (Source : in Unbounded_String) return String;
procedure Append (Source : in out Unbounded_String;
New_Item : in Unbounded_String);
New_Item : in Unbounded_String);
procedure Append (Source : in out Unbounded_String;
New_Item : in String);
New_Item : in String);
procedure Append (Source : in out Unbounded_String;
New_Item : in Character);
New_Item : in Character);
function "&" (Left, Right : in Unbounded_String)
return Unbounded_String;
return Unbounded_String;
function "&" (Left : in Unbounded_String; Right : in String)
return Unbounded_String;
return Unbounded_String;
function "&" (Left : in String; Right : in Unbounded_String)
return Unbounded_String;
return Unbounded_String;
function "&" (Left : in Unbounded_String; Right : in Character)
return Unbounded_String;
return Unbounded_String;
function "&" (Left : in Character; Right : in Unbounded_String)
return Unbounded_String;
return Unbounded_String;
function Element (Source : in Unbounded_String;
Index : in Positive)
return Character;
Index : in Positive)
return Character;
procedure Replace_Element (Source : in out Unbounded_String;
Index : in Positive;
By : in Character);
Index : in Positive;
By : in Character);
function Slice (Source : in Unbounded_String;
Low : in Positive;
High : in Natural)
return String;
Low : in Positive;
High : in Natural)
return String;
function "=" (Left, Right : in Unbounded_String) return Boolean;
function "=" (Left : in Unbounded_String; Right : in String)
return Boolean;
return Boolean;
function "=" (Left : in String; Right : in Unbounded_String)
return Boolean;
return Boolean;
function "<" (Left, Right : in Unbounded_String) return Boolean;
function "<" (Left : in Unbounded_String; Right : in String)
return Boolean;
return Boolean;
function "<" (Left : in String; Right : in Unbounded_String)
return Boolean;
return Boolean;
function "<=" (Left, Right : in Unbounded_String) return Boolean;
function "<=" (Left : in Unbounded_String; Right : in String)
return Boolean;
return Boolean;
function "<=" (Left : in String; Right : in Unbounded_String)
return Boolean;
return Boolean;
function ">" (Left, Right : in Unbounded_String) return Boolean;
function ">" (Left : in Unbounded_String; Right : in String)
return Boolean;
return Boolean;
function ">" (Left : in String; Right : in Unbounded_String)
return Boolean;
return Boolean;
function ">=" (Left, Right : in Unbounded_String) return Boolean;
function ">=" (Left : in Unbounded_String; Right : in String)
return Boolean;
return Boolean;
function ">=" (Left : in String; Right : in Unbounded_String)
return Boolean;
return Boolean;
-- Подпрограммы поиска
function Index (Source : in Unbounded_String;
Pattern : in String;
Going : in Direction := Forward;
Mapping : in Maps.Character_Mapping
:= Maps.Identity)
return Natural;
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;
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;
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;
Going : in Direction := Forward)
return Natural;
function Count (Source : in Unbounded_String;
Pattern : in String;
Mapping : in Maps.Character_Mapping
:= Maps.Identity)
return Natural;
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;
Pattern : in String;
Mapping : in Maps.Character_Mapping_Function)
return Natural;
function Count (Source : in Unbounded_String;
Set : in Maps.Character_Set)
return Natural;
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);
Set : in Maps.Character_Set;
Test : in Membership;
First : out Positive;
Last : out Natural);
-- Подпрограммы перевода строк
function Translate (Source : in Unbounded_String;
Mapping : in Maps.Character_Mapping)
return Unbounded_String;
Mapping : in Maps.Character_Mapping)
return Unbounded_String;
procedure Translate (Source : in out Unbounded_String;
Mapping : in Maps.Character_Mapping);
Mapping : in Maps.Character_Mapping);
function Translate (Source : in Unbounded_String;
Mapping : in Maps.Character_Mapping_Function)
return Unbounded_String;
Mapping : in Maps.Character_Mapping_Function)
return Unbounded_String;
procedure Translate (Source : in out Unbounded_String;
Mapping : in Maps.Character_Mapping_Function);
Mapping : in Maps.Character_Mapping_Function);
-- Подпрограммы преобразования строк
function Replace_Slice (Source : in Unbounded_String;
Low : in Positive;
High : in Natural;
By : in String)
return 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);
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;
Before : in Positive;
New_Item : in String)
return Unbounded_String;
procedure Insert (Source : in out Unbounded_String;
Before : in Positive;
New_Item : in String);
Before : in Positive;
New_Item : in String);
function Overwrite (Source : in Unbounded_String;
Position : in Positive;
New_Item : in String)
return 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);
Position : in Positive;
New_Item : in String);
function Delete (Source : in Unbounded_String;
From : in Positive;
Through : in Natural)
return Unbounded_String;
From : in Positive;
Through : in Natural)
return Unbounded_String;
procedure Delete (Source : in out Unbounded_String;
From : in Positive;
Through : in Natural);
From : in Positive;
Through : in Natural);
function Trim (Source : in Unbounded_String;
Side : in Trim_End)
return Unbounded_String;
Side : in Trim_End)
return Unbounded_String;
procedure Trim (Source : in out Unbounded_String;
Side : in Trim_End);
Side : in Trim_End);
function Trim (Source : in Unbounded_String;
Left : in Maps.Character_Set;
Right : in Maps.Character_Set)
return 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);
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;
Count : in Natural;
Pad : in Character := Space)
return Unbounded_String;
procedure Head (Source : in out Unbounded_String;
Count : in Natural;
Pad : in Character := Space);
Count : in Natural;
Pad : in Character := Space);
function Tail (Source : in Unbounded_String;
Count : in Natural;
Pad : in Character := Space)
return 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);
Count : in Natural;
Pad : in Character := Space);
функция "*" (Left : вход НатуральноеЧисло;
Right : вход Символ)
возврат НеограниченнаяСтрока;
Right : вход Символ)
возврат НеограниченнаяСтрока;
функция "*" (Left : вход НатуральноеЧисло;
Right : вход Строка)
возврат НеограниченнаяСтрока;
Right : вход Строка)
возврат НеограниченнаяСтрока;
функция "*" (Left : вход НатуральноеЧисло;
Right : вход НеограниченнаяСтрока)
возврат НеограниченнаяСтрока;
Right : вход НеограниченнаяСтрока)
возврат НеограниченнаяСтрока;
приватный
... -- не указано языком
конец Ada.Strings.Unbounded;
... -- не указано языком
конец Ada.Strings.Unbounded;
Null_Unbounded_String представляет собой пустую Строку. Если объект типа НеограниченнаяСтрока не инициализирован иначе, он будет инициализирован тем же значением, что и Null_Unbounded_String.
Функция Length возвращает длину Строки, представленной Source.
Тип String_Access предоставляет (неприватный) тип доступа для явного обработки строк неограниченной длины. Процедура Free выполняет неконтролируемую деаллокация объекта типа String_Access.
Функция To_Unbounded_String(Source : вход Строка) возвращает НеограниченнуюСтроку, представляющую Source. Функция To_Unbounded_String(Length : вход НатуральноеЧисло) возвращает НеограниченнуюСтроку, представляющую неинициализированную Строку, длина которой равна Length.
Функция To_String возвращает Строку с нижней границей 1, представленную Source. To_String и To_Unbounded_String связаны следующим образом:
- Если S — это Строка, то To_String(To_Unbounded_String(S)) = S.
- Если U — это НеограниченнаяСтрока, то To_Unbounded_String(To_String(U)) = U.
Для каждой из процедур Append результирующая строка, представленная параметром Source, задаётся конкатенацией исходного значения Source и значения New_Item.
Каждая из функций "&" возвращает НеограниченнуюСтроку, полученную путём конкатенации строки или символа, заданного или представленного одним из параметров, со строкой или символом, заданным или представленным другим параметром, и применением To_Unbounded_String к строке-результату конкатенации.
Подпрограммы Element, Replace_Element и Slice имеют тот же эффект, что и соответствующие подпрограммы строк ограниченной длины.
Каждая из функций "=", "<", ">","<=", и ">=" возвращает тот же результат, что и соответствующая операция со строками, применённая к строковым значениям, заданным или представленным Left и Right.
Каждая из подпрограмм поиска (Index, Index_Non_Blank, Count, Find_Token) имеет тот же эффект, что и соответствующая подпрограмма в Strings.Fixed, применённая к строке, представленной параметром Unbounded_String.
Функция Translate имеет аналогичный эффект, как и соответствующая подпрограмма в Strings.Fixed. Перевод применяется к строке, представленной параметром Unbounded_String, и результат преобразуется (через To_Unbounded_String) в НеограниченнуюСтроку.
Каждая из функций преобразования (Replace_Slice, Insert, Overwrite, Delete), функций-селекторов (Trim, Head, Tail) и функций-конструкторов ("*") аналогичным образом аналогична соответствующей подпрограмме в Strings.Fixed. Для каждой из подпрограмм соответствующая подпрограмма строк фиксированной длины применяется к строке, представленной параметром Unbounded_String, и к результирующей строке применяется To_Unbounded_String.
Для каждой из процедур Translate, Replace_Slice, Insert, Overwrite, Delete, Trim, Head и Tail результирующая строка, представленная параметром Source, задаётся соответствующей функцией для строк фиксированной длины, применённой к строке, представленной исходным значением Source.
Требования к реализации
Вся память, связанная с объектом Unbounded_String, не должна теряться при присваивании или выходе из области видимости.