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

module HROOT.Core.TSystem.Implementation where


import FFICXX.Runtime.Cast

import HROOT.Core.TSystem.RawType
import HROOT.Core.TSystem.FFI
import HROOT.Core.TSystem.Interface
import HROOT.Core.TSystem.Cast
import HROOT.Core.TClass.RawType
import HROOT.Core.TClass.Cast
import HROOT.Core.TClass.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 ITSystem TSystem where
  processEvents = xform0 c_tsystem_processevents
instance ITNamed TSystem where
  setName = xform1 c_tsystem_setname
  setNameTitle = xform2 c_tsystem_setnametitle
  setTitle = xform1 c_tsystem_settitle
instance ITObject TSystem where
  draw = xform1 c_tsystem_draw
  findObject = xform1 c_tsystem_findobject
  getName = xform0 c_tsystem_getname
  isA = xform0 c_tsystem_isa
  paint = xform1 c_tsystem_paint
  printObj = xform1 c_tsystem_printobj
  saveAs = xform2 c_tsystem_saveas
  write = xform3 c_tsystem_write
instance IDeletable TSystem where
  delete = xform0 c_tsystem_delete

instance ITSystem (Exist TSystem) where
  processEvents (ETSystem x) = processEvents x
instance ITNamed (Exist TSystem) where
  setName (ETSystem x) = setName x
  setNameTitle (ETSystem x) = setNameTitle x
  setTitle (ETSystem x) = setTitle x
instance ITObject (Exist TSystem) where
  draw (ETSystem x) = draw x
  findObject (ETSystem x) = findObject x
  getName (ETSystem x) = getName x
  isA (ETSystem x) = isA x
  paint (ETSystem x) = paint x
  printObj (ETSystem x) = printObj x
  saveAs (ETSystem x) = saveAs x
  write (ETSystem x) = write x
instance IDeletable (Exist TSystem) where
  delete (ETSystem x) = delete x







instance FPtr (Exist TSystem) where
  type Raw (Exist TSystem) = RawTSystem
  get_fptr (ETSystem obj) = castForeignPtr (get_fptr obj)
  cast_fptr_to_obj fptr = ETSystem (cast_fptr_to_obj (fptr :: ForeignPtr RawTSystem) :: TSystem)