{-# LINE 1 "src/GEGL/FFI/Tuple.hsc" #-}
{-# LANGUAGE RecordWildCards #-}
{-# LINE 2 "src/GEGL/FFI/Tuple.hsc" #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ForeignFunctionInterface #-}
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


{-# LINE 22 "src/GEGL/FFI/Tuple.hsc" #-}

{-# LINE 23 "src/GEGL/FFI/Tuple.hsc" #-}

{-# LINE 24 "src/GEGL/FFI/Tuple.hsc" #-}

{-# LINE 25 "src/GEGL/FFI/Tuple.hsc" #-}

C.include "Tuple.h"

data Producer = Producer
  { prodNode :: Ptr ()
  , prodPad  :: CString
  }

instance Storable Producer where
  sizeOf    (Producer _ _) = ((16))
{-# LINE 35 "src/GEGL/FFI/Tuple.hsc" #-}
  alignment (Producer _ _) = alignment (undefined :: CDouble)
  peek ptr = do
    node <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 38 "src/GEGL/FFI/Tuple.hsc" #-}
    pad  <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 39 "src/GEGL/FFI/Tuple.hsc" #-}
    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))
{-# LINE 51 "src/GEGL/FFI/Tuple.hsc" #-}
  alignment (NodeWithPad _ _ _) = alignment (undefined :: CDouble)
  peek ptr = do
    length <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 54 "src/GEGL/FFI/Tuple.hsc" #-}
    tdata  <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 55 "src/GEGL/FFI/Tuple.hsc" #-}
    names  <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) ptr
{-# LINE 56 "src/GEGL/FFI/Tuple.hsc" #-}
    return $ NodeWithPad length tdata names
  poke ptr (NodeWithPad{..}) = do
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr nwpLength
{-# LINE 59 "src/GEGL/FFI/Tuple.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 8))   ptr nwpData
{-# LINE 60 "src/GEGL/FFI/Tuple.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 16))  ptr nwpNames
{-# LINE 61 "src/GEGL/FFI/Tuple.hsc" #-}

data TupleFloat =
  TupleFloat
    { tupleFloatLength :: CInt
    , tupleFloatData   :: Ptr CFloat
    }

instance Storable TupleFloat where
  sizeOf    (TupleFloat _ _) = ((16))
{-# LINE 70 "src/GEGL/FFI/Tuple.hsc" #-}
  alignment (TupleFloat _ _) = alignment (undefined :: CDouble)
  peek ptr = do
    length <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 73 "src/GEGL/FFI/Tuple.hsc" #-}
    tdata  <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 74 "src/GEGL/FFI/Tuple.hsc" #-}
    return $ TupleFloat length tdata
  poke ptr (TupleFloat{..}) = do
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr tupleFloatLength
{-# LINE 77 "src/GEGL/FFI/Tuple.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 8))   ptr tupleFloatData
{-# LINE 78 "src/GEGL/FFI/Tuple.hsc" #-}

data TupleDouble =
  TupleDouble
    { tupleDoubleLength :: CInt
    , tupleDoubleData   :: Ptr CDouble
    }

instance Storable TupleDouble where
  sizeOf    (TupleDouble _ _) = ((16))
{-# LINE 87 "src/GEGL/FFI/Tuple.hsc" #-}
  alignment (TupleDouble _ _) = alignment (undefined :: CDouble)
  peek ptr = do
    length <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 90 "src/GEGL/FFI/Tuple.hsc" #-}
    tdata  <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 91 "src/GEGL/FFI/Tuple.hsc" #-}
    return $ TupleDouble length tdata
  poke ptr (TupleDouble{..}) = do
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr tupleDoubleLength
{-# LINE 94 "src/GEGL/FFI/Tuple.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 8))   ptr tupleDoubleData
{-# LINE 95 "src/GEGL/FFI/Tuple.hsc" #-}

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|])
  ]