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

module HROOT.Class.TNtuple.Implementation where


import HROOT.TypeCast

import HROOT.Class.TNtuple.RawType
import HROOT.Class.TNtuple.FFI
import HROOT.Class.TNtuple.Interface
import HROOT.Class.TNtuple.Cast
import HROOT.Class.TClass.RawType
import HROOT.Class.TClass.Cast
import HROOT.Class.TClass.Interface
import HROOT.Class.TTree.RawType
import HROOT.Class.TTree.Cast
import HROOT.Class.TTree.Interface
import HROOT.Class.TNamed.RawType
import HROOT.Class.TNamed.Cast
import HROOT.Class.TNamed.Interface
import HROOT.Class.TAttLine.RawType
import HROOT.Class.TAttLine.Cast
import HROOT.Class.TAttLine.Interface
import HROOT.Class.TAttFill.RawType
import HROOT.Class.TAttFill.Cast
import HROOT.Class.TAttFill.Interface
import HROOT.Class.TAttMarker.RawType
import HROOT.Class.TAttMarker.Cast
import HROOT.Class.TAttMarker.Interface
import HROOT.Class.TObject.RawType
import HROOT.Class.TObject.Cast
import HROOT.Class.TObject.Interface
import HROOT.Class.Deletable.RawType
import HROOT.Class.Deletable.Cast
import HROOT.Class.Deletable.Interface

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

import System.IO.Unsafe


instance ITNtuple TNtuple where
instance ITTree TNtuple where
instance ITNamed TNtuple where
  setName = xform1 c_tntuple_setname
  setNameTitle = xform2 c_tntuple_setnametitle
  setTitle = xform1 c_tntuple_settitle
instance ITAttLine TNtuple where
  getLineColor = xform0 c_tntuple_getlinecolor
  getLineStyle = xform0 c_tntuple_getlinestyle
  getLineWidth = xform0 c_tntuple_getlinewidth
  resetAttLine = xform1 c_tntuple_resetattline
  setLineAttributes = xform0 c_tntuple_setlineattributes
  setLineColor = xform1 c_tntuple_setlinecolor
  setLineStyle = xform1 c_tntuple_setlinestyle
  setLineWidth = xform1 c_tntuple_setlinewidth
instance ITAttFill TNtuple where
  setFillColor = xform1 c_tntuple_setfillcolor
  setFillStyle = xform1 c_tntuple_setfillstyle
instance ITAttMarker TNtuple where
  getMarkerColor = xform0 c_tntuple_getmarkercolor
  getMarkerStyle = xform0 c_tntuple_getmarkerstyle
  getMarkerSize = xform0 c_tntuple_getmarkersize
  resetAttMarker = xform1 c_tntuple_resetattmarker
  setMarkerAttributes = xform0 c_tntuple_setmarkerattributes
  setMarkerColor = xform1 c_tntuple_setmarkercolor
  setMarkerStyle = xform1 c_tntuple_setmarkerstyle
  setMarkerSize = xform1 c_tntuple_setmarkersize
instance ITObject TNtuple where
  draw = xform1 c_tntuple_draw
  findObject = xform1 c_tntuple_findobject
  getName = xform0 c_tntuple_getname
  isA = xform0 c_tntuple_isa
  isFolder = xform0 c_tntuple_isfolder
  isEqual = xform1 c_tntuple_isequal
  isSortable = xform0 c_tntuple_issortable
  paint = xform1 c_tntuple_paint
  printObj = xform1 c_tntuple_printobj
  recursiveRemove = xform1 c_tntuple_recursiveremove
  saveAs = xform2 c_tntuple_saveas
  useCurrentStyle = xform0 c_tntuple_usecurrentstyle
  write = xform3 c_tntuple_write
instance IDeletable TNtuple where
  delete = xform0 c_tntuple_delete

instance ITNtuple (Exist TNtuple) where

instance ITTree (Exist TNtuple) where

instance ITNamed (Exist TNtuple) where
  setName (ETNtuple x) = setName x
  setNameTitle (ETNtuple x) = setNameTitle x
  setTitle (ETNtuple x) = setTitle x
instance ITAttLine (Exist TNtuple) where
  getLineColor (ETNtuple x) = getLineColor x
  getLineStyle (ETNtuple x) = getLineStyle x
  getLineWidth (ETNtuple x) = getLineWidth x
  resetAttLine (ETNtuple x) = resetAttLine x
  setLineAttributes (ETNtuple x) = setLineAttributes x
  setLineColor (ETNtuple x) = setLineColor x
  setLineStyle (ETNtuple x) = setLineStyle x
  setLineWidth (ETNtuple x) = setLineWidth x
instance ITAttFill (Exist TNtuple) where
  setFillColor (ETNtuple x) = setFillColor x
  setFillStyle (ETNtuple x) = setFillStyle x
instance ITAttMarker (Exist TNtuple) where
  getMarkerColor (ETNtuple x) = getMarkerColor x
  getMarkerStyle (ETNtuple x) = getMarkerStyle x
  getMarkerSize (ETNtuple x) = getMarkerSize x
  resetAttMarker (ETNtuple x) = resetAttMarker x
  setMarkerAttributes (ETNtuple x) = setMarkerAttributes x
  setMarkerColor (ETNtuple x) = setMarkerColor x
  setMarkerStyle (ETNtuple x) = setMarkerStyle x
  setMarkerSize (ETNtuple x) = setMarkerSize x
instance ITObject (Exist TNtuple) where
  draw (ETNtuple x) = draw x
  findObject (ETNtuple x) = findObject x
  getName (ETNtuple x) = getName x
  isA (ETNtuple x) = isA x
  isFolder (ETNtuple x) = isFolder x
  isEqual (ETNtuple x) = isEqual x
  isSortable (ETNtuple x) = isSortable x
  paint (ETNtuple x) = paint x
  printObj (ETNtuple x) = printObj x
  recursiveRemove (ETNtuple x) = recursiveRemove x
  saveAs (ETNtuple x) = saveAs x
  useCurrentStyle (ETNtuple x) = useCurrentStyle x
  write (ETNtuple x) = write x
instance IDeletable (Exist TNtuple) where
  delete (ETNtuple x) = delete x


newTNtuple :: String -> String -> String -> Int -> IO TNtuple
newTNtuple = xform3 c_tntuple_newtntuple





instance FPtr (Exist TNtuple) where
  type Raw (Exist TNtuple) = RawTNtuple
  get_fptr (ETNtuple obj) = castForeignPtr (get_fptr obj)
  cast_fptr_to_obj fptr = ETNtuple (cast_fptr_to_obj (fptr :: ForeignPtr RawTNtuple) :: TNtuple)