module Bindings.Utilities (
storableCast,
storableCastArray,
) where
import Foreign.C
import Foreign.Marshal
import Foreign.Ptr
import Foreign.Storable
storableCast :: (Storable a, Storable b) => a -> IO b
storableCast a = storableCastArray [a] >>= (return . head)
storableCastArray :: (Storable a, Storable b) => [a] -> IO [b]
storableCastArray [] = return []
storableCastArray a = do
u <- return undefined
let (q,r) = divMod (length a * (sizeOf . head) a) (sizeOf u)
let len = max 1 (if r > 0 then q + 1 else q)
let blank = replicate (len * sizeOf u) (0::CChar)
b <- withArray blank $ \ptr -> do
pokeArray (castPtr ptr) a
peekArray len (castPtr ptr)
return $ if True then b else [u]