Go to the first, previous, next, last section, table of contents.
-
The Write, Read, Output, and Input attributes convert values to a stream
of elements and reconstruct values from a stream.
Static Semantics
-
For every subtype S of a specific type T, the following attributes are
defined.
-
S'Write
S'Write denotes a procedure with the following specification:
-
procedure S'Write(
Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : in T)
-
S'Write writes the value of Item to Stream.
-
S'Read
S'Read denotes a procedure with the following specification:
-
procedure S'Read(
Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : out T)
-
S'Read reads the value of Item from Stream.
-
For elementary types, the representation in terms of stream elements is
implementation defined. For composite types, the Write or Read attribute
for each component is called in a canonical order. The canonical order
of components is last dimension varying fastest for an array, and
positional aggregate order for a record. Bounds are not included in the
stream if T is an array type. If T is a discriminated type,
discriminants are included only if they have defaults. If T is a tagged
type, the tag is not included.
-
For every subtype S'Class of a class-wide type T'Class:
-
S'Class'Write
S'Class'Write denotes a procedure with the following
specification:
-
procedure S'Class'Write(
Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : in T'Class)
-
Dispatches to the subprogram denoted by the Write attribute of the
specific type identified by the tag of Item.
-
S'Class'Read
S'Class'Read denotes a procedure with the following
specification:
-
procedure S'Class'Read(
Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : out T'Class)
-
Dispatches to the subprogram denoted by the Read attribute of the
specific type identified by the tag of Item.
Implementation Advice
-
If a stream element is the same size as a storage element, then the
normal in-memory representation should be used by Read and Write for
scalar objects. Otherwise, Read and Write should use the smallest number
of stream elements needed to represent all values in the base range of
the scalar type.
Static Semantics
-
For every subtype S of a specific type T, the following attributes are
defined.
-
S'Output
S'Output denotes a procedure with the following specification:
-
procedure S'Output(
Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : in T)
-
S'Output writes the value of Item to Stream, including any bounds or
discriminants.
-
S'Input
S'Input denotes a function with the following specification:
-
function S'Input(
Stream : access Ada.Streams.Root_Stream_Type'Class)
return T
-
S'Input reads and returns one value from Stream, using any bounds or
discriminants written by a corresponding S'Output to determine how much
to read.
-
Unless overridden by an attribute_definition_clause, these subprograms
execute as follows:
-
If T is an array type, S'Output first writes the bounds, and S'Input
first reads the bounds. If T has discriminants without defaults,
S'Output first writes the discriminants (using S'Write for each), and
S'Input first reads the discriminants (using S'Read for each).
-
S'Output then calls S'Write to write the value of Item to the stream.
S'Input then creates an object (with the bounds or discriminants, if
any, taken from the stream), initializes it with S'Read, and returns the
value of the object.
-
For every subtype S'Class of a class-wide type T'Class:
-
S'Class'Output
S'Class'Output denotes a procedure with the following
specification:
-
procedure S'Class'Output(
Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : in T'Class)
-
First writes the external tag of Item to Stream (by calling
String'Output(Tags.External_Tag(Item'Tag) -- See section 3.9 Tagged Types and Type Extensions.) and then
dispatches to the subprogram denoted by the Output attribute of the
specific type identified by the tag.
-
S'Class'Input
S'Class'Input denotes a function with the following
specification:
-
function S'Class'Input(
Stream : access Ada.Streams.Root_Stream_Type'Class)
return T'Class
-
First reads the external tag from Stream and determines the
corresponding internal tag (by calling
Tags.Internal_Tag(String'Input(Stream)) -- See section 3.9 Tagged Types and Type Extensions.) and then
dispatches to the subprogram denoted by the Input attribute of the
specific type identified by the internal tag; returns that result.
-
In the default implementation of Read and Input for a composite type,
for each scalar component that is a discriminant or whose
component_declaration includes a default_expression, a check is made
that the value returned by Read for the component belongs to its
subtype. Constraint_Error is raised if this check fails. For other
scalar components, no check is made. For each component that is of an
access type, if the implementation can detect that the value returned by
Read for the component is not a value of its subtype, Constraint_Error
is raised. If the value is not a value of its subtype and this error is
not detected, the component has an abnormal value, and erroneous
execution can result, See section 13.9.1 Data Validity.
-
The stream-oriented attributes may be specified for any type via an
attribute_definition_clause. All nonlimited types have default
implementations for these operations. An attribute_reference for one of
these attributes is illegal if the type is limited, unless the attribute
has been specified by an attribute_definition_clause. For an
attribute_definition_clause specifying one of these attributes, the
subtype of the Item parameter shall be the base subtype if scalar, and
the first subtype otherwise. The same rule applies to the result of the
Input function.
NOTES
-
(31) For a definite subtype S of a type T, only T'Write and T'Read are
needed to pass an arbitrary value of the subtype through a stream. For
an indefinite subtype S of a type T, T'Output and T'Input will normally
be needed, since T'Write and T'Read do not pass bounds, discriminants,
or tags.
-
(32) User-specified attributes of S'Class are not inherited by other
class-wide types descended from S.
Examples
-
Example of user-defined Write attribute:
-
procedure My_Write
(Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : My_Integer'Base);
for My_Integer'Write use My_Write;
Go to the first, previous, next, last section, table of contents.