stdcxx-0.7.0.0: src/STD/VectorIterator/TH.hs
{-# LANGUAGE TemplateHaskell #-}
module STD.VectorIterator.TH where
import Data.Char
import Data.List
import Data.Monoid
import Foreign.C.Types
import Foreign.Ptr
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
import FFICXX.Runtime.CodeGen.Cxx
import FFICXX.Runtime.TH
import STD.VectorIterator.Template
t_deRef :: Type -> String -> Q Exp
t_deRef typ1 suffix
= mkTFunc (typ1, suffix, \ n -> "VectorIterator_deRef" <> n, tyf)
where tyf _
= let tp1 = pure typ1 in
[t| VectorIterator $( tp1 ) -> IO $( tp1 ) |]
t_increment :: Type -> String -> Q Exp
t_increment typ1 suffix
= mkTFunc
(typ1, suffix, \ n -> "VectorIterator_increment" <> n, tyf)
where tyf _
= let tp1 = pure typ1 in
[t| VectorIterator $( tp1 ) -> IO (VectorIterator $( tp1 )) |]
genVectorIteratorInstanceFor ::
IsCPrimitive -> (Q Type, TemplateParamInfo) -> Q [Dec]
genVectorIteratorInstanceFor isCprim (qtyp1, param1)
= do let params = map tpinfoSuffix [param1]
let suffix = concatMap (\ x -> "_" ++ tpinfoSuffix x) [param1]
callmod_ <- fmap loc_module location
let callmod = dot2_ callmod_
typ1 <- qtyp1
f1 <- mkMember "deRef" t_deRef typ1 suffix
f2 <- mkMember "increment" t_increment typ1 suffix
addModFinalizer
(addForeignSource LangCxx
("\n#include \"MacroPatternMatch.h\"\n\n\n#include \"vector\"\n\n\n#define VectorIterator_deRef(callmod, tp1) \\\nextern \"C\" {\\\ntp1##_p VectorIterator_deRef_##tp1 ( void* p );}\\\ninline tp1##_p VectorIterator_deRef_##tp1 ( void* p ) {\\\nreturn from_nonconst_to_nonconst<tp1##_t, tp1>((tp1*)&((static_cast<std::vector<tp1>::iterator*>(p))->operator*()));\\\n}\\\nauto a_##callmod##_VectorIterator_deRef_##tp1=VectorIterator_deRef_##tp1;\n\n\n#define VectorIterator_increment(callmod, tp1) \\\nextern \"C\" {\\\nvoid* VectorIterator_increment_##tp1 ( void* p );}\\\ninline void* VectorIterator_increment_##tp1 ( void* p ) {\\\nstd::vector<tp1>::iterator* r=new std::vector<tp1>::iterator((static_cast<std::vector<tp1>::iterator*>(p))->operator++());return static_cast<void*>(r);\\\n}\\\nauto a_##callmod##_VectorIterator_increment_##tp1=VectorIterator_increment_##tp1;\n\n\n#define VectorIterator_deRef_s(callmod, tp1) \\\nextern \"C\" {\\\ntp1 VectorIterator_deRef_##tp1 ( void* p );}\\\ninline tp1 VectorIterator_deRef_##tp1 ( void* p ) {\\\nreturn (static_cast<std::vector<tp1>::iterator*>(p))->operator*();\\\n}\\\nauto a_##callmod##_VectorIterator_deRef_##tp1=VectorIterator_deRef_##tp1;\n\n\n#define VectorIterator_increment_s(callmod, tp1) \\\nextern \"C\" {\\\nvoid* VectorIterator_increment_##tp1 ( void* p );}\\\ninline void* VectorIterator_increment_##tp1 ( void* p ) {\\\nstd::vector<tp1>::iterator* r=new std::vector<tp1>::iterator((static_cast<std::vector<tp1>::iterator*>(p))->operator++());return static_cast<void*>(r);\\\n}\\\nauto a_##callmod##_VectorIterator_increment_##tp1=VectorIterator_increment_##tp1;\n\n\n#define VectorIterator_instance(callmod, tp1) \\\nVectorIterator_deRef(callmod, tp1)\\\nVectorIterator_increment(callmod, tp1)\n\n\n#define VectorIterator_instance_s(callmod, tp1) \\\nVectorIterator_deRef_s(callmod, tp1)\\\nVectorIterator_increment_s(callmod, tp1)\n\n"
++
let headers = concatMap tpinfoCxxHeaders [param1]
f x = renderCMacro (Include x)
in concatMap f headers
++
let nss = concatMap tpinfoCxxNamespaces [param1]
f x = renderCStmt (UsingNamespace x)
in concatMap f nss
++
"VectorIterator_instance" ++
(case isCprim of
CPrim -> "_s"
NonCPrim -> "")
++ "(" ++ intercalate ", " (callmod : params) ++ ")\n"))
let lst = [f1, f2]
pure [mkInstance [] (AppT (con "IVectorIterator") typ1) lst]