(original) (raw)
{-# LANGUAGE Trustworthy #-} {-# LANGUAGE NoImplicitPrelude, MagicHash, ScopedTypeVariables #-}
module Foreign.Marshal.Array (
advancePtr, ) where
import Foreign.Ptr (Ptr, plusPtr) import Foreign.Storable (Storable(alignment,sizeOf,peekElemOff,pokeElemOff)) import Foreign.Marshal.Alloc (mallocBytes, callocBytes, allocaBytesAligned, reallocBytes) import Foreign.Marshal.Utils (copyBytes, moveBytes)
import GHC.Num import GHC.List import GHC.Base
mallocArray :: forall a . Storable a => Int -> IO (Ptr a) mallocArray :: forall a. Storable a => Int -> IO (Ptr a) mallocArray Int size = Int -> IO (Ptr a) forall a. Int -> IO (Ptr a) mallocBytes (Int size Int -> Int -> Int forall a. Num a => a -> a -> a * a -> Int forall a. Storable a => a -> Int sizeOf (a forall a. HasCallStack => a undefined :: a))
mallocArray0 :: Storable a => Int -> IO (Ptr a) mallocArray0 :: forall a. Storable a => Int -> IO (Ptr a) mallocArray0 Int size = Int -> IO (Ptr a) forall a. Storable a => Int -> IO (Ptr a) mallocArray (Int size Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1)
callocArray :: forall a . Storable a => Int -> IO (Ptr a) callocArray :: forall a. Storable a => Int -> IO (Ptr a) callocArray Int size = Int -> IO (Ptr a) forall a. Int -> IO (Ptr a) callocBytes (Int size Int -> Int -> Int forall a. Num a => a -> a -> a * a -> Int forall a. Storable a => a -> Int sizeOf (a forall a. HasCallStack => a undefined :: a))
callocArray0 :: Storable a => Int -> IO (Ptr a) callocArray0 :: forall a. Storable a => Int -> IO (Ptr a) callocArray0 Int size = Int -> IO (Ptr a) forall a. Storable a => Int -> IO (Ptr a) callocArray (Int size Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1)
allocaArray :: forall a b . Storable a => Int -> (Ptr a -> IO b) -> IO b allocaArray :: forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b allocaArray Int size = Int -> Int -> (Ptr a -> IO b) -> IO b forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b allocaBytesAligned (Int size Int -> Int -> Int forall a. Num a => a -> a -> a * a -> Int forall a. Storable a => a -> Int sizeOf (a forall a. HasCallStack => a undefined :: a)) (a -> Int forall a. Storable a => a -> Int alignment (a forall a. HasCallStack => a undefined :: a))
allocaArray0 :: Storable a => Int -> (Ptr a -> IO b) -> IO b allocaArray0 :: forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b allocaArray0 Int size = Int -> (Ptr a -> IO b) -> IO b forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b allocaArray (Int size Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1) {-# INLINE allocaArray0 #-}
reallocArray :: forall a . Storable a => Ptr a -> Int -> IO (Ptr a) reallocArray :: forall a. Storable a => Ptr a -> Int -> IO (Ptr a) reallocArray Ptr a ptr Int size = Ptr a -> Int -> IO (Ptr a) forall a. Ptr a -> Int -> IO (Ptr a) reallocBytes Ptr a ptr (Int size Int -> Int -> Int forall a. Num a => a -> a -> a * a -> Int forall a. Storable a => a -> Int sizeOf (a forall a. HasCallStack => a undefined :: a))
reallocArray0 :: Storable a => Ptr a -> Int -> IO (Ptr a) reallocArray0 :: forall a. Storable a => Ptr a -> Int -> IO (Ptr a) reallocArray0 Ptr a ptr Int size = Ptr a -> Int -> IO (Ptr a) forall a. Storable a => Ptr a -> Int -> IO (Ptr a) reallocArray Ptr a ptr (Int size Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1)
peekArray :: Storable a => Int -> Ptr a -> IO [a] peekArray :: forall a. Storable a => Int -> Ptr a -> IO [a] peekArray Int size Ptr a ptr | Int size Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <= Int 0 = [a] -> IO [a] forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return [] | Bool otherwise = Int -> [a] -> IO [a] f (Int sizeInt -> Int -> Int forall a. Num a => a -> a -> a -Int
- [] where f :: Int -> [a] -> IO [a] f Int 0 [a] acc = do a e <- Ptr a -> Int -> IO a forall a. Storable a => Ptr a -> Int -> IO a peekElemOff Ptr a ptr Int 0; [a] -> IO [a] forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return (a ea -> [a] -> [a] forall a. a -> [a] -> [a] :[a] acc) f Int n [a] acc = do a e <- Ptr a -> Int -> IO a forall a. Storable a => Ptr a -> Int -> IO a peekElemOff Ptr a ptr Int n; Int -> [a] -> IO [a] f (Int nInt -> Int -> Int forall a. Num a => a -> a -> a -Int
- (a ea -> [a] -> [a] forall a. a -> [a] -> [a] :[a] acc)
peekArray0 :: (Storable a, Eq a) => a -> Ptr a -> IO [a] peekArray0 :: forall a. (Storable a, Eq a) => a -> Ptr a -> IO [a] peekArray0 a marker Ptr a ptr = do Int size <- a -> Ptr a -> IO Int forall a. (Storable a, Eq a) => a -> Ptr a -> IO Int lengthArray0 a marker Ptr a ptr Int -> Ptr a -> IO [a] forall a. Storable a => Int -> Ptr a -> IO [a] peekArray Int size Ptr a ptr
pokeArray :: Storable a => Ptr a -> [a] -> IO () pokeArray :: forall a. Storable a => Ptr a -> [a] -> IO () pokeArray Ptr a ptr [a] vals0 = [a] -> Int# -> IO () go [a] vals0 Int# 0# where go :: [a] -> Int# -> IO () go [] Int# _ = () -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return () go (a val:[a] vals) Int# n# = do Ptr a -> Int -> a -> IO () forall a. Storable a => Ptr a -> Int -> a -> IO () pokeElemOff Ptr a ptr (Int# -> Int I# Int# n#) a val; [a] -> Int# -> IO () go [a] vals (Int# n# Int# -> Int# -> Int# +# Int# 1#)
pokeArray0 :: Storable a => a -> Ptr a -> [a] -> IO () pokeArray0 :: forall a. Storable a => a -> Ptr a -> [a] -> IO () pokeArray0 a marker Ptr a ptr [a] vals0 = [a] -> Int# -> IO () go [a] vals0 Int# 0# where go :: [a] -> Int# -> IO () go [] Int# n# = Ptr a -> Int -> a -> IO () forall a. Storable a => Ptr a -> Int -> a -> IO () pokeElemOff Ptr a ptr (Int# -> Int I# Int# n#) a marker go (a val:[a] vals) Int# n# = do Ptr a -> Int -> a -> IO () forall a. Storable a => Ptr a -> Int -> a -> IO () pokeElemOff Ptr a ptr (Int# -> Int I# Int# n#) a val; [a] -> Int# -> IO () go [a] vals (Int# n# Int# -> Int# -> Int# +# Int# 1#)
newArray :: Storable a => [a] -> IO (Ptr a) newArray :: forall a. Storable a => [a] -> IO (Ptr a) newArray [a] vals = do Ptr a ptr <- Int -> IO (Ptr a) forall a. Storable a => Int -> IO (Ptr a) mallocArray ([a] -> Int forall a. [a] -> Int length [a] vals) Ptr a -> [a] -> IO () forall a. Storable a => Ptr a -> [a] -> IO () pokeArray Ptr a ptr [a] vals Ptr a -> IO (Ptr a) forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return Ptr a ptr
newArray0 :: Storable a => a -> [a] -> IO (Ptr a) newArray0 :: forall a. Storable a => a -> [a] -> IO (Ptr a) newArray0 a marker [a] vals = do Ptr a ptr <- Int -> IO (Ptr a) forall a. Storable a => Int -> IO (Ptr a) mallocArray0 ([a] -> Int forall a. [a] -> Int length [a] vals) a -> Ptr a -> [a] -> IO () forall a. Storable a => a -> Ptr a -> [a] -> IO () pokeArray0 a marker Ptr a ptr [a] vals Ptr a -> IO (Ptr a) forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return Ptr a ptr
withArray :: Storable a => [a] -> (Ptr a -> IO b) -> IO b withArray :: forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b withArray [a] vals = [a] -> (Int -> Ptr a -> IO b) -> IO b forall a b. Storable a => [a] -> (Int -> Ptr a -> IO b) -> IO b withArrayLen [a] vals ((Int -> Ptr a -> IO b) -> IO b) -> ((Ptr a -> IO b) -> Int -> Ptr a -> IO b) -> (Ptr a -> IO b) -> IO b forall b c a. (b -> c) -> (a -> b) -> a -> c . (Ptr a -> IO b) -> Int -> Ptr a -> IO b forall a b. a -> b -> a const
withArrayLen :: Storable a => [a] -> (Int -> Ptr a -> IO b) -> IO b withArrayLen :: forall a b. Storable a => [a] -> (Int -> Ptr a -> IO b) -> IO b withArrayLen [a] vals Int -> Ptr a -> IO b f = Int -> (Ptr a -> IO b) -> IO b forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b allocaArray Int len ((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 () pokeArray Ptr a ptr [a] vals Int -> Ptr a -> IO b f Int len Ptr a ptr where len :: Int len = [a] -> Int forall a. [a] -> Int length [a] vals
withArray0 :: Storable a => a -> [a] -> (Ptr a -> IO b) -> IO b withArray0 :: forall a b. Storable a => a -> [a] -> (Ptr a -> IO b) -> IO b withArray0 a marker [a] vals = a -> [a] -> (Int -> Ptr a -> IO b) -> IO b forall a b. Storable a => a -> [a] -> (Int -> Ptr a -> IO b) -> IO b withArrayLen0 a marker [a] vals ((Int -> Ptr a -> IO b) -> IO b) -> ((Ptr a -> IO b) -> Int -> Ptr a -> IO b) -> (Ptr a -> IO b) -> IO b forall b c a. (b -> c) -> (a -> b) -> a -> c . (Ptr a -> IO b) -> Int -> Ptr a -> IO b forall a b. a -> b -> a const
withArrayLen0 :: Storable a => a -> [a] -> (Int -> Ptr a -> IO b) -> IO b withArrayLen0 :: forall a b. Storable a => a -> [a] -> (Int -> Ptr a -> IO b) -> IO b withArrayLen0 a marker [a] vals Int -> Ptr a -> IO b f = Int -> (Ptr a -> IO b) -> IO b forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b allocaArray0 Int len ((Ptr a -> IO b) -> IO b) -> (Ptr a -> IO b) -> IO b forall a b. (a -> b) -> a -> b $ \Ptr a ptr -> do a -> Ptr a -> [a] -> IO () forall a. Storable a => a -> Ptr a -> [a] -> IO () pokeArray0 a marker Ptr a ptr [a] vals Int -> Ptr a -> IO b f Int len Ptr a ptr where len :: Int len = [a] -> Int forall a. [a] -> Int length [a] vals
copyArray :: forall a . Storable a => Ptr a -> Ptr a -> Int -> IO () copyArray :: forall a. Storable a => Ptr a -> Ptr a -> Int -> IO () copyArray Ptr a dest Ptr a src Int size = Ptr a -> Ptr a -> Int -> IO () forall a. Ptr a -> Ptr a -> Int -> IO () copyBytes Ptr a dest Ptr a src (Int size Int -> Int -> Int forall a. Num a => a -> a -> a * a -> Int forall a. Storable a => a -> Int sizeOf (a forall a. HasCallStack => a undefined :: a))
moveArray :: forall a . Storable a => Ptr a -> Ptr a -> Int -> IO () moveArray :: forall a. Storable a => Ptr a -> Ptr a -> Int -> IO () moveArray Ptr a dest Ptr a src Int size = Ptr a -> Ptr a -> Int -> IO () forall a. Ptr a -> Ptr a -> Int -> IO () moveBytes Ptr a dest Ptr a src (Int size Int -> Int -> Int forall a. Num a => a -> a -> a * a -> Int forall a. Storable a => a -> Int sizeOf (a forall a. HasCallStack => a undefined :: a))
lengthArray0 :: (Storable a, Eq a) => a -> Ptr a -> IO Int lengthArray0 :: forall a. (Storable a, Eq a) => a -> Ptr a -> IO Int lengthArray0 a marker Ptr a ptr = Int -> IO Int loop Int 0 where loop :: Int -> IO Int loop Int i = do a val <- Ptr a -> Int -> IO a forall a. Storable a => Ptr a -> Int -> IO a peekElemOff Ptr a ptr Int i if a val a -> a -> Bool forall a. Eq a => a -> a -> Bool == a marker then Int -> IO Int forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return Int i else Int -> IO Int loop (Int iInt -> Int -> Int forall a. Num a => a -> a -> a +Int 1)
advancePtr :: forall a . Storable a => Ptr a -> Int -> Ptr a
advancePtr :: forall a. Storable a => Ptr a -> Int -> Ptr a
advancePtr Ptr a
ptr Int
i = Ptr a
ptr Ptr a -> Int -> Ptr a
forall a b. Ptr a -> Int -> Ptr b
plusPtr (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
* a -> Int
forall a. Storable a => a -> Int
sizeOf (a
forall a. HasCallStack => a
undefined :: a))