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

module HROOT.Hist.TFormula.Implementation where


import FFICXX.Runtime.Cast

import HROOT.Hist.TFormula.RawType
import HROOT.Hist.TFormula.FFI
import HROOT.Hist.TFormula.Interface
import HROOT.Hist.TFormula.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 ITFormula TFormula where
  compile = xform1 c_tformula_compile
  clear = xform1 c_tformula_clear
  definedValue = xform1 c_tformula_definedvalue
  eval = xform4 c_tformula_eval
  evalParOld = xform2 c_tformula_evalparold
  evalPar = xform2 c_tformula_evalpar
  getNdim = xform0 c_tformula_getndim
  getNpar = xform0 c_tformula_getnpar
  getNumber = xform0 c_tformula_getnumber
  getParNumber = xform1 c_tformula_getparnumber
  isLinear = xform0 c_tformula_islinear
  isNormalized = xform0 c_tformula_isnormalized
  setNumber = xform1 c_tformula_setnumber
  setParameter = xform2 c_tformula_setparameter
  setParameters = xform1 c_tformula_setparameters
  setParName = xform2 c_tformula_setparname
  setParNames = xform11 c_tformula_setparnames
  update = xform0 c_tformula_update
instance ITNamed TFormula where
  setName = xform1 c_tformula_setname
  setNameTitle = xform2 c_tformula_setnametitle
  setTitle = xform1 c_tformula_settitle
instance ITObject TFormula where
  draw = xform1 c_tformula_draw
  findObject = xform1 c_tformula_findobject
  getName = xform0 c_tformula_getname
  isA = xform0 c_tformula_isa
  paint = xform1 c_tformula_paint
  printObj = xform1 c_tformula_printobj
  saveAs = xform2 c_tformula_saveas
  write = xform3 c_tformula_write
instance IDeletable TFormula where
  delete = xform0 c_tformula_delete

instance ITFormula (Exist TFormula) where
  compile (ETFormula x) = compile x
  clear (ETFormula x) = clear x
  definedValue (ETFormula x) = definedValue x
  eval (ETFormula x) = eval x
  evalParOld (ETFormula x) = evalParOld x
  evalPar (ETFormula x) = evalPar x
  getNdim (ETFormula x) = getNdim x
  getNpar (ETFormula x) = getNpar x
  getNumber (ETFormula x) = getNumber x
  getParNumber (ETFormula x) = getParNumber x
  isLinear (ETFormula x) = isLinear x
  isNormalized (ETFormula x) = isNormalized x
  setNumber (ETFormula x) = setNumber x
  setParameter (ETFormula x) = setParameter x
  setParameters (ETFormula x) = setParameters x
  setParName (ETFormula x) = setParName x
  setParNames (ETFormula x) = setParNames x
  update (ETFormula x) = update x
instance ITNamed (Exist TFormula) where
  setName (ETFormula x) = setName x
  setNameTitle (ETFormula x) = setNameTitle x
  setTitle (ETFormula x) = setTitle x
instance ITObject (Exist TFormula) where
  draw (ETFormula x) = draw x
  findObject (ETFormula x) = findObject x
  getName (ETFormula x) = getName x
  isA (ETFormula x) = isA x
  paint (ETFormula x) = paint x
  printObj (ETFormula x) = printObj x
  saveAs (ETFormula x) = saveAs x
  write (ETFormula x) = write x
instance IDeletable (Exist TFormula) where
  delete (ETFormula x) = delete x


newTFormula :: CString -> CString -> IO TFormula
newTFormula = xform1 c_tformula_newtformula

tFormulaOptimize :: TFormula -> IO ()
tFormulaOptimize = xform0 c_tformula_tformulaoptimize

tFormulaGetParameter :: TFormula -> CString -> IO CDouble
tFormulaGetParameter = xform1 c_tformula_tformulagetparameter



instance FPtr (Exist TFormula) where
  type Raw (Exist TFormula) = RawTFormula
  get_fptr (ETFormula obj) = castForeignPtr (get_fptr obj)
  cast_fptr_to_obj fptr = ETFormula (cast_fptr_to_obj (fptr :: ForeignPtr RawTFormula) :: TFormula)