hblas-0.3.0.0: src/Numerical/HBLAS/UtilsFFI.hs
{-# LANGUAGE Trustworthy #-}
{- VERY TRUST WORTHY :) -}
module Numerical.HBLAS.UtilsFFI where
import Data.Vector.Storable.Mutable as M
import Control.Monad.Primitive
import Foreign.ForeignPtr.Safe
import Foreign.ForeignPtr.Unsafe
import Foreign.Storable.Complex()
import Data.Vector.Storable as S
import Foreign.Ptr
{-
the IO version of these various utils is in Base.
but would like to have the
-}
withRWStorable:: (Storable a, PrimMonad m)=> a -> (Ptr a -> m b) -> m a
withRWStorable val fun = do
valVect <- M.replicate 1 val
_ <- unsafeWithPrim valVect fun
M.unsafeRead valVect 0
{-# INLINE withRWStorable #-}
withRStorable :: (Storable a, PrimMonad m)=> a -> (Ptr a -> m b) -> m b
withRStorable val fun = do
valVect <- M.replicate 1 val
unsafeWithPrim valVect fun
{-# INLINE withRStorable #-}
withRStorable_ :: (Storable a, PrimMonad m)=> a -> (Ptr a -> m ()) -> m ()
withRStorable_ val fun = do
valVect <- M.replicate 1 val
unsafeWithPrim valVect fun
return ()
{-# INLINE withRStorable_ #-}
withForeignPtrPrim :: PrimMonad m => ForeignPtr a -> (Ptr a -> m b) -> m b
withForeignPtrPrim fo act
= do r <- act (unsafeForeignPtrToPtr fo)
touchForeignPtrPrim fo
return r
{-# INLINE withForeignPtrPrim #-}
touchForeignPtrPrim ::PrimMonad m => ForeignPtr a -> m ()
touchForeignPtrPrim fp = unsafePrimToPrim $! touchForeignPtr fp
{-# NOINLINE touchForeignPtrPrim #-}
unsafeWithPrim ::( Storable a, PrimMonad m )=> MVector (PrimState m) a -> (Ptr a -> m b) -> m b
{-# INLINE unsafeWithPrim #-}
unsafeWithPrim (MVector _ fp) fun = withForeignPtrPrim fp fun
unsafeWithPrimLen ::( Storable a, PrimMonad m )=> MVector (PrimState m) a -> ((Ptr a, Int )-> m b) -> m b
{-# INLINE unsafeWithPrimLen #-}
unsafeWithPrimLen (MVector n fp ) fun = withForeignPtrPrim fp (\x -> fun (x,n))
unsafeWithPurePrim ::( Storable a, PrimMonad m )=> Vector a -> ((Ptr a)-> m b) -> m b
{-# INLINE unsafeWithPurePrim #-}
unsafeWithPurePrim v fun = case S.unsafeToForeignPtr0 v of
(fp,_) -> do
res <- withForeignPtrPrim fp (\x -> fun x)
touchForeignPtrPrim fp
return res
unsafeWithPurePrimLen ::( Storable a, PrimMonad m )=> Vector a -> ((Ptr a, Int )-> m b) -> m b
{-# INLINE unsafeWithPurePrimLen #-}
unsafeWithPurePrimLen v fun = case S.unsafeToForeignPtr0 v of
(fp,n) -> do
res <- withForeignPtrPrim fp (\x -> fun (x,n))
touchForeignPtrPrim fp
return res