Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

A.4.12 Универсальные буферы текста

Универсальный буфер текста может использоваться для сохранения и извлечения текста любого типа строки, определенного языком. Типы, используемые для сохранения и извлечения текста, могут отличаться.

Статическая семантика

Пакеты библиотек буферов текста имеют следующие объявления:
with Ada.Strings.UTF_Encoding.Wide_Wide_Strings;
package Ada.Strings.Text_Buffers
with Pure is
type Text_Buffer_Count is range 0 .. определяется реализацией;
New_Line_Count : constant Text_Buffer_Count := определяется реализацией;
type Root_Buffer_Type is abstract tagged private
with Default_Initial_Condition =>
Current_Indent (Root_Buffer_Type) = 0;
procedure Put (
Buffer : in out Root_Buffer_Type;
Item : in String) is abstract;
procedure Wide_Put (
Buffer : in out Root_Buffer_Type;
Item : in Wide_String) is abstract;
procedure Wide_Wide_Put (
Buffer : in out Root_Buffer_Type;
Item : in Wide_Wide_String) is abstract;
procedure Put_UTF_8 (
Buffer : in out Root_Buffer_Type;
Item : in UTF_Encoding.UTF_8_String) is abstract;
procedure Wide_Put_UTF_16 (
Buffer : in out Root_Buffer_Type;
Item : in UTF_Encoding.UTF_16_Wide_String) is abstract;
procedure New_Line (Buffer : in out Root_Buffer_Type) is abstract;
Standard_Indent : constant Text_Buffer_Count := 3;
function Current_Indent (
Buffer : Root_Buffer_Type) return Text_Buffer_Count;
procedure Increase_Indent (
Buffer : in out Root_Buffer_Type;
Amount : in Text_Buffer_Count := Standard_Indent)
with Post'Class =>
Current_Indent (Buffer) = Current_Indent (Buffer)'Old + Amount;
procedure Decrease_Indent (
Buffer : in out Root_Buffer_Type;
Amount : in Text_Buffer_Count := Standard_Indent)
with Pre'Class =>
Current_Indent (Buffer) >= Amount
or else raise Constraint_Error,
Post'Class =>
Current_Indent (Buffer) =
Current_Indent (Buffer)'Old - Amount;
private
... -- не указано языком
end Ada.Strings.Text_Buffers;
package Ada.Strings.Text_Buffers.Unbounded
with Preelaborate, Nonblocking, Global => null is
type Buffer_Type is new Root_Buffer_Type with private;
function Get (
Buffer : in out Buffer_Type)
return String
with Post'Class =>
Get'Result'First = 1 and then Current_Indent (Buffer) = 0;
function Wide_Get (
Buffer : in out Buffer_Type)
return Wide_String
with Post'Class =>
Wide_Get'Result'First = 1 and then Current_Indent (Buffer) = 0;
function Wide_Wide_Get (
Buffer : in out Buffer_Type)
return Wide_Wide_String
with Post'Class =>
Wide_Wide_Get'Result'First = 1
and then Current_Indent (Buffer) = 0;
function Get_UTF_8 (
Buffer : in out Buffer_Type)
return UTF_Encoding.UTF_8_String
with Post'Class =>
Get_UTF_8'Result'First = 1 and then Current_Indent (Buffer) = 0;
function Wide_Get_UTF_16 (
Buffer : in out Buffer_Type)
return UTF_Encoding.UTF_16_Wide_String
with Post'Class =>
Wide_Get_UTF_16'Result'First = 1
and then Current_Indent (Buffer) = 0;
private
... -- не указано языком, но будет содержать неабстрактные
-- переопределения всех унаследованных подпрограмм, требующих переопределения.
end Ada.Strings.Text_Buffers.Unbounded;
package Ada.Strings.Text_Buffers.Bounded
with Pure, Nonblocking, Global => null is
type Buffer_Type (Max_Characters : Text_Buffer_Count)
is new Root_Buffer_Type with private
with Default_Initial_Condition => not Text_Truncated (Buffer_Type);
function Text_Truncated (Buffer : in Buffer_Type) return Boolean;
-- Get, Wide_Get, Wide_Wide_Get, Get_UTF_8, и Wide_Get_UTF_16
-- объявлены здесь так же, как и в дочернем элементе Unbounded.
private
... -- не указано языком, но будет содержать неабстрактные
-- переопределения всех унаследованных подпрограмм, требующих переопределения.
end Ada.Strings.Text_Buffers.Bounded;
Character_Count возвращает количество символов, в настоящее время хранящихся в буфере текста.
New_Line сохраняет New_Line_Count символов, представляющих новую строку, в буфер текста. Current_Indent возвращает текущий отступ, связанный с буфером, при этом ноль означает, что отступ не активен; Increase_Indent и Decrease_Indent увеличивают или уменьшают отступ, связанный с буфером.
Вызов Put, Wide_Put, Wide_Wide_Put, Put_UTF_8 или Wide_Put_UTF_16 сохраняет последовательность символов в буфер текста, предваряя её Current_Indent(Buffer) пробелами (Wide_Wide_Characters с позицией 32), если в Item есть хотя бы один символ и он будет первым символом в текущей строке.
Вызов функции Get, Wide_Get, Wide_Wide_Get, Get_UTF_8 или Wide_Get_UTF_16 возвращает ту же последовательность символов, что и в вызовах, которые сохранили символы в буфере, если она представима. Для вызова Get, если какой-либо символ в последовательности не определен в Character, результат определяется реализацией. Аналогично, для вызова Wide_Get, если какой-либо символ в последовательности не определен в Wide_Character, результат определяется реализацией. В рамках вызова любой из функций Get буфер сбрасывается в пустое состояние без сохраненных символов.
В случае с Buf типа Text_Buffers.Bounded.Buffer_Type, Text_Truncated (Buf) возвращает True, если различные процедуры Put вместе пытались сохранить больше, чем Buf.Max_Characters в Buf. Если эта функция возвращает True, то различные функции Get возвращают представление только первых Buf.Max_Characters символов, которые были сохранены в Buf.

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

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


Spec-Zone.ru

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