Commit 1cde295c authored by Sylvain Henry's avatar Sylvain Henry Committed by Marge Bot
Browse files

Bignum: add bigNatFromWordArray

Reimplementation of integer-gmp's byteArrayToBigNat#
parent f08f98e8
......@@ -1520,3 +1520,42 @@ bigNatFromByteArrayBE# sz ba moff s =
bigNatFromByteArray# :: Word# -> ByteArray# -> Word# -> Bool# -> State# s -> (# State# s, BigNat# #)
bigNatFromByteArray# sz ba off 0# s = bigNatFromByteArrayLE# sz ba off s
bigNatFromByteArray# sz ba off _ s = bigNatFromByteArrayBE# sz ba off s
-- | Create a BigNat# from a WordArray# containing /n/ limbs in
-- least-significant-first order.
--
-- If possible 'WordArray#', will be used directly (i.e. shared
-- /without/ cloning the 'WordArray#' into a newly allocated one)
bigNatFromWordArray# :: WordArray# -> Word# -> BigNat#
bigNatFromWordArray# wa n0
| isTrue# (n `eqWord#` 0##)
= bigNatZero# (# #)
| isTrue# (r `eqWord#` 0##) -- i.e. wa is multiple of limb-size
, isTrue# (q `eqWord#` n)
= wa
| True = withNewWordArray# (word2Int# n) \mwa s ->
mwaArrayCopy# mwa 0# wa 0# (word2Int# n) s
where
!(# q, r #) = quotRemWord# (int2Word# (sizeofByteArray# wa))
WORD_SIZE_IN_BYTES##
-- find real size in Words by removing trailing null limbs
!n = real_size n0
real_size 0## = 0##
real_size i
| 0## <- bigNatIndex# wa (word2Int# (i `minusWord#` 1##))
= real_size (i `minusWord#` 1##)
real_size i = i
-- | Create a BigNat from a WordArray# containing /n/ limbs in
-- least-significant-first order.
--
-- If possible 'WordArray#', will be used directly (i.e. shared
-- /without/ cloning the 'WordArray#' into a newly allocated one)
bigNatFromWordArray :: WordArray# -> Word# -> BigNat
bigNatFromWordArray wa n = BN# (bigNatFromWordArray# wa n)
......@@ -53,6 +53,7 @@ module GHC.Integer.GMP.Internals
-- ** Conversions to/from 'BigNat'
, byteArrayToBigNat#
, wordToBigNat
, wordToBigNat2
, bigNatToInt
......@@ -432,3 +433,8 @@ importIntegerFromByteArray ba off sz endian = case runRW# (I.integerFromByteArra
exportIntegerToMutableByteArray :: Integer -> MutableByteArray# RealWorld -> Word# -> Int# -> IO Word
exportIntegerToMutableByteArray i mba off endian = IO (\s -> case I.integerToMutableByteArray# i mba off endian s of
(# s', r #) -> (# s', W# r #))
{-# DEPRECATED byteArrayToBigNat# "Use bigNatFromWordArray instead" #-}
byteArrayToBigNat# :: ByteArray# -> GmpSize# -> BigNat
byteArrayToBigNat# ba n = B.bigNatFromWordArray ba (int2Word# n)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment