with ada.text_io; use ada.text_io; 
 
package body bignumPkg.even is

   --  Element size - 1 is the least significant digit of a bignum
   function is_even (b : BigNum) return Boolean is
      (b (size - 1) mod 2 = 0);

   function make_even (b, toward : BigNum)  return Even_BigNum is
      ans : BigNum;
      overflow : Boolean;
   begin
      if toward < b  then
         --  Adding Last and ignoring overflow works as subtraction!
         --  The value of b can't be zero and so overflow will always be true,
         --  and but we ignore it and simply use the result, which will be b-1.
         plus_ov (b, Last, ans, overflow); -- BigNumPkg.plus_ov is called

         -- This can overflow only if b = Last,
         -- but if b = Last then b < toward is false
         -- and an exception is raised in the else.
      elsif b < toward then
         ans := b + One;              -- BigNumPkg."+" is called

      else -- b = toward not allowed since we wouldn't know which direction to go
         raise constraint_error with "Toward must be less or greater, not equal";
      end if;

      --  The result returned must be an Even_BigNum.
      --  We can safely Convert ans to an Even_BigNum because Odd +/- 1 gives even.
      return Even_BigNum(ans);
   end make_even;

end BigNumPkg.even;