with Ada.Text_IO; use Ada.Text_IO;
with Ada.Unchecked_Conversion;
with Interfaces; use Interfaces;
procedure Main is
package Unsigned_32_IO is new Ada.Text_IO.Modular_IO (Unsigned_32);
type Bit_Array_32_Index is range 0 .. 31;
type Bit_Array_17_Index is range 0 .. 16;
type Bit_Array_32 is array (Bit_Array_32_Index) of Boolean with Component_Size => 1, Size => 32;
type Bit_Array_17 is array (Bit_Array_17_Index) of Boolean with Component_Size => 1, Size => 32;
generic
type I is (<>);
type T is array (I) of Boolean;
procedure Generic_Put (Item : T; Width : Field; Base : Number_Base);
procedure Generic_Put (Item : T; Width : Field; Base : Number_Base) is
function Convert_To_Unsigned_32 is new Ada.Unchecked_Conversion (T, Unsigned_32);
begin
Unsigned_32_IO.Put (Convert_To_Unsigned_32 (Item), Width, Base);
end;
generic
type I is (<>);
type T is array (I) of Boolean;
function Generic_Shift_Left (Value : Unsigned_32; Amount : Natural) return T;
function Generic_Shift_Left (Value : Unsigned_32; Amount : Natural) return T is
function Convert_To_Bit_Array_32 is new Ada.Unchecked_Conversion (Unsigned_32, T);
begin
return Convert_To_Bit_Array_32 (Interfaces.Shift_Left (Value, Amount));
end;
function Shift_Left is new Generic_Shift_Left (Bit_Array_32_Index, Bit_Array_32);
function Shift_Left is new Generic_Shift_Left (Bit_Array_17_Index, Bit_Array_17);
procedure Put is new Generic_Put (Bit_Array_32_Index, Bit_Array_32);
procedure Put is new Generic_Put (Bit_Array_17_Index, Bit_Array_17);
B32 : Bit_Array_32 with Volatile;
B17 : Bit_Array_17 with Volatile;
begin
B32 := Shift_Left (1, 2) or Shift_Left (1, 5);
B17 := Shift_Left (1, 2) or Shift_Left (1, 5);
Put (B17, 0, 2);
New_Line;
Put (B32, 0, 2);
end;
d2l0aCBBZGEuVGV4dF9JTzsgdXNlIEFkYS5UZXh0X0lPOwp3aXRoIEFkYS5VbmNoZWNrZWRfQ29udmVyc2lvbjsKd2l0aCBJbnRlcmZhY2VzOyB1c2UgSW50ZXJmYWNlczsKCnByb2NlZHVyZSBNYWluIGlzCiAgIHBhY2thZ2UgVW5zaWduZWRfMzJfSU8gaXMgbmV3IEFkYS5UZXh0X0lPLk1vZHVsYXJfSU8gKFVuc2lnbmVkXzMyKTsKCiAgIHR5cGUgQml0X0FycmF5XzMyX0luZGV4IGlzIHJhbmdlIDAgLi4gMzE7CiAgIHR5cGUgQml0X0FycmF5XzE3X0luZGV4IGlzIHJhbmdlIDAgLi4gMTY7CiAgIHR5cGUgQml0X0FycmF5XzMyIGlzIGFycmF5IChCaXRfQXJyYXlfMzJfSW5kZXgpIG9mIEJvb2xlYW4gd2l0aCBDb21wb25lbnRfU2l6ZSA9PiAxLCBTaXplID0+IDMyOwogICB0eXBlIEJpdF9BcnJheV8xNyBpcyBhcnJheSAoQml0X0FycmF5XzE3X0luZGV4KSBvZiBCb29sZWFuIHdpdGggQ29tcG9uZW50X1NpemUgPT4gMSwgU2l6ZSA9PiAzMjsKCiAgIGdlbmVyaWMKICAgICAgdHlwZSBJIGlzICg8Pik7CiAgICAgIHR5cGUgVCBpcyBhcnJheSAoSSkgb2YgQm9vbGVhbjsKICAgcHJvY2VkdXJlIEdlbmVyaWNfUHV0IChJdGVtIDogVDsgV2lkdGggOiBGaWVsZDsgQmFzZSA6IE51bWJlcl9CYXNlKTsKICAgcHJvY2VkdXJlIEdlbmVyaWNfUHV0IChJdGVtIDogVDsgV2lkdGggOiBGaWVsZDsgQmFzZSA6IE51bWJlcl9CYXNlKSBpcwogICAgICBmdW5jdGlvbiBDb252ZXJ0X1RvX1Vuc2lnbmVkXzMyIGlzIG5ldyBBZGEuVW5jaGVja2VkX0NvbnZlcnNpb24gKFQsIFVuc2lnbmVkXzMyKTsKICAgYmVnaW4KICAgICAgVW5zaWduZWRfMzJfSU8uUHV0IChDb252ZXJ0X1RvX1Vuc2lnbmVkXzMyIChJdGVtKSwgV2lkdGgsIEJhc2UpOwogICBlbmQ7CiAgIAogICBnZW5lcmljCiAgICAgIHR5cGUgSSBpcyAoPD4pOwogICAgICB0eXBlIFQgaXMgYXJyYXkgKEkpIG9mIEJvb2xlYW47CiAgIGZ1bmN0aW9uIEdlbmVyaWNfU2hpZnRfTGVmdCAoVmFsdWUgOiBVbnNpZ25lZF8zMjsgQW1vdW50IDogTmF0dXJhbCkgcmV0dXJuIFQ7CiAgIGZ1bmN0aW9uIEdlbmVyaWNfU2hpZnRfTGVmdCAoVmFsdWUgOiBVbnNpZ25lZF8zMjsgQW1vdW50IDogTmF0dXJhbCkgcmV0dXJuIFQgaXMKICAgICAgZnVuY3Rpb24gQ29udmVydF9Ub19CaXRfQXJyYXlfMzIgaXMgbmV3IEFkYS5VbmNoZWNrZWRfQ29udmVyc2lvbiAoVW5zaWduZWRfMzIsIFQpOwogICBiZWdpbgogICAgICByZXR1cm4gQ29udmVydF9Ub19CaXRfQXJyYXlfMzIgKEludGVyZmFjZXMuU2hpZnRfTGVmdCAoVmFsdWUsIEFtb3VudCkpOwogICBlbmQ7CiAgIAogICBmdW5jdGlvbiBTaGlmdF9MZWZ0IGlzIG5ldyBHZW5lcmljX1NoaWZ0X0xlZnQgKEJpdF9BcnJheV8zMl9JbmRleCwgQml0X0FycmF5XzMyKTsKICAgZnVuY3Rpb24gU2hpZnRfTGVmdCBpcyBuZXcgR2VuZXJpY19TaGlmdF9MZWZ0IChCaXRfQXJyYXlfMTdfSW5kZXgsIEJpdF9BcnJheV8xNyk7CiAgIHByb2NlZHVyZSBQdXQgaXMgbmV3IEdlbmVyaWNfUHV0IChCaXRfQXJyYXlfMzJfSW5kZXgsIEJpdF9BcnJheV8zMik7CiAgIHByb2NlZHVyZSBQdXQgaXMgbmV3IEdlbmVyaWNfUHV0IChCaXRfQXJyYXlfMTdfSW5kZXgsIEJpdF9BcnJheV8xNyk7CiAgIAogICBCMzIgOiBCaXRfQXJyYXlfMzIgd2l0aCBWb2xhdGlsZTsKICAgQjE3IDogQml0X0FycmF5XzE3IHdpdGggVm9sYXRpbGU7CmJlZ2luCiAgIEIzMiA6PSBTaGlmdF9MZWZ0ICgxLCAyKSBvciBTaGlmdF9MZWZ0ICgxLCA1KTsKICAgQjE3IDo9IFNoaWZ0X0xlZnQgKDEsIDIpIG9yIFNoaWZ0X0xlZnQgKDEsIDUpOwogICBQdXQgKEIxNywgMCwgMik7CiAgIE5ld19MaW5lOwogICBQdXQgKEIzMiwgMCwgMik7CmVuZDs=