- (1)
- A limited type is (a view of) a type for which the assignment operation
is not allowed. A nonlimited type is a (view of a) type for which the
assignment operation is allowed.
Legality Rules
- (2)
- If a tagged record type has any limited components, then the reserved
word limited shall appear in its record_type_definition.
Static Semantics
- (3)
- A type is limited if it is a descendant of one of the following:
- (4)
- a type with the reserved word limited in its definition;
- (5)
- a task or protected type;
- (6)
- a composite type with a limited component.
- (7)
- Otherwise, the type is nonlimited.
- (8)
- There are no predefined equality operators for a limited type.
-
- (9)
(13) The following are consequences of the rules for limited types:
- (10)
- An initialization expression is not allowed in an object_declaration if the type of the object is limited.
- (11)
- A default expression is not allowed in a component_declaration if the type of the record component is limited.
- (12)
- An initialized allocator is not allowed if the designated
type is limited.
- (13)
- A generic formal parameter of mode in must not be of a
limited type.
- (14)
(14) Aggregates are not available for a limited composite type.
Concatenation is not available for a limited array type.
- (15)
(15) The rules do not exclude a default_expression for a formal
parameter of a limited type; they do not exclude a deferred constant of
a limited type if the full declaration of the constant is of a
nonlimited type.
- (16)
(16) As illustrated in 7.3.1, an untagged limited
type can become nonlimited under certain circumstances.
Examples
- (17)
- Example of a package with a limited type:
(18)
package IO_Package is
type File_Name is limited private;
(19)
procedure Open (F : in out File_Name);
procedure Close(F : in out File_Name);
procedure Read (F : in File_Name; Item : out Integer);
procedure Write(F : in File_Name; Item : in Integer);
private
type File_Name is
limited record
Internal_Name : Integer := 0;
end record;
end IO_Package;
(20)
package body IO_Package is
Limit : constant := 200;
type File_Descriptor is record ... end record;
Directory : array (1 .. Limit) of File_Descriptor;
...
procedure Open (F : in out File_Name) is ... end;
procedure Close(F : in out File_Name) is ... end;
procedure Read (F : in File_Name; Item : out Integer) is ... end;
procedure Write(F : in File_Name; Item : in Integer) is ... end;
begin
...
end IO_Package;
-
- (21)
(17) Notes on the example: In the example above, an outside subprogram
making use of IO_Package may obtain a file name by calling Open and
later use it in calls to Read and Write. Thus, outside the package, a
file name obtained from Open acts as a kind of password; its internal
properties (such as containing a numeric value) are not known and no
other operations (such as addition or comparison of internal names) can
be performed on a file name. Most importantly, clients of the package
cannot make copies of objects of type File_Name.
- (22)
This example is characteristic of any case where complete control
over the operations of a type is desired. Such packages serve a dual
purpose. They prevent a user from making use of the internal structure
of the type. They also implement the notion of an encapsulated data
type where the only operations on the type are those given in the
package specification.
- (23)
The fact that the full view of File_Name is explicitly declared limited
means that parameter passing and function return will always be by reference
(see 6.2 and 6.5).
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12