Z-Data-2.0.0.2: test/Z/Foreign/CPtrSpec.hs
{-# LANGUAGE UnliftedFFITypes #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Z.Foreign.CPtrSpec where
import Foreign.Ptr
import qualified Data.List as List
import qualified Z.Data.CBytes as CB
import qualified Z.Data.JSON as JSON
import Z.Foreign
import qualified Z.Data.Vector.Base as V
import qualified Z.Data.Array as A
import Z.Foreign.CPtr
import Test.HUnit
import Test.Hspec
import Test.Hspec.QuickCheck
import System.IO.Unsafe
spec :: Spec
spec = describe "Foreign.CPtr" $ do
it "pass cptr list to foreign" $ do
foo1 <- newCPtr' (malloc_foo 8) free_foo
foo2 <- newCPtr' (malloc_foo 8) free_foo
foo3 <- newCPtr' (malloc_foo 8) free_foo
s1 <- withCPtrsUnsafe [foo1, foo2, foo3] sum_pointer
s2 <- withCPtrs [foo1, foo2, foo3] sum_pointer_safe
s3 <- withCPtr foo1 $ \ p1 ->
withCPtr foo2 $ \ p2 ->
withCPtr foo3 $ \ p3 -> do
let WordPtr p1' = ptrToWordPtr p1
WordPtr p2' = ptrToWordPtr p2
WordPtr p3' = ptrToWordPtr p3
return (p1'+p2'+p3')
s1 @=? s3
s2 @=? s3
--------------------------------------------------------------------------------
data Foo
foreign import ccall unsafe "malloc" malloc_foo :: CSize -> IO (Ptr Foo)
foreign import ccall unsafe "&free" free_foo :: FunPtr (Ptr Foo -> IO ())
foreign import ccall unsafe "sum_pointer" sum_pointer :: BA# (Ptr Foo) -> Int -> IO Word
foreign import ccall safe "sum_pointer" sum_pointer_safe :: (Ptr (Ptr Foo)) -> Int -> IO Word