File : bit_arrays-modular.adb


package body Bit_arrays.Modular is

   use Interfaces;

   function To_bit_array_LE(n: Num) return Bit_array is
      Result: Bit_array(1..Num'Size);
      Aux: Mod_aux:= Mod_aux(n);
   begin
      for i in 1..Num'Size loop
         Result(i):= (Shift_right(Aux, i - 1) and 1) = 1; 
      end loop;
      Return Result;
   end To_bit_array_LE;

   function To_bit_array_BE(n: Num) return Bit_array is
      Result: Bit_array(1..Num'Size);
      Aux: Mod_aux:= Mod_aux(n);
   begin
      for i in 1..Num'Size loop
         Result(i):= (Shift_right(Aux, Num'Size - i) and 1) = 1; 
      end loop;
      Return Result;
   end To_bit_array_BE;

   function Append_LE(b: Bit_array; n: Num) return Bit_array is
      Result: Bit_array(b'first..b'last + Num'Size);
      Aux: Mod_aux:= Mod_aux(n);
   begin
      Result(b'first..b'last):= b;
      for i in 1..Num'Size loop
         Result(b'last + i):= (Shift_right(Aux, i - 1) and 1) = 1; 
      end loop;
      Return Result;
   end Append_LE;

   function Append_BE(b: Bit_array; n: Num) return Bit_array is
      Result: Bit_array(b'first..b'last + Num'Size);
      Aux: Mod_aux:= Mod_aux(n);
   begin
      Result(b'first..b'last):= b;
      for i in 1..Num'Size loop
         Result(b'last + i):= (Shift_right(Aux, Num'Size - i) and 1) = 1; 
      end loop;
      Return Result;
   end Append_BE;

   To_num: constant array(boolean) of Mod_aux:= (True => 1, False => 0);

   function To_number_LE(b: Bit_array) return Num is
      Result: Mod_aux:= 0;
   begin
      for i in b'range loop
         Result:= Result or Shift_left(To_num(b(i)), i - b'first);
      end loop;
      return Num(Result);
   end To_number_LE;

   function To_number_BE(b: Bit_array) return Num is
      Result: Mod_aux:= 0;
   begin
      for i in b'range loop
         Result:= Shift_left(Result, 1) or To_num(b(i));
      end loop;
      return Num(result);
   end To_number_BE;

end Bit_arrays.Modular;