{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnboxedTuples #-}
module GHC.Internal.Foreign.Marshal.Utils (
with,
new,
fromBool,
toBool,
maybeNew,
maybeWith,
maybePeek,
withMany,
copyBytes,
moveBytes,
fillBytes,
) where
import GHC.Internal.Data.Maybe
import GHC.Internal.Ptr ( Ptr(..), nullPtr )
import GHC.Internal.Foreign.Storable ( Storable(poke) )
import GHC.Internal.Foreign.Marshal.Alloc ( malloc, alloca )
import GHC.Internal.Word ( Word8(..) )
import GHC.Internal.Num
import GHC.Internal.Base
new :: Storable a => a -> IO (Ptr a)
new :: forall a. Storable a => a -> IO (Ptr a)
new a
val =
do
ptr <- IO (Ptr a)
forall a. Storable a => IO (Ptr a)
malloc
poke ptr val
return ptr
with :: Storable a => a -> (Ptr a -> IO b) -> IO b
with :: forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with a
val Ptr a -> IO b
f =
(Ptr a -> IO b) -> IO b
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr a -> IO b) -> IO b) -> (Ptr a -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr a
ptr -> do
Ptr a -> a -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr a
ptr a
val
Ptr a -> IO b
f Ptr a
ptr
fromBool :: Num a => Bool -> a
fromBool :: forall a. Num a => Bool -> a
fromBool Bool
False = a
0
fromBool Bool
True = a
1
toBool :: (Eq a, Num a) => a -> Bool
toBool :: forall a. (Eq a, Num a) => a -> Bool
toBool = (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
0)
maybeNew :: ( a -> IO (Ptr b))
-> (Maybe a -> IO (Ptr b))
maybeNew :: forall a b. (a -> IO (Ptr b)) -> Maybe a -> IO (Ptr b)
maybeNew = IO (Ptr b) -> (a -> IO (Ptr b)) -> Maybe a -> IO (Ptr b)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Ptr b -> IO (Ptr b)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Ptr b
forall a. Ptr a
nullPtr)
maybeWith :: ( a -> (Ptr b -> IO c) -> IO c)
-> (Maybe a -> (Ptr b -> IO c) -> IO c)
maybeWith :: forall a b c.
(a -> (Ptr b -> IO c) -> IO c)
-> Maybe a -> (Ptr b -> IO c) -> IO c
maybeWith = ((Ptr b -> IO c) -> IO c)
-> (a -> (Ptr b -> IO c) -> IO c)
-> Maybe a
-> (Ptr b -> IO c)
-> IO c
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ((Ptr b -> IO c) -> Ptr b -> IO c
forall a b. (a -> b) -> a -> b
$ Ptr b
forall a. Ptr a
nullPtr)
maybePeek :: (Ptr a -> IO b) -> Ptr a -> IO (Maybe b)
maybePeek :: forall a b. (Ptr a -> IO b) -> Ptr a -> IO (Maybe b)
maybePeek Ptr a -> IO b
peek Ptr a
ptr | Ptr a
ptr Ptr a -> Ptr a -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr a
forall a. Ptr a
nullPtr = Maybe b -> IO (Maybe b)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe b
forall a. Maybe a
Nothing
| Bool
otherwise = do a <- Ptr a -> IO b
peek Ptr a
ptr; return (Just a)
withMany :: (a -> (b -> res) -> res)
-> [a]
-> ([b] -> res)
-> res
withMany :: forall a b res.
(a -> (b -> res) -> res) -> [a] -> ([b] -> res) -> res
withMany a -> (b -> res) -> res
_ [] [b] -> res
f = [b] -> res
f []
withMany a -> (b -> res) -> res
withFoo (a
x:[a]
xs) [b] -> res
f = a -> (b -> res) -> res
withFoo a
x ((b -> res) -> res) -> (b -> res) -> res
forall a b. (a -> b) -> a -> b
$ \b
x' ->
(a -> (b -> res) -> res) -> [a] -> ([b] -> res) -> res
forall a b res.
(a -> (b -> res) -> res) -> [a] -> ([b] -> res) -> res
withMany a -> (b -> res) -> res
withFoo [a]
xs (\[b]
xs' -> [b] -> res
f (b
x'b -> [b] -> [b]
forall a. a -> [a] -> [a]
:[b]
xs'))
copyBytes
:: Ptr a
-> Ptr a
-> Int
-> IO ()
copyBytes :: forall a. Ptr a -> Ptr a -> Int -> IO ()
copyBytes = (Ptr Any
-> Ptr Any
-> Int
-> State# RealWorld
-> (# State# RealWorld, () #))
-> Ptr a -> Ptr a -> Int -> IO ()
forall a b. Coercible a b => a -> b
coerce ((Ptr Any
-> Ptr Any
-> Int
-> State# RealWorld
-> (# State# RealWorld, () #))
-> Ptr a -> Ptr a -> Int -> IO ())
-> (Ptr Any
-> Ptr Any
-> Int
-> State# RealWorld
-> (# State# RealWorld, () #))
-> Ptr a
-> Ptr a
-> Int
-> IO ()
forall a b. (a -> b) -> a -> b
$ \(Ptr Addr#
dest#) (Ptr Addr#
src#) (I# Int#
size#) State# RealWorld
s
-> (# Addr# -> Addr# -> Int# -> State# RealWorld -> State# RealWorld
copyAddrToAddrNonOverlapping# Addr#
src# Addr#
dest# Int#
size# State# RealWorld
s, () #)
moveBytes
:: Ptr a
-> Ptr a
-> Int
-> IO ()
moveBytes :: forall a. Ptr a -> Ptr a -> Int -> IO ()
moveBytes = (Ptr Any
-> Ptr Any
-> Int
-> State# RealWorld
-> (# State# RealWorld, () #))
-> Ptr a -> Ptr a -> Int -> IO ()
forall a b. Coercible a b => a -> b
coerce ((Ptr Any
-> Ptr Any
-> Int
-> State# RealWorld
-> (# State# RealWorld, () #))
-> Ptr a -> Ptr a -> Int -> IO ())
-> (Ptr Any
-> Ptr Any
-> Int
-> State# RealWorld
-> (# State# RealWorld, () #))
-> Ptr a
-> Ptr a
-> Int
-> IO ()
forall a b. (a -> b) -> a -> b
$ \(Ptr Addr#
dest#) (Ptr Addr#
src#) (I# Int#
size#) State# RealWorld
s
-> (# Addr# -> Addr# -> Int# -> State# RealWorld -> State# RealWorld
copyAddrToAddr# Addr#
src# Addr#
dest# Int#
size# State# RealWorld
s, () #)
fillBytes :: Ptr a -> Word8 -> Int -> IO ()
fillBytes :: forall a. Ptr a -> Word8 -> Int -> IO ()
fillBytes = (Ptr Any
-> Word8 -> Int -> State# RealWorld -> (# State# RealWorld, () #))
-> Ptr a -> Word8 -> Int -> IO ()
forall a b. Coercible a b => a -> b
coerce ((Ptr Any
-> Word8 -> Int -> State# RealWorld -> (# State# RealWorld, () #))
-> Ptr a -> Word8 -> Int -> IO ())
-> (Ptr Any
-> Word8 -> Int -> State# RealWorld -> (# State# RealWorld, () #))
-> Ptr a
-> Word8
-> Int
-> IO ()
forall a b. (a -> b) -> a -> b
$ \(Ptr Addr#
dest#) (W8# Word8#
byte#) (I# Int#
size#) State# RealWorld
s
-> (# Addr# -> Int# -> Int# -> State# RealWorld -> State# RealWorld
setAddrRange# Addr#
dest# Int#
size# (Word# -> Int#
word2Int# (Word8# -> Word#
word8ToWord# Word8#
byte#)) State# RealWorld
s, () #)