module Data.Random.Internal.Words where
import Data.Bits
import Data.Word
import Foreign.Marshal (allocaBytes)
import Foreign.Ptr (castPtr)
import Foreign.Storable (peek, pokeByteOff)
import System.IO.Unsafe (unsafePerformIO)
{-# INLINE buildWord16 #-}
buildWord16 :: Word8 -> Word8 -> Word16
buildWord16 :: Word8 -> Word8 -> Word16
buildWord16 b0 :: Word8
b0 b1 :: Word8
b1
= IO Word16 -> Word16
forall a. IO a -> a
unsafePerformIO (IO Word16 -> Word16)
-> ((Ptr Any -> IO Word16) -> IO Word16)
-> (Ptr Any -> IO Word16)
-> Word16
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> (Ptr Any -> IO Word16) -> IO Word16
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes 2 ((Ptr Any -> IO Word16) -> Word16)
-> (Ptr Any -> IO Word16) -> Word16
forall a b. (a -> b) -> a -> b
$ \p :: Ptr Any
p -> do
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 0 Word8
b0
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 1 Word8
b1
Ptr Word16 -> IO Word16
forall a. Storable a => Ptr a -> IO a
peek (Ptr Any -> Ptr Word16
forall a b. Ptr a -> Ptr b
castPtr Ptr Any
p)
{-# INLINE buildWord32 #-}
buildWord32 :: Word8 -> Word8 -> Word8 -> Word8 -> Word32
buildWord32 :: Word8 -> Word8 -> Word8 -> Word8 -> Word32
buildWord32 b0 :: Word8
b0 b1 :: Word8
b1 b2 :: Word8
b2 b3 :: Word8
b3
= IO Word32 -> Word32
forall a. IO a -> a
unsafePerformIO (IO Word32 -> Word32)
-> ((Ptr Any -> IO Word32) -> IO Word32)
-> (Ptr Any -> IO Word32)
-> Word32
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> (Ptr Any -> IO Word32) -> IO Word32
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes 4 ((Ptr Any -> IO Word32) -> Word32)
-> (Ptr Any -> IO Word32) -> Word32
forall a b. (a -> b) -> a -> b
$ \p :: Ptr Any
p -> do
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 0 Word8
b0
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 1 Word8
b1
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 2 Word8
b2
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 3 Word8
b3
Ptr Word32 -> IO Word32
forall a. Storable a => Ptr a -> IO a
peek (Ptr Any -> Ptr Word32
forall a b. Ptr a -> Ptr b
castPtr Ptr Any
p)
{-# INLINE buildWord32' #-}
buildWord32' :: Word16 -> Word16 -> Word32
buildWord32' :: Word16 -> Word16 -> Word32
buildWord32' w0 :: Word16
w0 w1 :: Word16
w1
= IO Word32 -> Word32
forall a. IO a -> a
unsafePerformIO (IO Word32 -> Word32)
-> ((Ptr Any -> IO Word32) -> IO Word32)
-> (Ptr Any -> IO Word32)
-> Word32
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> (Ptr Any -> IO Word32) -> IO Word32
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes 4 ((Ptr Any -> IO Word32) -> Word32)
-> (Ptr Any -> IO Word32) -> Word32
forall a b. (a -> b) -> a -> b
$ \p :: Ptr Any
p -> do
Ptr Any -> Int -> Word16 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 0 Word16
w0
Ptr Any -> Int -> Word16 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 2 Word16
w1
Ptr Word32 -> IO Word32
forall a. Storable a => Ptr a -> IO a
peek (Ptr Any -> Ptr Word32
forall a b. Ptr a -> Ptr b
castPtr Ptr Any
p)
{-# INLINE buildWord64 #-}
buildWord64 :: Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word64
buildWord64 :: Word8
-> Word8
-> Word8
-> Word8
-> Word8
-> Word8
-> Word8
-> Word8
-> Word64
buildWord64 b0 :: Word8
b0 b1 :: Word8
b1 b2 :: Word8
b2 b3 :: Word8
b3 b4 :: Word8
b4 b5 :: Word8
b5 b6 :: Word8
b6 b7 :: Word8
b7
= IO Word64 -> Word64
forall a. IO a -> a
unsafePerformIO (IO Word64 -> Word64)
-> ((Ptr Any -> IO Word64) -> IO Word64)
-> (Ptr Any -> IO Word64)
-> Word64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> (Ptr Any -> IO Word64) -> IO Word64
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes 8 ((Ptr Any -> IO Word64) -> Word64)
-> (Ptr Any -> IO Word64) -> Word64
forall a b. (a -> b) -> a -> b
$ \p :: Ptr Any
p -> do
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 0 Word8
b0
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 1 Word8
b1
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 2 Word8
b2
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 3 Word8
b3
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 4 Word8
b4
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 5 Word8
b5
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 6 Word8
b6
Ptr Any -> Int -> Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 7 Word8
b7
Ptr Word64 -> IO Word64
forall a. Storable a => Ptr a -> IO a
peek (Ptr Any -> Ptr Word64
forall a b. Ptr a -> Ptr b
castPtr Ptr Any
p)
{-# INLINE buildWord64' #-}
buildWord64' :: Word16 -> Word16 -> Word16 -> Word16 -> Word64
buildWord64' :: Word16 -> Word16 -> Word16 -> Word16 -> Word64
buildWord64' w0 :: Word16
w0 w1 :: Word16
w1 w2 :: Word16
w2 w3 :: Word16
w3
= IO Word64 -> Word64
forall a. IO a -> a
unsafePerformIO (IO Word64 -> Word64)
-> ((Ptr Any -> IO Word64) -> IO Word64)
-> (Ptr Any -> IO Word64)
-> Word64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> (Ptr Any -> IO Word64) -> IO Word64
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes 8 ((Ptr Any -> IO Word64) -> Word64)
-> (Ptr Any -> IO Word64) -> Word64
forall a b. (a -> b) -> a -> b
$ \p :: Ptr Any
p -> do
Ptr Any -> Int -> Word16 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 0 Word16
w0
Ptr Any -> Int -> Word16 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 2 Word16
w1
Ptr Any -> Int -> Word16 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 4 Word16
w2
Ptr Any -> Int -> Word16 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 6 Word16
w3
Ptr Word64 -> IO Word64
forall a. Storable a => Ptr a -> IO a
peek (Ptr Any -> Ptr Word64
forall a b. Ptr a -> Ptr b
castPtr Ptr Any
p)
{-# INLINE buildWord64'' #-}
buildWord64'' :: Word32 -> Word32 -> Word64
buildWord64'' :: Word32 -> Word32 -> Word64
buildWord64'' w0 :: Word32
w0 w1 :: Word32
w1
= IO Word64 -> Word64
forall a. IO a -> a
unsafePerformIO (IO Word64 -> Word64)
-> ((Ptr Any -> IO Word64) -> IO Word64)
-> (Ptr Any -> IO Word64)
-> Word64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> (Ptr Any -> IO Word64) -> IO Word64
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes 8 ((Ptr Any -> IO Word64) -> Word64)
-> (Ptr Any -> IO Word64) -> Word64
forall a b. (a -> b) -> a -> b
$ \p :: Ptr Any
p -> do
Ptr Any -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 0 Word32
w0
Ptr Any -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Any
p 4 Word32
w1
Ptr Word64 -> IO Word64
forall a. Storable a => Ptr a -> IO a
peek (Ptr Any -> Ptr Word64
forall a b. Ptr a -> Ptr b
castPtr Ptr Any
p)
{-# INLINE word32ToFloat #-}
word32ToFloat :: Word32 -> Float
word32ToFloat :: Word32 -> Float
word32ToFloat x :: Word32
x = (Integer -> Int -> Float
forall a. RealFloat a => Integer -> Int -> a
encodeFloat (Integer -> Int -> Float) -> Integer -> Int -> Float
forall a b. (a -> b) -> a -> b
$! Word32 -> Integer
forall a. Integral a => a -> Integer
toInteger (Word32
x Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. 0x007fffff )) (Int -> Float) -> Int -> Float
forall a b. (a -> b) -> a -> b
$ (-23)
{-# INLINE word32ToFloatWithExcess #-}
word32ToFloatWithExcess :: Word32 -> (Float, Word32)
word32ToFloatWithExcess :: Word32 -> (Float, Word32)
word32ToFloatWithExcess x :: Word32
x = (Word32 -> Float
word32ToFloat Word32
x, Word32
x Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
`shiftR` 23)
{-# INLINE wordToFloat #-}
wordToFloat :: Word64 -> Float
wordToFloat :: Word64 -> Float
wordToFloat x :: Word64
x = (Integer -> Int -> Float
forall a. RealFloat a => Integer -> Int -> a
encodeFloat (Integer -> Int -> Float) -> Integer -> Int -> Float
forall a b. (a -> b) -> a -> b
$! Word64 -> Integer
forall a. Integral a => a -> Integer
toInteger (Word64
x Word64 -> Word64 -> Word64
forall a. Bits a => a -> a -> a
.&. 0x007fffff )) (Int -> Float) -> Int -> Float
forall a b. (a -> b) -> a -> b
$ (-23)
{-# INLINE wordToFloatWithExcess #-}
wordToFloatWithExcess :: Word64 -> (Float, Word64)
wordToFloatWithExcess :: Word64 -> (Float, Word64)
wordToFloatWithExcess x :: Word64
x = (Word64 -> Float
wordToFloat Word64
x, Word64
x Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`shiftR` 23)
{-# INLINE wordToDouble #-}
wordToDouble :: Word64 -> Double
wordToDouble :: Word64 -> Double
wordToDouble x :: Word64
x = (Integer -> Int -> Double
forall a. RealFloat a => Integer -> Int -> a
encodeFloat (Integer -> Int -> Double) -> Integer -> Int -> Double
forall a b. (a -> b) -> a -> b
$! Word64 -> Integer
forall a. Integral a => a -> Integer
toInteger (Word64
x Word64 -> Word64 -> Word64
forall a. Bits a => a -> a -> a
.&. 0x000fffffffffffff )) (Int -> Double) -> Int -> Double
forall a b. (a -> b) -> a -> b
$ (-52)
{-# INLINE word32ToDouble #-}
word32ToDouble :: Word32 -> Double
word32ToDouble :: Word32 -> Double
word32ToDouble x :: Word32
x = (Integer -> Int -> Double
forall a. RealFloat a => Integer -> Int -> a
encodeFloat (Integer -> Int -> Double) -> Integer -> Int -> Double
forall a b. (a -> b) -> a -> b
$! Word32 -> Integer
forall a. Integral a => a -> Integer
toInteger Word32
x) (Int -> Double) -> Int -> Double
forall a b. (a -> b) -> a -> b
$ (-32)
{-# INLINE wordToDoubleWithExcess #-}
wordToDoubleWithExcess :: Word64 -> (Double, Word64)
wordToDoubleWithExcess :: Word64 -> (Double, Word64)
wordToDoubleWithExcess x :: Word64
x = (Word64 -> Double
wordToDouble Word64
x, Word64
x Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`shiftR` 52)