inline-c-cpp-0.3.1.0: src/Language/C/Inline/Cpp.hs
-- | Module exposing a 'Context' to inline C++ code. We only have used
-- this for experiments, so use with caution. See the C++ tests to see
-- how to build inline C++ code.
module Language.C.Inline.Cpp
( module Language.C.Inline
, cppCtx
, cppTypePairs
, using
) where
import Data.Monoid ((<>), mempty)
import qualified Language.Haskell.TH as TH
import qualified Language.Haskell.TH.Syntax as TH
import Language.C.Inline
import Language.C.Inline.Context
import qualified Language.C.Types as CT
import qualified Data.Map as Map
-- | The equivalent of 'C.baseCtx' for C++. It specifies the @.cpp@
-- file extension for the C file, so that g++ will decide to build C++
-- instead of C. See the @.cabal@ test target for an example on how to
-- build.
cppCtx :: Context
cppCtx = baseCtx <> mempty
{ ctxForeignSrcLang = Just TH.LangCxx
, ctxOutput = Just $ \s -> "extern \"C\" {\n" ++ s ++ "\n}"
, ctxEnableCpp = True
}
-- | Emits an @using@ directive, e.g.
--
-- @
-- C.using "namespace std" ==> using namespace std
-- @
using :: String -> TH.DecsQ
using s = verbatim $ "using " ++ s ++ ";"
cppTypePairs :: [(CT.CIdentifier, TH.TypeQ)] -> Context
cppTypePairs typePairs = mempty {
ctxTypesTable = Map.fromList $ map (\(cpp_sym, haskell_sym) -> (CT.TypeName cpp_sym, haskell_sym)) typePairs
}