Spec-Zone.ru › Ada 95
Справочное руководство по Ada 95

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);
generic
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;
function To_String (Source : in Bounded_String) return String;
function Append (Left, Right : in 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;
function Append (Left : in 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;
function Append (Left : in Character;
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);
procedure Append (Source : in out Bounded_String;
New_Item : in String;
Drop : in Truncation := Error);
procedure Append (Source : in out Bounded_String;
New_Item : in Character;
Drop : in Truncation := Error);
function "&" (Left, Right : in Bounded_String)
return Bounded_String;
function "&" (Left : in Bounded_String; Right : in String)
return Bounded_String;
function "&" (Left : in String; Right : in Bounded_String)
return Bounded_String;
function "&" (Left : in Bounded_String; Right : in Character)
return Bounded_String;
function "&" (Left : in Character; Right : in Bounded_String)
return Bounded_String;
function Element (Source : in Bounded_String;
Index : in Positive)
return Character;
procedure Replace_Element (Source : in out Bounded_String;
Index : in Positive;
By : in Character);
function Slice (Source : in Bounded_String;
Low : in Positive;
High : in Natural)
return String;
function "=" (Left, Right : in Bounded_String) return Boolean;
function "=" (Left : in Bounded_String; Right : in String)
return Boolean;
function "=" (Left : in String; Right : in Bounded_String)
return Boolean;
function "<" (Left, Right : in Bounded_String) return Boolean;
function "<" (Left : in Bounded_String; Right : in String)
return Boolean;
function "<" (Left : in String; Right : in Bounded_String)
return Boolean;
function "<=" (Left, Right : in Bounded_String) return Boolean;
function "<=" (Left : in Bounded_String; Right : in String)
return Boolean;
function "<=" (Left : in String; Right : in Bounded_String)
return Boolean;
function ">" (Left, Right : in Bounded_String) return Boolean;
function ">" (Left : in Bounded_String; Right : in String)
return Boolean;
function ">" (Left : in String; Right : in Bounded_String)
return Boolean;
function ">=" (Left, Right : in Bounded_String) return Boolean;
function ">=" (Left : in Bounded_String; Right : in String)
return Boolean;
function ">=" (Left : in String; Right : in Bounded_String)
return Boolean;
-- Функции поиска
function Index (Source : in Bounded_String;
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;
function Index (Source : in Bounded_String;
Set : in Maps.Character_Set;
Test : in Membership := Inside;
Going : in Direction := Forward)
return Natural;
function Index_Non_Blank (Source : in Bounded_String;
Going : in Direction := Forward)
return Natural;
function Count (Source : in Bounded_String;
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;
function Count (Source : in Bounded_String;
Set : in Maps.Character_Set)
return Natural;
procedure Find_Token (Source : in Bounded_String;
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;
procedure Translate (Source : in out Bounded_String;
Mapping : in Maps.Character_Mapping);
function Translate (Source : in Bounded_String;
Mapping : in Maps.Character_Mapping_Function)
return Bounded_String;
procedure Translate (Source : in out Bounded_String;
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;
procedure Replace_Slice (Source : in out Bounded_String;
Low : in Positive;
High : in Natural;
By : in String;
Drop : in Truncation := Error);
function Insert (Source : in Bounded_String;
Before : in Positive;
New_Item : in String;
Drop : in Truncation := Error)
return Bounded_String;
procedure Insert (Source : in out Bounded_String;
Before : in Positive;
New_Item : in String;
Drop : in Truncation := Error);
function Overwrite (Source : in Bounded_String;
Position : in Positive;
New_Item : in String;
Drop : in Truncation := Error)
return Bounded_String;
procedure Overwrite (Source : in out Bounded_String;
Position : in Positive;
New_Item : in String;
Drop : in Truncation := Error);
function Delete (Source : in Bounded_String;
From : in Positive;
Through : in Natural)
return Bounded_String;
procedure Delete (Source : in out Bounded_String;
From : in Positive;
Through : in Natural);
--Подпрограммы выбора строк
функция Trim (Source : вход Bounded_String;
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;
процедура Trim (Source : вход выход Bounded_String;
Left : вход Maps.Character_Set;
Right : вход Maps.Character_Set);
функция Head (Source : вход Bounded_String;
Count : вход Natural;
Pad : вход Character := Space;
Drop : вход Truncation := Error)
возврат Bounded_String;
процедура Head (Source : вход выход Bounded_String;
Count : вход Natural;
Pad : вход Character := Space;
Drop : вход Truncation := Error);
функция Tail (Source : вход Bounded_String;
Count : вход Natural;
Pad : вход Character := Space;
Drop : вход Truncation := Error)
возврат Bounded_String;
процедура Tail (Source : вход выход Bounded_String;
Count : вход Natural;
Pad : вход Character := Space;
Drop : вход Truncation := Error);
--Подпрограммы-конструкторы для строк
функция "*" (Left : вход Natural;
Right : вход Character)
возврат Bounded_String;
функция "*" (Left : вход Natural;
Right : вход String)
возврат Bounded_String;
функция "*" (Left : вход Natural;
Right : вход Bounded_String)
возврат Bounded_String;
функция Replicate (Count : вход Natural;
Item : вход Character;
Drop : вход Truncation := Error)
возврат Bounded_String;
функция Replicate (Count : вход Natural;
Item : вход String;
Drop : вход Truncation := Error)
возврат Bounded_String;
функция Replicate (Count : вход Natural;
Item : вход Bounded_String;
Drop : вход Truncation := Error)
возврат Bounded_String;
private
... -- не указано языком
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;
Если Source'Length <= Max_Length, то эта функция возвращает Bounded_String, представляющую Source. В противном случае результат зависит от значения Drop:
  • Если Drop=Left, то результатом является Bounded_String, представляющая правую часть Source длиной Max_Length символов.
  • Если Drop=Right, то результатом является Bounded_String, представляющая левую часть Source длиной Max_Length символов.
  • Если Drop=Error, то генерируется исключение Strings.Length_Error.
функция To_String (Source : вход Bounded_String) возврат String;
To_String возвращает строку String со значением нижней границы 1, представленную Source. Если B – Bounded_String, то B = To_Bounded_String(To_String(B)).
Каждая из функций Append возвращает Bounded_String, полученную путём конкатенации строки или символа, указанных или представленных одним из параметров, со строкой или символом, указанными или представленными другим параметром, и применением To_Bounded_String к результирующей строке конкатенации, с Drop, как указано в функции Append.
Каждая из процедур Append(Source, New_Item, Drop) имеет такой же эффект, как и соответствующее присваивание Source := Append(Source, New_Item, Drop).
Каждая из функций "&" имеет такой же эффект, как и соответствующая функция Append, с Error в качестве параметра Drop.
функция Element (Source : вход Bounded_String;
Index : вход Positive)
возврат Character;
Возвращает символ в позиции Index в строке, представленной Source; генерирует Index_Error, если Index > Length(Source).
процедура Replace_Element (Source : вход выход Bounded_String;
Index : вход Positive;
By : вход Character);
Обновляет Source таким образом, что символ в позиции Index в строке, представленной Source, заменяется на By; генерирует Index_Error, если Index > Length(Source).
функция Slice (Source : вход Bounded_String;
Low : вход Positive;
High : вход Natural)
возврат String;
Возвращает фрагмент в позициях Low до High в строке, представленной Source; генерирует Index_Error, если Low > Length(Source)+1 или High > Length(Source).
Каждая из функций "=", "<", ">","<=", и ">=" возвращает такой же результат, как и соответствующая операция над строками String, применённая к значениям String, заданным или представленным двумя параметрами.
Каждая из подпрограмм поиска (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.

Рекомендации по реализации

Объекты ограниченных строк не должны реализовываться с помощью неявных указателей и динамического выделения памяти.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API