foreign 0.2.0.1 → 0.2.1.0
raw patch · 4 files changed
+51/−7 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ HsForeign.CppStd: newStdStringFromShort :: ShortByteString -> IO (Ptr StdString)
+ HsForeign.CppStd: peekStdStringShort :: Ptr StdString -> IO ShortByteString
Files
- foreign.cabal +1/−1
- src/HsForeign/CppStd.hs +40/−5
- src/HsForeign/Primitive.hs +3/−1
- test/HsForeign/StringSpec.hs +7/−0
foreign.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: foreign-version: 0.2.0.1+version: 0.2.1.0 synopsis: A collection of helpers for ffi. description: Please see the README on Github at <https://github.com/4eUeP/foreign#readme>
src/HsForeign/CppStd.hs view
@@ -4,6 +4,7 @@ ( -- * StdString StdString , newStdString+ , newStdStringFromShort , maybeNewStdString , hs_new_std_string , hs_new_std_string_def@@ -11,17 +12,21 @@ , hs_std_string_cstr , hs_delete_std_string , unsafePeekStdString+ , peekStdStringShort -- * StdVector , StdVector ) where -import Data.ByteString (ByteString)-import qualified Data.ByteString.Unsafe as BS+import Data.ByteString (ByteString)+import Data.ByteString.Short (ShortByteString)+import qualified Data.ByteString.Short as BSS+import qualified Data.ByteString.Unsafe as BS import Data.Word import Foreign.Ptr -import HsForeign.String (withByteString)+import HsForeign.Primitive+import HsForeign.String ------------------------------------------------------------------------------- -- StdString@@ -34,6 +39,9 @@ newStdString :: ByteString -> IO (Ptr StdString) newStdString bs = withByteString bs $ hs_new_std_string +newStdStringFromShort :: ShortByteString -> IO (Ptr StdString)+newStdStringFromShort sbs = withShortByteString sbs $ hs_new_std_string'+ maybeNewStdString :: Maybe ByteString -> IO (Ptr StdString) maybeNewStdString Nothing = pure nullPtr maybeNewStdString (Just bs) = newStdString bs@@ -45,7 +53,19 @@ BS.unsafePackCStringFinalizer ptr siz (hs_delete_std_string stdstring) {-# INLINE unsafePeekStdString #-} +peekStdStringShort :: Ptr StdString -> IO ShortByteString+peekStdStringShort stdstring = do+ siz <- hs_std_string_size stdstring+ ptr <- hs_std_string_cstr stdstring+ BSS.packCStringLen (castPtr ptr, siz)++-- TODO+--withStdString :: (Ptr StdString -> IO a) -> IO (ByteString, a)+--withStdString = undefined+ foreign import ccall unsafe hs_new_std_string :: Ptr Word8 -> Int -> IO (Ptr StdString)+foreign import ccall unsafe "hs_new_std_string"+ hs_new_std_string' :: ByteArray# -> 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)@@ -56,5 +76,20 @@ data StdVector a -peekStdVectorOfString :: Ptr (StdVector StdString) -> [ByteString]-peekStdVectorOfString = undefined+-- TODO++--peekStdVectorOfString :: Ptr (StdVector StdString) -> [ByteString]+--peekStdVectorOfString = undefined++-------------------------------------------------------------------------------+-- StdMap++-- TODO++-------------------------------------------------------------------------------+-- StdMultiMap++-- TODO++--data CStdMultiMap k v+--newtype StdMultiMap k v = StdMultiMap (CStdMultiMap k v)
src/HsForeign/Primitive.hs view
@@ -34,6 +34,7 @@ import Data.Primitive import Data.Primitive.Unlifted.Array import Foreign.ForeignPtr+import Foreign.Ptr import GHC.Exts -------------------------------------------------------------------------------@@ -127,7 +128,8 @@ {-# INLINABLE withPrimArray #-} withPrimList :: Prim a => [a] -> (Ptr a -> Int -> IO b) -> IO b-withPrimList = withPrimArray . primArrayFromList+withPrimList [] f = f nullPtr 0+withPrimList xs f = withPrimArray (primArrayFromList xs) f {-# INLINABLE withPrimList #-} -- From Z-Data package: Z.Foreign
test/HsForeign/StringSpec.hs view
@@ -18,3 +18,10 @@ -- 3. unsafePeekStdString peek the std::string with a delete finalizer. let f = unsafePeekStdString =<< (withByteString s $ \p l -> hs_new_std_string p l) in unsafeDupablePerformIO f === s++ prop "newStdStringFromShort" $ \s -> do+ let f = do p <- newStdStringFromShort s+ s' <- peekStdStringShort p+ hs_delete_std_string p+ pure s'+ in unsafeDupablePerformIO f === s