13.13.1 The Package Streams
Static Semantics
The abstract type Root_Stream_Type is the root type
of the class of stream types. The types in this class represent different
kinds of streams. A new stream type is defined by extending the root
type (or some other stream type), overriding the Read and Write operations,
and optionally defining additional primitive subprograms, according to
the requirements of the particular kind of stream. The predefined stream-oriented
attributes like T'Read and T'Write make dispatching calls on the Read
and Write procedures of the Root_Stream_Type. (User-defined T'Read and
T'Write attributes can also make such calls, or can call the Read and
Write attributes of other types.)
package Ada.Streams
is
pragma Pure(Streams)
;
type Root_Stream_Type
is abstract tagged limited private;
pragma Preelaborable_Initialization(Root_Stream_Type);
type Stream_Element
is mod implementation-defined;
type Stream_Element_Offset
is range implementation-defined;
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
... -- not specified by the language
end Ada.Streams;
The Read operation transfers stream elements from
the specified stream to fill the array Item. Elements are transferred
until Item'Length elements have been transferred, or until the end of
the stream is reached. If any elements are transferred, the index of
the last stream element transferred is returned in Last. Otherwise, Item'First
- 1 is returned in Last. Last is less than Item'Last only if the end
of the stream is reached.
The Write operation appends Item to the specified
stream.
Implementation Permissions
If Stream_Element'Size is not a multiple of System.Storage_Unit,
then the components of Stream_Element_Array need not be aliased.
32 If the end of stream has been reached,
and Item'First is Stream_Element_Offset'First, Read will raise Constraint_Error.