foreign-0.2.0.0: src/HsForeign/CppStd.hs
{-# LANGUAGE MagicHash #-}
module HsForeign.CppStd
( -- * StdString
StdString
, newStdString
, maybeNewStdString
, hs_new_std_string
, hs_new_std_string_def
, hs_std_string_size
, hs_std_string_cstr
, hs_delete_std_string
, unsafePeekStdString
-- * StdVector
, StdVector
) where
import Data.ByteString (ByteString)
import qualified Data.ByteString.Unsafe as BS
import Data.Word
import Foreign.Ptr
import HsForeign.String (withByteString)
-------------------------------------------------------------------------------
-- StdString
data StdString
-- | New a c++ std::string from proviced bytestring.
--
-- The memory should be deallocated using delete when no longer required.
newStdString :: ByteString -> IO (Ptr StdString)
newStdString bs = withByteString bs $ hs_new_std_string
maybeNewStdString :: Maybe ByteString -> IO (Ptr StdString)
maybeNewStdString Nothing = pure nullPtr
maybeNewStdString (Just bs) = newStdString bs
unsafePeekStdString :: Ptr StdString -> IO ByteString
unsafePeekStdString stdstring = do
siz <- hs_std_string_size stdstring
ptr <- hs_std_string_cstr stdstring
BS.unsafePackCStringFinalizer ptr siz (hs_delete_std_string stdstring)
{-# INLINE unsafePeekStdString #-}
foreign import ccall unsafe hs_new_std_string :: Ptr Word8 -> Int -> IO (Ptr StdString)
foreign import ccall unsafe hs_new_std_string_def :: IO (Ptr StdString)
foreign import ccall unsafe hs_std_string_size :: Ptr StdString -> IO Int
foreign import ccall unsafe hs_std_string_cstr :: Ptr StdString -> IO (Ptr Word8)
foreign import ccall unsafe hs_delete_std_string :: Ptr StdString -> IO ()
-------------------------------------------------------------------------------
-- StdVector
data StdVector a
peekStdVectorOfString :: Ptr (StdVector StdString) -> [ByteString]
peekStdVectorOfString = undefined