Spec-Zone.ru › Ada 2022
Справочник по Ada (Ada 2022)

13.13.1 Подсистема потоков

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

Абстрактный тип Root_Stream_Type является корневым типом класса типов потоков. Типы в этом классе представляют различные виды потоков. Новый тип потока определяется путем расширения корневого типа (или другого типа потока), переопределения операций Read и Write и, при необходимости, определения дополнительных примитивных подпрограмм в соответствии с требованиями конкретного типа потока. Предопределенные атрибуты, ориентированные на потоки, такие как T'Read и T'Write, вызывают процедуры Read и Write типа Root_Stream_Type. (Пользовательские атрибуты T'Read и T'Write также могут вызывать такие вызовы или вызывать атрибуты Read и Write других типов.)
Библиотечный пакет Ada.Streams имеет следующее объявление:
package Ada.Streams
with Pure, Nonblocking => False is
type Root_Stream_Type is abstract tagged limited private
with Preelaborable_Initialization;
type Stream_Element is mod определяется реализацией;
type Stream_Element_Offset is range определяется реализацией;
subtype Stream_Element_Count is
Stream_Element_Offset range 0..Stream_Element_Offset'Last;
type Stream_Element_Array is
array(Stream_Element_Offset range <>) of aliased Stream_Element;
procedure Read(
Stream : in out Root_Stream_Type;
Item : out Stream_Element_Array;
Last : out Stream_Element_Offset) is abstract;
procedure Write(
Stream : in out Root_Stream_Type;
Item : in Stream_Element_Array) is abstract;
private
... -- не определено языком
end Ada.Streams;
Операция Read передает элементы потока из указанного потока для заполнения массива Item. Элементы передаются до тех пор, пока не будет передано Item'Length элементов или пока не будет достигнут конец потока. Если какие-либо элементы были переданы, индекс последнего переданного элемента потока возвращается в Last. В противном случае в Last возвращается Item'First - 1. Last меньше Item'Last только в случае достижения конца потока.
Операция Write добавляет Item к указанному потоку.
Три дополнительных пакета предоставляют реализации потоков, не использующие операции с файлами. Эти пакеты предоставляют те же операции, причем пакет Streams.Storage обеспечивает абстрактный интерфейс, а два дочерних пакета обеспечивают реализации этого интерфейса. Разница заключается в том, что для Streams.Storage.Bounded максимальный объем памяти ограничен.
Библиотечный пакет Ada.Streams.Storage имеет следующее объявление:
package Ada.Streams.Storage
with Pure, Nonblocking is
type Storage_Stream_Type is abstract new Root_Stream_Type with private;
function Element_Count (Stream : Storage_Stream_Type)
return Stream_Element_Count is abstract;
procedure Clear (Stream : in out Storage_Stream_Type) is abstract;
private
... -- не определено языком
end Ada.Streams.Storage;
Библиотечный пакет Ada.Streams.Storage.Unbounded имеет следующее объявление:
package Ada.Streams.Storage.Unbounded
with Prelaborated, Nonblocking, Global => in out synchronized is
type Stream_Type is new Storage_Stream_Type with private
with Default_Initial_Condition =>
Element_Count (Stream_Type) = 0;
overriding
procedure Read (
Stream : in out Stream_Type;
Item : out Stream_Element_Array;
Last : out Stream_Element_Offset)
with Post =>
(declare
Num_Read : constant Stream_Element_Count :=
Stream_Element_Count'Min
(Element_Count(Stream)'Old, Item'Length);
begin
Last = Num_Read + Item'First - 1 and
Element_Count (Stream) =
Element_Count (Stream)'Old - Num_Read);
overriding
procedure Write (
Stream : in out Stream_Type;
Item : in Stream_Element_Array)
with Post =>
Element_Count (Stream) =
Element_Count (Stream)'Old + Item'Length;
overriding
function Element_Count (Stream : Stream_Type)
return Stream_Element_Count;
overriding
procedure Clear (Stream : in out Stream_Type)
with Post => Element_Count (Stream) = 0;
private
... -- не определено языком
end Ada.Streams.Storage.Unbounded;
Библиотечный пакет Ada.Streams.Storage.Bounded имеет следующее объявление:
package Ada.Streams.Storage.Bounded
with Pure, Nonblocking is
type Stream_Type (Max_Elements : Stream_Element_Count)
is new Storage_Stream_Type with private
with Default_Initial_Condition =>
Element_Count (Stream_Type) = 0;
overriding
procedure Read (
Stream : in out Stream_Type;
Item : out Stream_Element_Array;
Last : out Stream_Element_Offset)
with Post =>
(declare
Num_Read : constant Stream_Element_Count :=
Stream_Element_Count'Min
(Element_Count(Stream)'Old, Item'Length);
begin
Last = Num_Read + Item'First - 1 and
Element_Count (Stream) =
Element_Count (Stream)'Old - Num_Read);
overriding
procedure Write (
Stream : in out Stream_Type;
Item : in Stream_Element_Array)
with Pre =>
Element_Count (Stream) + Item'Length <= Stream.Max_Elements
or else (raise Constraint_Error),
Post =>
Element_Count (Stream) =
Element_Count (Stream)'Old + Item'Length;
overriding
function Element_Count (Stream : Stream_Type)
return Stream_Element_Count
with Post => Element_Count'Result <= Stream.Max_Elements;
overriding
procedure Clear (Stream : in out Stream_Type)
with Post => Element_Count (Stream) = 0;
private
... -- не определено языком
end Ada.Streams.Storage.Bounded;
Функции Element_Count возвращают количество элементов потока, доступных для чтения из заданного потока.
Процедуры Read и Write ведут себя так, как описано для пакета Ada.Streams выше. Элементы потока читаются в порядке FIFO (первым вошел, первым вышел); элементы потока доступны для чтения сразу после записи.
Процедуры Clear удаляют все доступные элементы потока из заданного потока.

Разрешения реализации

Если Stream_Element'Size не кратно System.Storage_Unit, то компоненты Stream_Element_Array не будут связаны.

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

Объекты Streams.Storage.Bounded.Stream_Type должны быть реализованы без неявных указателей или динамического выделения.
ПРИМЕЧАНИЕ 1 См. A.12.1, «Пакет Streams.Stream_IO» для примера расширения типа Root_Stream_Type.
ПРИМЕЧАНИЕ 2 Если достигнут конец потока, и Item'First равен Stream_Element_Offset'First, Read вызовет Constraint_Error.


Spec-Zone.ru

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