Справочник по Ada 2012
A.4.4 Обработка строк ограниченной длины
В языке определен пакет Strings.Bounded, предоставляющий обобщенный пакет, каждый экземпляр которого генерирует частный тип Bounded_String и набор операций. Объект конкретного типа Bounded_String представляет строку, нижняя граница которой равна 1, а длина может концептуально изменяться от 0 до максимального размера, установленного при обобщенном создании экземпляра. Подпрограммы для обработки строк фиксированной длины либо перегружены непосредственно для Bounded_String, либо изменены по необходимости для отражения изменчивости длины. Кроме того, поскольку тип Bounded_String является закрытым, предоставляются соответствующие конструкторские и селекторные операции.
Статическая семантика
Пакет библиотеки Strings.Bounded имеет следующее объявление:
with Ada.Strings.Maps;
package Ada.Strings.Bounded is
pragma Preelaborate(Bounded);
package Ada.Strings.Bounded is
pragma Preelaborate(Bounded);
generic
Max : Positive; -- Максимальная длина Bounded_String
package Generic_Bounded_Length is
Max : Positive; -- Максимальная длина Bounded_String
package Generic_Bounded_Length is
Max_Length : constant Positive := Max;
type Bounded_String is private;
Null_Bounded_String : constant Bounded_String;
subtype Length_Range is Natural range 0 .. Max_Length;
function Length (Source : in Bounded_String) return Length_Range;
-- Функции преобразования, конкатенации и выбора
function To_Bounded_String (Source : in String;
Drop : in Truncation := Error)
return Bounded_String;
Drop : in Truncation := Error)
return Bounded_String;
function To_String (Source : in Bounded_String) return String;
procedure Set_Bounded_String
(Target : out Bounded_String;
Source : in String;
Drop : in Truncation := Error);
(Target : out Bounded_String;
Source : in String;
Drop : in Truncation := Error);
function Append (Left, Right : in Bounded_String;
Drop : in Truncation := Error)
return Bounded_String;
Drop : in Truncation := Error)
return Bounded_String;
function Append (Left : in Bounded_String;
Right : in String;
Drop : in Truncation := Error)
return Bounded_String;
Right : in String;
Drop : in Truncation := Error)
return Bounded_String;
function Append (Left : in String;
Right : in Bounded_String;
Drop : in Truncation := Error)
return Bounded_String;
Right : in Bounded_String;
Drop : in Truncation := Error)
return Bounded_String;
function Append (Left : in Bounded_String;
Right : in Character;
Drop : in Truncation := Error)
return Bounded_String;
Right : in Character;
Drop : in Truncation := Error)
return Bounded_String;
function Append (Left : in Character;
Right : in Bounded_String;
Drop : in Truncation := Error)
return Bounded_String;
Right : in Bounded_String;
Drop : in Truncation := Error)
return Bounded_String;
procedure Append (Source : in out Bounded_String;
New_Item : in Bounded_String;
Drop : in Truncation := Error);
New_Item : in Bounded_String;
Drop : in Truncation := Error);
procedure Append (Source : in out Bounded_String;
New_Item : in String;
Drop : in Truncation := Error);
New_Item : in String;
Drop : in Truncation := Error);
procedure Append (Source : in out Bounded_String;
New_Item : in Character;
Drop : in Truncation := Error);
New_Item : in Character;
Drop : in Truncation := Error);
function "&" (Left, Right : in Bounded_String)
return Bounded_String;
return Bounded_String;
function "&" (Left : in Bounded_String; Right : in String)
return Bounded_String;
return Bounded_String;
function "&" (Left : in String; Right : in Bounded_String)
return Bounded_String;
return Bounded_String;
function "&" (Left : in Bounded_String; Right : in Character)
return Bounded_String;
return Bounded_String;
function "&" (Left : in Character; Right : in Bounded_String)
return Bounded_String;
return Bounded_String;
function Element (Source : in Bounded_String;
Index : in Positive)
return Character;
Index : in Positive)
return Character;
procedure Replace_Element (Source : in out Bounded_String;
Index : in Positive;
By : in Character);
Index : in Positive;
By : in Character);
function Slice (Source : in Bounded_String;
Low : in Positive;
High : in Natural)
return String;
Low : in Positive;
High : in Natural)
return String;
function Bounded_Slice
(Source : in Bounded_String;
Low : in Positive;
High : in Natural)
return Bounded_String;
(Source : in Bounded_String;
Low : in Positive;
High : in Natural)
return Bounded_String;
procedure Bounded_Slice
(Source : in Bounded_String;
Target : out Bounded_String;
Low : in Positive;
High : in Natural);
(Source : in Bounded_String;
Target : out Bounded_String;
Low : in Positive;
High : in Natural);
function "=" (Left, Right : in Bounded_String) return Boolean;
function "=" (Left : in Bounded_String; Right : in String)
return Boolean;
function "=" (Left : in Bounded_String; Right : in String)
return Boolean;
function "=" (Left : in String; Right : in Bounded_String)
return Boolean;
return Boolean;
function "<" (Left, Right : in Bounded_String) return Boolean;
function "<" (Left : in Bounded_String; Right : in String)
return Boolean;
return Boolean;
function "<" (Left : in String; Right : in Bounded_String)
return Boolean;
return Boolean;
function "<=" (Left, Right : in Bounded_String) return Boolean;
function "<=" (Left : in Bounded_String; Right : in String)
return Boolean;
return Boolean;
function "<=" (Left : in String; Right : in Bounded_String)
return Boolean;
return Boolean;
function ">" (Left, Right : in Bounded_String) return Boolean;
function ">" (Left : in Bounded_String; Right : in String)
return Boolean;
return Boolean;
function ">" (Left : in String; Right : in Bounded_String)
return Boolean;
return Boolean;
function ">=" (Left, Right : in Bounded_String) return Boolean;
function ">=" (Left : in Bounded_String; Right : in String)
return Boolean;
return Boolean;
function ">=" (Left : in String; Right : in Bounded_String)
return Boolean;
return Boolean;
-- Подпрограммы поиска
function Index (Source : in Bounded_String;
Pattern : in String;
From : in Positive;
Going : in Direction := Forward;
Mapping : in Maps.Character_Mapping := Maps.Identity)
return Natural;
Pattern : in String;
From : in Positive;
Going : in Direction := Forward;
Mapping : in Maps.Character_Mapping := Maps.Identity)
return Natural;
function Index (Source : in Bounded_String;
Pattern : in String;
From : in Positive;
Going : in Direction := Forward;
Mapping : in Maps.Character_Mapping_Function)
return Natural;
Pattern : in String;
From : in Positive;
Going : in Direction := Forward;
Mapping : in Maps.Character_Mapping_Function)
return Natural;
function Index (Source : in Bounded_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 Bounded_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 Bounded_String;
Set : in Maps.Character_Set;
From : in Positive;
Test : in Membership := Inside;
Going : in Direction := Forward)
return Natural;
Set : in Maps.Character_Set;
From : in Positive;
Test : in Membership := Inside;
Going : in Direction := Forward)
return Natural;
function Index (Source : in Bounded_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 Bounded_String;
From : in Positive;
Going : in Direction := Forward)
return Natural;
From : in Positive;
Going : in Direction := Forward)
return Natural;
function Index_Non_Blank (Source : in Bounded_String;
Going : in Direction := Forward)
return Natural;
Going : in Direction := Forward)
return Natural;
function Count (Source : in Bounded_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 Bounded_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 Bounded_String;
Set : in Maps.Character_Set)
return Natural;
Set : in Maps.Character_Set)
return Natural;
procedure Find_Token (Source : in Bounded_String;
Set : in Maps.Character_Set;
From : in Positive;
Test : in Membership;
First : out Positive;
Last : out Natural);
Set : in Maps.Character_Set;
From : in Positive;
Test : in Membership;
First : out Positive;
Last : out Natural);
procedure Find_Token (Source : in Bounded_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 Bounded_String;
Mapping : in Maps.Character_Mapping)
return Bounded_String;
Mapping : in Maps.Character_Mapping)
return Bounded_String;
procedure Translate (Source : in out Bounded_String;
Mapping : in Maps.Character_Mapping);
Mapping : in Maps.Character_Mapping);
function Translate (Source : in Bounded_String;
Mapping : in Maps.Character_Mapping_Function)
return Bounded_String;
Mapping : in Maps.Character_Mapping_Function)
return Bounded_String;
procedure Translate (Source : in out Bounded_String;
Mapping : in Maps.Character_Mapping_Function);
Mapping : in Maps.Character_Mapping_Function);
-- Подпрограммы преобразования строк
function Replace_Slice (Source : in Bounded_String;
Low : in Positive;
High : in Natural;
By : in String;
Drop : in Truncation := Error)
return Bounded_String;
Low : in Positive;
High : in Natural;
By : in String;
Drop : in Truncation := Error)
return Bounded_String;
procedure Replace_Slice (Source : in out Bounded_String;
Low : in Positive;
High : in Natural;
By : in String;
Drop : in Truncation := Error);
END_OF_DOCUMENT_MARKER Low : in Positive;
High : in Natural;
By : in String;
Drop : in Truncation := Error);
функция Insert (Source : вход Bounded_String;
Before : вход Positive;
New_Item : вход String;
Drop : вход Truncation := Error)
возврат Bounded_String;
Before : вход Positive;
New_Item : вход String;
Drop : вход Truncation := Error)
возврат Bounded_String;
процедура Insert (Source : вход выход Bounded_String;
Before : вход Positive;
New_Item : вход String;
Drop : вход Truncation := Error);
Before : вход Positive;
New_Item : вход String;
Drop : вход Truncation := Error);
функция Overwrite (Source : вход Bounded_String;
Position : вход Positive;
New_Item : вход String;
Drop : вход Truncation := Error)
возврат Bounded_String;
Position : вход Positive;
New_Item : вход String;
Drop : вход Truncation := Error)
возврат Bounded_String;
процедура Overwrite (Source : вход выход Bounded_String;
Position : вход Positive;
New_Item : вход String;
Drop : вход Truncation := Error);
Position : вход Positive;
New_Item : вход String;
Drop : вход Truncation := Error);
функция Delete (Source : вход Bounded_String;
From : вход Positive;
Through : вход Natural)
возврат Bounded_String;
From : вход Positive;
Through : вход Natural)
возврат Bounded_String;
процедура Delete (Source : вход выход Bounded_String;
From : вход Positive;
Through : вход Natural);
From : вход Positive;
Through : вход Natural);
--Подпрограммы выбора строк
функция Trim (Source : вход Bounded_String;
Side : вход Trim_End)
возврат Bounded_String;
процедура Trim (Source : вход выход Bounded_String;
Side : вход Trim_End);
Side : вход Trim_End)
возврат Bounded_String;
процедура Trim (Source : вход выход Bounded_String;
Side : вход Trim_End);
функция Trim (Source : вход Bounded_String;
Left : вход Maps.Character_Set;
Right : вход Maps.Character_Set)
возврат Bounded_String;
Left : вход Maps.Character_Set;
Right : вход Maps.Character_Set)
возврат Bounded_String;
процедура Trim (Source : вход выход Bounded_String;
Left : вход Maps.Character_Set;
Right : вход Maps.Character_Set);
Left : вход Maps.Character_Set;
Right : вход Maps.Character_Set);
функция Head (Source : вход Bounded_String;
Count : вход Natural;
Pad : вход Character := Space;
Drop : вход Truncation := Error)
возврат Bounded_String;
Count : вход Natural;
Pad : вход Character := Space;
Drop : вход Truncation := Error)
возврат Bounded_String;
процедура Head (Source : вход выход Bounded_String;
Count : вход Natural;
Pad : вход Character := Space;
Drop : вход Truncation := Error);
Count : вход Natural;
Pad : вход Character := Space;
Drop : вход Truncation := Error);
функция Tail (Source : вход Bounded_String;
Count : вход Natural;
Pad : вход Character := Space;
Drop : вход Truncation := Error)
возврат Bounded_String;
Count : вход Natural;
Pad : вход Character := Space;
Drop : вход Truncation := Error)
возврат Bounded_String;
процедура Tail (Source : вход выход Bounded_String;
Count : вход Natural;
Pad : вход Character := Space;
Drop : вход Truncation := Error);
Count : вход Natural;
Pad : вход Character := Space;
Drop : вход Truncation := Error);
--Подпрограммы-конструкторы строк
функция "*" (Left : вход Natural;
Right : вход Character)
возврат Bounded_String;
Right : вход Character)
возврат Bounded_String;
функция "*" (Left : вход Natural;
Right : вход String)
возврат Bounded_String;
Right : вход String)
возврат Bounded_String;
функция "*" (Left : вход Natural;
Right : вход Bounded_String)
возврат Bounded_String;
Right : вход Bounded_String)
возврат Bounded_String;
функция Replicate (Count : вход Natural;
Item : вход Character;
Drop : вход Truncation := Error)
возврат Bounded_String;
Item : вход Character;
Drop : вход Truncation := Error)
возврат Bounded_String;
функция Replicate (Count : вход Natural;
Item : вход String;
Drop : вход Truncation := Error)
возврат Bounded_String;
Item : вход String;
Drop : вход Truncation := Error)
возврат Bounded_String;
функция Replicate (Count : вход Natural;
Item : вход Bounded_String;
Drop : вход Truncation := Error)
возврат Bounded_String;
Item : вход Bounded_String;
Drop : вход Truncation := Error)
возврат Bounded_String;
private
... -- не задано языком
end Generic_Bounded_Length;
... -- не задано языком
end Generic_Bounded_Length;
end Ada.Strings.Bounded;
Null_Bounded_String представляет пустую строку. Если объект типа Bounded_String не инициализирован иначе, он будет инициализирован тем же значением, что и Null_Bounded_String.
функция Length (Source : вход Bounded_String) возврат Length_Range;
Функция Length возвращает длину строки, представленной Source.
функция To_Bounded_String (Source : вход String;
Drop : вход Truncation := Error)
возврат Bounded_String;
Drop : вход Truncation := Error)
возврат Bounded_String;
Если Source'Length <= Max_Length, то эта функция возвращает Bounded_String, представляющую Source. В противном случае, результат зависит от значения Drop:
Если Drop=Left, то результат — Bounded_String, представляющий строку, содержащую правые Max_Length символов Source.
Если Drop=Right, то результат — Bounded_String, представляющий строку, содержащую левые Max_Length символов Source.
Если Drop=Error, то генерируется ошибка Strings.Length_Error.
функция To_String (Source : вход Bounded_String) возврат String;
To_String возвращает строку со значением нижней границы 1, представленную Source. Если B — Bounded_String, то B = To_Bounded_String(To_String(B)).
процедура Set_Bounded_String
(Target : выход Bounded_String;
Source : вход String;
Drop : вход Truncation := Error);
(Target : выход Bounded_String;
Source : вход String;
Drop : вход Truncation := Error);
Эквивалентно Target := To_Bounded_String (Source, Drop);
Каждая из функций Append возвращает Bounded_String, полученную путем конкатенации строки или символа, заданных или представленных одним из параметров, со строкой или символом, заданными или представленными другим параметром, и применением To_Bounded_String к результирующей строке конкатенации со значением Drop, предоставленным в функции Append.
Каждая из процедур Append(Source, New_Item, Drop) имеет тот же эффект, что и соответствующее присваивание Source := Append(Source, New_Item, Drop).
Каждая из функций "&" имеет тот же эффект, что и соответствующая функция Append, со значением Drop по умолчанию Error.
функция Element (Source : вход Bounded_String;
Index : вход Positive)
возврат Character;
Index : вход Positive)
возврат Character;
Возвращает символ в позиции Index в строке, представленной Source; генерирует Index_Error, если Index > Length(Source).
процедура Replace_Element (Source : вход выход Bounded_String;
Index : вход Positive;
By : вход Character);
Index : вход Positive;
By : вход Character);
Обновляет Source таким образом, что символ в позиции Index в строке, представленной Source, заменяется на By; генерирует Index_Error, если Index > Length(Source).
функция Slice (Source : вход Bounded_String;
Low : вход Positive;
High : вход Natural)
возврат String;
Low : вход Positive;
High : вход Natural)
возврат String;
Возвращает фрагмент в позициях Low до High в строке, представленной Source; генерирует Index_Error, если Low > Length(Source)+1 или High > Length(Source). Границы возвращаемой строки — Low и High.
функция Bounded_Slice
(Source : вход Bounded_String;
Low : вход Positive;
High : вход Natural)
возврат Bounded_String;
(Source : вход Bounded_String;
Low : вход Positive;
High : вход Natural)
возврат Bounded_String;
Возвращает фрагмент в позициях Low до High в строке, представленной Source, как ограниченную строку; генерирует Index_Error, если Low > Length(Source)+1 или High > Length(Source).
процедура Bounded_Slice
(Source : вход Bounded_String;
Target : выход Bounded_String;
Low : вход Positive;
High : вход Natural);
(Source : вход Bounded_String;
Target : выход Bounded_String;
Low : вход Positive;
High : вход Natural);
Эквивалентно Target := Bounded_Slice (Source, Low, High);
Каждая из функций "=", "<", ">", "<=", и ">=" возвращает тот же результат, что и соответствующая операция над строками, применённая к строковым значениям, заданным или представленным двумя параметрами.
Каждая из подпрограмм поиска (Index, Index_Non_Blank, Count, Find_Token) имеет тот же эффект, что и соответствующая подпрограмма в Strings.Fixed, применённая к строке, представленной параметром Bounded_String.
Каждая из подпрограмм Translate, применённых к Bounded_String, имеет аналогичный эффект, как соответствующая подпрограмма в Strings.Fixed. Для функции Translate, перевод применяется к строке, представленной параметром Bounded_String, и результат преобразуется (через To_Bounded_String) в Bounded_String. Для процедуры Translate, строка, представленная параметром Bounded_String после перевода, задаётся функцией Translate для строк фиксированной длины, применённой к строке, представленной исходным значением параметра.
Каждая из подпрограмм преобразования (Replace_Slice, Insert, Overwrite, Delete), подпрограмм выбора (Trim, Head, Tail) и конструкторских функций ("*") имеет эффект, основанный на соответствующей подпрограмме в Strings.Fixed, а Replicate основана на Fixed."*". В случае функции, соответствующая подпрограмма строк фиксированной длины применяется к строке, представленной параметром Bounded_String. To_Bounded_String применяется к результирующей строке, при этом Drop (или Error в случае Generic_Bounded_Length."*") определяет эффект, когда длина строки превышает Max_Length. В случае процедуры, соответствующая функция в Strings.Bounded.Generic_Bounded_Length применяется, а результат присваивается в параметр Source.
Рекомендации по реализации
Объекты ограниченных строк не должны реализовываться с помощью неявных указателей и динамического выделения памяти.