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

module HROOT.Core.TDirectory.Implementation where


import FFICXX.Runtime.Cast

import HROOT.Core.TDirectory.RawType
import HROOT.Core.TDirectory.FFI
import HROOT.Core.TDirectory.Interface
import HROOT.Core.TDirectory.Cast
import HROOT.Core.TClass.RawType
import HROOT.Core.TClass.Cast
import HROOT.Core.TClass.Interface
import HROOT.Core.TKey.RawType
import HROOT.Core.TKey.Cast
import HROOT.Core.TKey.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 ITDirectory TDirectory where
  append = xform2 c_tdirectory_append
  addD = xform2 c_tdirectory_addd
  appendKey = xform1 c_tdirectory_appendkey
  close = xform1 c_tdirectory_close
  get = xform1 c_tdirectory_get
  cd_TDirectory = xform1 c_tdirectory_cd_tdirectory
instance ITNamed TDirectory where
  setName = xform1 c_tdirectory_setname
  setNameTitle = xform2 c_tdirectory_setnametitle
  setTitle = xform1 c_tdirectory_settitle
instance ITObject TDirectory where
  draw = xform1 c_tdirectory_draw
  findObject = xform1 c_tdirectory_findobject
  getName = xform0 c_tdirectory_getname
  isA = xform0 c_tdirectory_isa
  paint = xform1 c_tdirectory_paint
  printObj = xform1 c_tdirectory_printobj
  saveAs = xform2 c_tdirectory_saveas
  write = xform3 c_tdirectory_write
instance IDeletable TDirectory where
  delete = xform0 c_tdirectory_delete

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





tDirectoryAddDirectory :: CInt -> IO ()
tDirectoryAddDirectory = xform0 c_tdirectory_tdirectoryadddirectory

tDirectoryAddDirectoryStatus :: IO CInt
tDirectoryAddDirectoryStatus = xformnull c_tdirectory_tdirectoryadddirectorystatus

instance FPtr (Exist TDirectory) where
  type Raw (Exist TDirectory) = RawTDirectory
  get_fptr (ETDirectory obj) = castForeignPtr (get_fptr obj)
  cast_fptr_to_obj fptr = ETDirectory (cast_fptr_to_obj (fptr :: ForeignPtr RawTDirectory) :: TDirectory)