In standard Ada, the shift and rotate functions are available only
for the predefined modular types in package
Interfaces. However, in
GNAT it is possible to define these functions for any integer
type (signed or modular), as in this example:
function Shift_Left (Value : T; Amount : Natural) return T;
The function name must be one of
Shift_Left, Shift_Right, Shift_Right_Arithmetic, Rotate_Left, or
Rotate_Right. T must be an integer type. T’Size must be
8, 16, 32 or 64 bits; if T is modular, the modulus
must be 2**8, 2**16, 2**32 or 2**64.
The result type must be the same as the type of
The shift amount must be Natural.
The formal parameter names can be anything.
A more convenient way of providing these shift operators is to use the Provide_Shift_Operators pragma, which provides the function declarations and corresponding pragma Import’s for all five shift functions.