13.6 Change of Representation
{
AI05-0229-1}
{
AI12-0445-1}
[
A
type_conversion
(see
4.6) can be used to convert between two
different representations of the same array or record. To convert an
array from one representation to another, two array types
need
to be declared with matching component subtypes
,
and convertible index types
are required.
If one type has Pack specified and the other does not, then explicit
conversion can be used to pack or unpack an array.
{
AI12-0425-1}
{
AI12-0445-1}
To convert
an untagged a
record from one representation to another, two record types with a common
ancestor type
are required need
to be declared, with no inherited subprograms. Distinct representations
can then be specified for the record types, and explicit conversion between
the types can be used to effect a change in representation.]
Ramification: {
AI12-0425-1}
The language does not allow implicit copying of
by-reference types, so it also does not allow different representations
of related by-reference types. Similarly, language rules prevent related
tagged types from having different representations of the parent part.
Therefore, this This technique
cannot
be used does not work if the first type
is an untagged type with user-defined primitive subprograms. It does
not work at all for tagged
or by-reference
types.
Examples
Example of change
of representation:
-- Packed_Descriptor and Descriptor are two different types
-- with identical characteristics, apart from their
-- representation
type Descriptor is
record
-- components of a descriptor
end record;
type Packed_Descriptor is new Descriptor;
for Packed_Descriptor use
record
-- component clauses for some or for all components
end record;
-- Change of representation can now be accomplished by explicit type conversions:
D : Descriptor;
P : Packed_Descriptor;
P := Packed_Descriptor(D); -- pack D
D := Descriptor(P); -- unpack P
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe