13.7.1 The Package System.Storage_Elements
Static Semantics
The following language-defined
library package exists:
package System.Storage_Elements
is
pragma Pure(Storage_Elements);
type Storage_Offset
is range implementation-defined;
subtype Storage_Count
is Storage_Offset
range 0..Storage_Offset'Last;
type Storage_Element
is mod implementation-defined;
for Storage_Element'Size
use Storage_Unit;
type Storage_Array
is array
(Storage_Offset
range <>)
of aliased Storage_Element;
for Storage_Array'Component_Size
use Storage_Unit;
function "+"(Left : Address; Right : Storage_Offset)
return Address;
function "+"(Left : Storage_Offset; Right : Address)
return Address;
function "-"(Left : Address; Right : Storage_Offset)
return Address;
function "-"(Left, Right : Address)
return Storage_Offset;
function "mod"(Left : Address; Right : Storage_Offset)
return Storage_Offset;
-- Conversion to/from integers:
type Integer_Address
is implementation-defined;
function To_Address(Value : Integer_Address)
return Address;
function To_Integer(Value : Address)
return Integer_Address;
pragma Convention(Intrinsic, "+");
-- ...and so on for all language-defined subprograms declared in this package.
end System.Storage_Elements;
Storage_Element represents a storage element. Storage_Offset
represents an offset in storage elements. Storage_Count represents a
number of storage elements.
Storage_Array
represents a contiguous sequence of storage elements.
Integer_Address is a (signed or modular) integer
subtype. To_Address and To_Integer convert back and forth between this
type and Address.
Implementation Requirements
Storage_Offset'Last shall be greater than or equal
to Integer'Last or the largest possible storage offset, whichever is
smaller. Storage_Offset'First shall be <= (–Storage_Offset'Last).
Implementation Permissions
This paragraph was
deleted.
Implementation Advice
Operations in System and its children should reflect
the target environment semantics as closely as is reasonable. For example,
on most machines, it makes sense for address arithmetic to “wrap
around.”
Operations that do not make sense
should raise Program_Error.