Prev | Up | ____ | Back | Forward
TOC -- / --.-- / --.--.-- | Index | Search | Syntax | Help


13.13.2 Stream-Oriented Attributes

(1)
The Write, Read, Output, and Input attributes convert values to a stream of elements and reconstruct values from a stream.
Static Semantics
(2)
For every subtype S of a specific type T, the following attributes are defined.
(3)
S'Write
(4)
           procedure S'Write(
              Stream : access Ada.Streams.Root_Stream_Type'Class;
              Item : in T)
(5)
(6)
S'Read
(7)
           procedure S'Read(
              Stream : access Ada.Streams.Root_Stream_Type'Class;
              Item : out T)
(8)
(9)
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.
(10)
For every subtype S'Class of a class-wide type T'Class:
(11)
S'Class'Write
(12)
           procedure S'Class'Write(
              Stream : access Ada.Streams.Root_Stream_Type'Class;
              Item   : in T'Class)
(13)
(14)
S'Class'Read
(15)
           procedure S'Class'Read(
              Stream : access Ada.Streams.Root_Stream_Type'Class;
              Item : out T'Class)
(16)
Implementation Advice
(17)
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
(18)
For every subtype S of a specific type T, the following attributes are defined.
(19)
S'Output
(20)
           procedure S'Output(
              Stream : access Ada.Streams.Root_Stream_Type'Class;
              Item : in T)
(21)
(22)
S'Input
(23)
           function S'Input(
              Stream : access Ada.Streams.Root_Stream_Type'Class)
              return T
(24)
(25)
Unless overridden by an attribute_definition_clause, these subprograms execute as follows:
(26)
(27)
(28)
For every subtype S'Class of a class-wide type T'Class:
(29)
S'Class'Output
(30)
           procedure S'Class'Output(
              Stream : access Ada.Streams.Root_Stream_Type'Class;
              Item   : in T'Class)
(31)
(32)
S'Class'Input
(33)
           function S'Class'Input(
              Stream : access Ada.Streams.Root_Stream_Type'Class)
              return T'Class
(34)
(35)
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 13.9.1).
(36)
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.

(37)
(38)
Examples
(39)
Example of user-defined Write attribute:
(40)
       procedure My_Write(
         Stream : access Ada.Streams.Root_Stream_Type'Class; Item : My_Integer'Base);
       for My_Integer'Write use My_Write;

Prev | Up | ____ | Back | Forward
TOC -- / --.-- / --.--.-- | Index | Search | Syntax | Help

Ada WWW Home -- Email comments, additions, corrections, gripes, kudos, etc. to:

Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12