{-# OPTIONS_GHC -Wall #-}
module Casadi.Internal.CppHelpers
( newStdVec
, readStdVec
, c_newStdString
, c_deleteStdString
, c_lengthStdString
, c_copyStdString
) where
import qualified Data.Vector as V
import Foreign.C.Types
import Foreign.Ptr ( Ptr )
import Foreign.Marshal ( mallocArray, free, peekArray, withArrayLen )
import Casadi.Internal.MarshalTypes
import Casadi.Internal.CToolsImports
newStdVec :: V.Vector (Ptr a) -> IO (Ptr (StdVec (Ptr a)))
newStdVec vec = do
withArrayLen (V.toList vec) $ \num array ->
c_newVecVoidP array (fromIntegral num)
readStdVec :: Ptr (StdVec (Ptr a)) -> IO (V.Vector (Ptr a))
readStdVec vecPtr = do
n <- fmap fromIntegral (c_sizeVecVoidP vecPtr)
arr <- mallocArray n
c_copyVecVoidP vecPtr arr
ret <- peekArray n arr
free arr
return (V.fromList ret)
foreign import ccall unsafe "hs_new_string" c_newStdString
:: Ptr CChar -> IO (Ptr StdString)
foreign import ccall unsafe "hs_delete_string" c_deleteStdString
:: Ptr StdString -> IO ()
foreign import ccall unsafe "hs_length_string" c_lengthStdString
:: Ptr StdString -> IO CInt
foreign import ccall unsafe "hs_copy_string" c_copyStdString
:: Ptr StdString -> Ptr CChar -> IO ()