halide-haskell-0.0.1.0: src/Language/Halide/Utils.hs
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
-- |
-- Module : Language.Halide.Utils
-- Description : Utilities for writing FFI code
-- Copyright : (c) Tom Westerhout, 2023
module Language.Halide.Utils
( peekCxxString
, peekAndDeleteCxxString
) where
import Data.ByteString (packCString)
import Data.Text (Text)
import qualified Data.Text.Encoding as T
import Foreign.Ptr (Ptr)
import qualified Language.C.Inline.Unsafe as CU
import Language.Halide.Context
import Language.Halide.Type
importHalide
-- | Convert a pointer to @std::string@ into a string.
--
-- It properly handles unicode characters.
peekCxxString :: Ptr CxxString -> IO Text
peekCxxString p =
fmap T.decodeUtf8 $
packCString
=<< [CU.exp| char const* { $(const std::string* p)->c_str() } |]
-- | Call 'peekCxxString' and @delete@ the pointer.
peekAndDeleteCxxString :: Ptr CxxString -> IO Text
peekAndDeleteCxxString p = do
s <- peekCxxString p
[CU.exp| void { delete $(const std::string* p) } |]
pure s