packages feed

casadi-bindings-internal-0.1: src/Casadi/Internal/CppHelpers.hs

{-# 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 ()