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

module HROOT.Core.TROOT.Implementation where


import FFICXX.Runtime.Cast

import HROOT.Core.TROOT.RawType
import HROOT.Core.TROOT.FFI
import HROOT.Core.TROOT.Interface
import HROOT.Core.TROOT.Cast
import HROOT.Core.TKey.RawType
import HROOT.Core.TKey.Cast
import HROOT.Core.TKey.Interface
import HROOT.Core.TClass.RawType
import HROOT.Core.TClass.Cast
import HROOT.Core.TClass.Interface
import HROOT.Core.TGlobal.RawType
import HROOT.Core.TGlobal.Cast
import HROOT.Core.TGlobal.Interface
import HROOT.Core.TDirectory.RawType
import HROOT.Core.TDirectory.Cast
import HROOT.Core.TDirectory.Interface
import HROOT.Core.TNamed.RawType
import HROOT.Core.TNamed.Cast
import HROOT.Core.TNamed.Interface
import HROOT.Core.TObject.RawType
import HROOT.Core.TObject.Cast
import HROOT.Core.TObject.Interface
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 ITROOT TROOT where
instance ITDirectory TROOT where
  append = xform2 c_troot_append
  addD = xform2 c_troot_addd
  appendKey = xform1 c_troot_appendkey
  close = xform1 c_troot_close
  get = xform1 c_troot_get
  cd_TDirectory = xform1 c_troot_cd_tdirectory
instance ITNamed TROOT where
  setName = xform1 c_troot_setname
  setNameTitle = xform2 c_troot_setnametitle
  setTitle = xform1 c_troot_settitle
instance ITObject TROOT where
  draw = xform1 c_troot_draw
  findObject = xform1 c_troot_findobject
  getName = xform0 c_troot_getname
  isA = xform0 c_troot_isa
  paint = xform1 c_troot_paint
  printObj = xform1 c_troot_printobj
  saveAs = xform2 c_troot_saveas
  write = xform3 c_troot_write
instance IDeletable TROOT where
  delete = xform0 c_troot_delete

instance ITROOT (Exist TROOT) where

instance ITDirectory (Exist TROOT) where
  append (ETROOT x) = append x
  addD (ETROOT x) = addD x
  appendKey (ETROOT x) = appendKey x
  close (ETROOT x) = close x
  get (ETROOT x) = get x
  cd_TDirectory (ETROOT x) = cd_TDirectory x
instance ITNamed (Exist TROOT) where
  setName (ETROOT x) = setName x
  setNameTitle (ETROOT x) = setNameTitle x
  setTitle (ETROOT x) = setTitle x
instance ITObject (Exist TROOT) where
  draw (ETROOT x) = draw x
  findObject (ETROOT x) = findObject x
  getName (ETROOT x) = getName x
  isA (ETROOT x) = isA x
  paint (ETROOT x) = paint x
  printObj (ETROOT x) = printObj x
  saveAs (ETROOT x) = saveAs x
  write (ETROOT x) = write x
instance IDeletable (Exist TROOT) where
  delete (ETROOT x) = delete x



tROOTGetGlobal :: TROOT -> CString -> CInt -> IO TGlobal
tROOTGetGlobal = xform2 c_troot_trootgetglobal

tROOTInitialized :: IO CInt
tROOTInitialized = xformnull c_troot_trootinitialized

instance FPtr (Exist TROOT) where
  type Raw (Exist TROOT) = RawTROOT
  get_fptr (ETROOT obj) = castForeignPtr (get_fptr obj)
  cast_fptr_to_obj fptr = ETROOT (cast_fptr_to_obj (fptr :: ForeignPtr RawTROOT) :: TROOT)