{-# LANGUAGE ForeignFunctionInterface, TypeFamilies, MultiParamTypeClasses, 
             FlexibleInstances, TypeSynonymInstances, EmptyDataDecls, 
             OverlappingInstances, IncoherentInstances #-}

module HROOT.Core.TAttLine.Implementation where


import FFICXX.Runtime.Cast

import HROOT.Core.TAttLine.RawType
import HROOT.Core.TAttLine.FFI
import HROOT.Core.TAttLine.Interface
import HROOT.Core.TAttLine.Cast

import HROOT.Core.Deletable.RawType
import HROOT.Core.Deletable.Cast
import HROOT.Core.Deletable.Interface

import Data.Word
import Foreign.C
import Foreign.Ptr 
import Foreign.ForeignPtr

import System.IO.Unsafe


instance ITAttLine TAttLine where
  getLineColor = xform0 c_tattline_getlinecolor
  getLineStyle = xform0 c_tattline_getlinestyle
  getLineWidth = xform0 c_tattline_getlinewidth
  resetAttLine = xform1 c_tattline_resetattline
  setLineAttributes = xform0 c_tattline_setlineattributes
  setLineColor = xform1 c_tattline_setlinecolor
  setLineStyle = xform1 c_tattline_setlinestyle
  setLineWidth = xform1 c_tattline_setlinewidth
instance IDeletable TAttLine where
  delete = xform0 c_tattline_delete

instance ITAttLine (Exist TAttLine) where
  getLineColor (ETAttLine x) = getLineColor x
  getLineStyle (ETAttLine x) = getLineStyle x
  getLineWidth (ETAttLine x) = getLineWidth x
  resetAttLine (ETAttLine x) = resetAttLine x
  setLineAttributes (ETAttLine x) = setLineAttributes x
  setLineColor (ETAttLine x) = setLineColor x
  setLineStyle (ETAttLine x) = setLineStyle x
  setLineWidth (ETAttLine x) = setLineWidth x
instance IDeletable (Exist TAttLine) where
  delete (ETAttLine x) = delete x


newTAttLine :: CInt -> CInt -> CInt -> IO TAttLine
newTAttLine = xform2 c_tattline_newtattline

tAttLineDistancetoLine :: TAttLine -> CInt -> CInt -> CDouble -> CDouble -> CDouble -> CDouble -> IO CInt
tAttLineDistancetoLine = xform6 c_tattline_tattlinedistancetoline



instance FPtr (Exist TAttLine) where
  type Raw (Exist TAttLine) = RawTAttLine
  get_fptr (ETAttLine obj) = castForeignPtr (get_fptr obj)
  cast_fptr_to_obj fptr = ETAttLine (cast_fptr_to_obj (fptr :: ForeignPtr RawTAttLine) :: TAttLine)