module GEGL.FFI.Tuple where
import qualified Language.C.Inline as C
import qualified Language.C.Types as C
import qualified Language.C.Inline.Context as C
import qualified Data.Map as Map
import Foreign
import Foreign.C.Types
import Foreign.C.String
import Foreign.Ptr
import GHC.Ptr as G
import qualified Language.Haskell.TH as TH
C.include "Tuple.h"
data Producer = Producer
{ prodNode :: Ptr ()
, prodPad :: CString
}
instance Storable Producer where
sizeOf (Producer _ _) = ((16))
alignment (Producer _ _) = alignment (undefined :: CDouble)
peek ptr = do
node <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
pad <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
return $ Producer node pad
poke _ = error "poke undefined for Produer"
data NodeWithPad =
NodeWithPad
{ nwpLength :: CInt
, nwpData :: Ptr (Ptr ())
, nwpNames :: Ptr CString
}
instance Storable NodeWithPad where
sizeOf (NodeWithPad _ _ _) = ((16))
alignment (NodeWithPad _ _ _) = alignment (undefined :: CDouble)
peek ptr = do
length <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
tdata <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
names <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) ptr
return $ NodeWithPad length tdata names
poke ptr (NodeWithPad{..}) = do
((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr nwpLength
((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr nwpData
((\hsc_ptr -> pokeByteOff hsc_ptr 16)) ptr nwpNames
data TupleFloat =
TupleFloat
{ tupleFloatLength :: CInt
, tupleFloatData :: Ptr CFloat
}
instance Storable TupleFloat where
sizeOf (TupleFloat _ _) = ((16))
alignment (TupleFloat _ _) = alignment (undefined :: CDouble)
peek ptr = do
length <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
tdata <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
return $ TupleFloat length tdata
poke ptr (TupleFloat{..}) = do
((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr tupleFloatLength
((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr tupleFloatData
data TupleDouble =
TupleDouble
{ tupleDoubleLength :: CInt
, tupleDoubleData :: Ptr CDouble
}
instance Storable TupleDouble where
sizeOf (TupleDouble _ _) = ((16))
alignment (TupleDouble _ _) = alignment (undefined :: CDouble)
peek ptr = do
length <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
tdata <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
return $ TupleDouble length tdata
poke ptr (TupleDouble{..}) = do
((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr tupleDoubleLength
((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr tupleDoubleData
tupleCtx :: C.Context
tupleCtx = mempty
{ C.ctxTypesTable = tupleTypes
}
tupleTypes :: Map.Map C.TypeSpecifier TH.TypeQ
tupleTypes = Map.fromList
[ (C.TypeName "tupleFloat", [t|TupleFloat|])
, (C.TypeName "tupleDouble", [t|TupleDouble|])
, (C.TypeName "nodeWithPad", [t|NodeWithPad|])
, (C.TypeName "producer", [t|Producer|])
]