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

module HROOT.Type where

import Foreign.C            
import Foreign.Ptr
import Foreign.ForeignPtr
import Foreign.Marshal.Array


import System.IO.Unsafe

class Castable a b where
  cast :: a -> b 
  uncast :: b -> a 

instance Castable a a where
  cast = id
  uncast = id

instance Castable Int CInt where
  cast = fromIntegral 
  uncast = fromIntegral
  
instance Castable Double CDouble where
  cast = realToFrac
  uncast = realToFrac 

instance Castable [Double] (Ptr CDouble) where
  cast xs = unsafePerformIO (newArray (map realToFrac xs))
  uncast _c_xs = undefined 

instance Castable [Int] (Ptr CInt) where
  cast xs = unsafePerformIO (newArray (map fromIntegral xs))
  uncast _c_xs = undefined 

instance Castable String CString where
  cast x = unsafePerformIO (newCString x)
  uncast x = unsafePerformIO (peekCString x) 

instance Castable [String] (Ptr CString) where
  cast xs = unsafePerformIO (mapM  newCString xs >>= newArray)
  uncast _c_xs = undefined


instance (FPtr a, Ptr (Raw a) ~ ptrrawa) => Castable a ptrrawa where
  cast = unsafeForeignPtrToPtr.get_fptr
  uncast x = cast_fptr_to_obj (unsafePerformIO (newForeignPtr_ x)) 

instance (Castable a a', Castable b b') => Castable (a->b) (a'->b') where
  cast f = cast . f . uncast
  uncast f = uncast . f . cast 


xformnull :: (Castable a ca) => (IO ca) -> IO a
xformnull f = f >>= return . uncast

xform0 :: (Castable a ca, Castable y cy) 
       => (ca -> IO cy) -> a -> IO y
xform0 f a = f (cast a) >>= return . uncast 

xform1 :: (Castable a ca, Castable x1 cx1, Castable y cy) 
       => (ca -> cx1 -> IO cy) -> a -> x1 -> IO y
xform1 f a x1 = f (cast a) (cast x1) >>= return . uncast 

xform2 :: (Castable a ca, Castable x1 cx1, Castable x2 cx2, Castable y cy) 
       => (ca -> cx1 -> cx2 -> IO cy) -> a -> x1 -> x2-> IO y
xform2 f a x1 x2 = f (cast a) (cast x1) (cast x2) >>= return . uncast 

xform3 :: (Castable a ca, Castable x1 cx1, Castable x2 cx2, Castable x3 cx3, Castable y cy) 
       => (ca -> cx1 -> cx2 -> cx3 -> IO cy) -> a -> x1 -> x2 -> x3 -> IO y
xform3 f a x1 x2 x3 = f (cast a) (cast x1) (cast x2) (cast x3) >>= return . uncast 

xform4 :: (Castable a ca, Castable x1 cx1, Castable x2 cx2, Castable x3 cx3, Castable x4 cx4, Castable y cy) 
       => (ca -> cx1 -> cx2 -> cx3 -> cx4 -> IO cy) -> a -> x1 -> x2 -> x3 -> x4 -> IO y
xform4 f a x1 x2 x3 x4 = f (cast a) (cast x1) (cast x2) (cast x3) (cast x4) >>= return . uncast 

xform5 :: (Castable a ca, Castable x1 cx1, Castable x2 cx2, Castable x3 cx3, Castable x4 cx4,
           Castable x5 cx5, Castable y cy) 
       => (ca -> cx1 -> cx2 -> cx3 -> cx4 -> cx5 -> IO cy) -> a -> x1 -> x2 -> x3 -> x4 -> x5 -> IO y
xform5 f a x1 x2 x3 x4 x5 = f (cast a) (cast x1) (cast x2) (cast x3) (cast x4) (cast x5) >>= return . uncast 

xform6 :: (Castable a ca, Castable x1 cx1, Castable x2 cx2, Castable x3 cx3, Castable x4 cx4,
           Castable x5 cx5, Castable x6 cx6, Castable y cy) 
       => (ca -> cx1 -> cx2 -> cx3 -> cx4 -> cx5 -> cx6 -> IO cy) 
          -> a -> x1 -> x2 -> x3 -> x4 -> x5 -> x6 -> IO y
xform6 f a x1 x2 x3 x4 x5 x6 = 
  f (cast a) (cast x1) (cast x2) (cast x3) (cast x4) (cast x5) (cast x6) 
  >>= return . uncast 

xform7 :: (Castable a ca, Castable x1 cx1, Castable x2 cx2, Castable x3 cx3, Castable x4 cx4,
           Castable x5 cx5, Castable x6 cx6, Castable x7 cx7, Castable y cy) 
       => (ca -> cx1 -> cx2 -> cx3 -> cx4 -> cx5 -> cx6 -> cx7 -> IO cy) 
          -> a -> x1 -> x2 -> x3 -> x4 -> x5 -> x6 -> x7 -> IO y
xform7 f a x1 x2 x3 x4 x5 x6 x7 = 
  f (cast a) (cast x1) (cast x2) (cast x3) (cast x4) (cast x5) (cast x6) (cast x7)
  >>= return . uncast 

xform8 :: (Castable a ca, Castable x1 cx1, Castable x2 cx2, Castable x3 cx3, Castable x4 cx4,
           Castable x5 cx5, Castable x6 cx6, Castable x7 cx7, Castable x8 cx8, Castable y cy) 
       => (ca -> cx1 -> cx2 -> cx3 -> cx4 -> cx5 -> cx6 -> cx7 -> cx8 -> IO cy) 
          -> a -> x1 -> x2 -> x3 -> x4 -> x5 -> x6 -> x7 -> x8 -> IO y
xform8 f a x1 x2 x3 x4 x5 x6 x7 x8 = 
  f (cast a) (cast x1) (cast x2) (cast x3) (cast x4) (cast x5) (cast x6) (cast x7) (cast x8)
  >>= return . uncast 

xform9 :: (Castable a ca, Castable x1 cx1, Castable x2 cx2, Castable x3 cx3, Castable x4 cx4,
           Castable x5 cx5, Castable x6 cx6, Castable x7 cx7, Castable x8 cx8, Castable x9 cx9, 
           Castable y cy) 
       => (ca -> cx1 -> cx2 -> cx3 -> cx4 -> cx5 -> cx6 -> cx7 -> cx8 -> cx9 -> IO cy) 
          -> a -> x1 -> x2 -> x3 -> x4 -> x5 -> x6 -> x7 -> x8 -> x9 -> IO y
xform9 f a x1 x2 x3 x4 x5 x6 x7 x8 x9 = 
  f (cast a) (cast x1) (cast x2) (cast x3) (cast x4) (cast x5) (cast x6) (cast x7) (cast x8) (cast x9)
  >>= return . uncast 

xform10 :: (Castable a ca, Castable x1 cx1, Castable x2 cx2, Castable x3 cx3, Castable x4 cx4,
            Castable x5 cx5, Castable x6 cx6, Castable x7 cx7, Castable x8 cx8, Castable x9 cx9,  
            Castable x10 cx10, Castable y cy) 
       => (ca -> cx1 -> cx2 -> cx3 -> cx4 -> cx5 -> cx6 -> cx7 -> cx8 -> cx9 -> cx10 -> IO cy) 
          -> a -> x1 -> x2 -> x3 -> x4 -> x5 -> x6 -> x7 -> x8 -> x9 -> x10 -> IO y
xform10 f a x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 = 
  f (cast a) (cast x1) (cast x2) (cast x3) (cast x4) (cast x5) (cast x6) (cast x7) (cast x8) (cast x9) (cast x10) >>= return . uncast 



class FPtr a where
    type Raw a :: *
    get_fptr :: a -> ForeignPtr (Raw a) 
    cast_fptr_to_obj :: ForeignPtr (Raw a) -> a

data RawTObject
newtype TObject = TObject (ForeignPtr RawTObject) deriving (Eq, Ord, Show)
instance FPtr TObject where
   type Raw TObject = RawTObject
   get_fptr (TObject fptr) = fptr
   cast_fptr_to_obj = TObject

data RawTNamed
newtype TNamed = TNamed (ForeignPtr RawTNamed) deriving (Eq, Ord, Show)
instance FPtr TNamed where
   type Raw TNamed = RawTNamed
   get_fptr (TNamed fptr) = fptr
   cast_fptr_to_obj = TNamed

data RawTFormula
newtype TFormula = TFormula (ForeignPtr RawTFormula) deriving (Eq, Ord, Show)
instance FPtr TFormula where
   type Raw TFormula = RawTFormula
   get_fptr (TFormula fptr) = fptr
   cast_fptr_to_obj = TFormula

data RawTAtt3D
newtype TAtt3D = TAtt3D (ForeignPtr RawTAtt3D) deriving (Eq, Ord, Show)
instance FPtr TAtt3D where
   type Raw TAtt3D = RawTAtt3D
   get_fptr (TAtt3D fptr) = fptr
   cast_fptr_to_obj = TAtt3D

data RawTAttAxis
newtype TAttAxis = TAttAxis (ForeignPtr RawTAttAxis) deriving (Eq, Ord, Show)
instance FPtr TAttAxis where
   type Raw TAttAxis = RawTAttAxis
   get_fptr (TAttAxis fptr) = fptr
   cast_fptr_to_obj = TAttAxis

data RawTAttBBox
newtype TAttBBox = TAttBBox (ForeignPtr RawTAttBBox) deriving (Eq, Ord, Show)
instance FPtr TAttBBox where
   type Raw TAttBBox = RawTAttBBox
   get_fptr (TAttBBox fptr) = fptr
   cast_fptr_to_obj = TAttBBox

data RawTAttCanvas
newtype TAttCanvas = TAttCanvas (ForeignPtr RawTAttCanvas) deriving (Eq, Ord, Show)
instance FPtr TAttCanvas where
   type Raw TAttCanvas = RawTAttCanvas
   get_fptr (TAttCanvas fptr) = fptr
   cast_fptr_to_obj = TAttCanvas

data RawTAttFill
newtype TAttFill = TAttFill (ForeignPtr RawTAttFill) deriving (Eq, Ord, Show)
instance FPtr TAttFill where
   type Raw TAttFill = RawTAttFill
   get_fptr (TAttFill fptr) = fptr
   cast_fptr_to_obj = TAttFill

data RawTAttImage
newtype TAttImage = TAttImage (ForeignPtr RawTAttImage) deriving (Eq, Ord, Show)
instance FPtr TAttImage where
   type Raw TAttImage = RawTAttImage
   get_fptr (TAttImage fptr) = fptr
   cast_fptr_to_obj = TAttImage

data RawTAttLine
newtype TAttLine = TAttLine (ForeignPtr RawTAttLine) deriving (Eq, Ord, Show)
instance FPtr TAttLine where
   type Raw TAttLine = RawTAttLine
   get_fptr (TAttLine fptr) = fptr
   cast_fptr_to_obj = TAttLine

data RawTAttMarker
newtype TAttMarker = TAttMarker (ForeignPtr RawTAttMarker) deriving (Eq, Ord, Show)
instance FPtr TAttMarker where
   type Raw TAttMarker = RawTAttMarker
   get_fptr (TAttMarker fptr) = fptr
   cast_fptr_to_obj = TAttMarker

data RawTAttPad
newtype TAttPad = TAttPad (ForeignPtr RawTAttPad) deriving (Eq, Ord, Show)
instance FPtr TAttPad where
   type Raw TAttPad = RawTAttPad
   get_fptr (TAttPad fptr) = fptr
   cast_fptr_to_obj = TAttPad

data RawTAttParticle
newtype TAttParticle = TAttParticle (ForeignPtr RawTAttParticle) deriving (Eq, Ord, Show)
instance FPtr TAttParticle where
   type Raw TAttParticle = RawTAttParticle
   get_fptr (TAttParticle fptr) = fptr
   cast_fptr_to_obj = TAttParticle

data RawTAttText
newtype TAttText = TAttText (ForeignPtr RawTAttText) deriving (Eq, Ord, Show)
instance FPtr TAttText where
   type Raw TAttText = RawTAttText
   get_fptr (TAttText fptr) = fptr
   cast_fptr_to_obj = TAttText

data RawTHStack
newtype THStack = THStack (ForeignPtr RawTHStack) deriving (Eq, Ord, Show)
instance FPtr THStack where
   type Raw THStack = RawTHStack
   get_fptr (THStack fptr) = fptr
   cast_fptr_to_obj = THStack

data RawTF1
newtype TF1 = TF1 (ForeignPtr RawTF1) deriving (Eq, Ord, Show)
instance FPtr TF1 where
   type Raw TF1 = RawTF1
   get_fptr (TF1 fptr) = fptr
   cast_fptr_to_obj = TF1

data RawTGraph
newtype TGraph = TGraph (ForeignPtr RawTGraph) deriving (Eq, Ord, Show)
instance FPtr TGraph where
   type Raw TGraph = RawTGraph
   get_fptr (TGraph fptr) = fptr
   cast_fptr_to_obj = TGraph

data RawTGraphAsymmErrors
newtype TGraphAsymmErrors = TGraphAsymmErrors (ForeignPtr RawTGraphAsymmErrors) deriving (Eq, Ord, Show)
instance FPtr TGraphAsymmErrors where
   type Raw TGraphAsymmErrors = RawTGraphAsymmErrors
   get_fptr (TGraphAsymmErrors fptr) = fptr
   cast_fptr_to_obj = TGraphAsymmErrors

data RawTCutG
newtype TCutG = TCutG (ForeignPtr RawTCutG) deriving (Eq, Ord, Show)
instance FPtr TCutG where
   type Raw TCutG = RawTCutG
   get_fptr (TCutG fptr) = fptr
   cast_fptr_to_obj = TCutG

data RawTGraphBentErrors
newtype TGraphBentErrors = TGraphBentErrors (ForeignPtr RawTGraphBentErrors) deriving (Eq, Ord, Show)
instance FPtr TGraphBentErrors where
   type Raw TGraphBentErrors = RawTGraphBentErrors
   get_fptr (TGraphBentErrors fptr) = fptr
   cast_fptr_to_obj = TGraphBentErrors

data RawTGraphErrors
newtype TGraphErrors = TGraphErrors (ForeignPtr RawTGraphErrors) deriving (Eq, Ord, Show)
instance FPtr TGraphErrors where
   type Raw TGraphErrors = RawTGraphErrors
   get_fptr (TGraphErrors fptr) = fptr
   cast_fptr_to_obj = TGraphErrors

data RawTGraphPolar
newtype TGraphPolar = TGraphPolar (ForeignPtr RawTGraphPolar) deriving (Eq, Ord, Show)
instance FPtr TGraphPolar where
   type Raw TGraphPolar = RawTGraphPolar
   get_fptr (TGraphPolar fptr) = fptr
   cast_fptr_to_obj = TGraphPolar

data RawTGraphQQ
newtype TGraphQQ = TGraphQQ (ForeignPtr RawTGraphQQ) deriving (Eq, Ord, Show)
instance FPtr TGraphQQ where
   type Raw TGraphQQ = RawTGraphQQ
   get_fptr (TGraphQQ fptr) = fptr
   cast_fptr_to_obj = TGraphQQ

data RawTEllipse
newtype TEllipse = TEllipse (ForeignPtr RawTEllipse) deriving (Eq, Ord, Show)
instance FPtr TEllipse where
   type Raw TEllipse = RawTEllipse
   get_fptr (TEllipse fptr) = fptr
   cast_fptr_to_obj = TEllipse

data RawTArc
newtype TArc = TArc (ForeignPtr RawTArc) deriving (Eq, Ord, Show)
instance FPtr TArc where
   type Raw TArc = RawTArc
   get_fptr (TArc fptr) = fptr
   cast_fptr_to_obj = TArc

data RawTCrown
newtype TCrown = TCrown (ForeignPtr RawTCrown) deriving (Eq, Ord, Show)
instance FPtr TCrown where
   type Raw TCrown = RawTCrown
   get_fptr (TCrown fptr) = fptr
   cast_fptr_to_obj = TCrown

data RawTLine
newtype TLine = TLine (ForeignPtr RawTLine) deriving (Eq, Ord, Show)
instance FPtr TLine where
   type Raw TLine = RawTLine
   get_fptr (TLine fptr) = fptr
   cast_fptr_to_obj = TLine

data RawTArrow
newtype TArrow = TArrow (ForeignPtr RawTArrow) deriving (Eq, Ord, Show)
instance FPtr TArrow where
   type Raw TArrow = RawTArrow
   get_fptr (TArrow fptr) = fptr
   cast_fptr_to_obj = TArrow

data RawTGaxis
newtype TGaxis = TGaxis (ForeignPtr RawTGaxis) deriving (Eq, Ord, Show)
instance FPtr TGaxis where
   type Raw TGaxis = RawTGaxis
   get_fptr (TGaxis fptr) = fptr
   cast_fptr_to_obj = TGaxis

data RawTShape
newtype TShape = TShape (ForeignPtr RawTShape) deriving (Eq, Ord, Show)
instance FPtr TShape where
   type Raw TShape = RawTShape
   get_fptr (TShape fptr) = fptr
   cast_fptr_to_obj = TShape

data RawTBRIK
newtype TBRIK = TBRIK (ForeignPtr RawTBRIK) deriving (Eq, Ord, Show)
instance FPtr TBRIK where
   type Raw TBRIK = RawTBRIK
   get_fptr (TBRIK fptr) = fptr
   cast_fptr_to_obj = TBRIK

data RawTTUBE
newtype TTUBE = TTUBE (ForeignPtr RawTTUBE) deriving (Eq, Ord, Show)
instance FPtr TTUBE where
   type Raw TTUBE = RawTTUBE
   get_fptr (TTUBE fptr) = fptr
   cast_fptr_to_obj = TTUBE

data RawTPCON
newtype TPCON = TPCON (ForeignPtr RawTPCON) deriving (Eq, Ord, Show)
instance FPtr TPCON where
   type Raw TPCON = RawTPCON
   get_fptr (TPCON fptr) = fptr
   cast_fptr_to_obj = TPCON

data RawTSPHE
newtype TSPHE = TSPHE (ForeignPtr RawTSPHE) deriving (Eq, Ord, Show)
instance FPtr TSPHE where
   type Raw TSPHE = RawTSPHE
   get_fptr (TSPHE fptr) = fptr
   cast_fptr_to_obj = TSPHE

data RawTXTRU
newtype TXTRU = TXTRU (ForeignPtr RawTXTRU) deriving (Eq, Ord, Show)
instance FPtr TXTRU where
   type Raw TXTRU = RawTXTRU
   get_fptr (TXTRU fptr) = fptr
   cast_fptr_to_obj = TXTRU

data RawTBox
newtype TBox = TBox (ForeignPtr RawTBox) deriving (Eq, Ord, Show)
instance FPtr TBox where
   type Raw TBox = RawTBox
   get_fptr (TBox fptr) = fptr
   cast_fptr_to_obj = TBox

data RawTPave
newtype TPave = TPave (ForeignPtr RawTPave) deriving (Eq, Ord, Show)
instance FPtr TPave where
   type Raw TPave = RawTPave
   get_fptr (TPave fptr) = fptr
   cast_fptr_to_obj = TPave

data RawTPaveText
newtype TPaveText = TPaveText (ForeignPtr RawTPaveText) deriving (Eq, Ord, Show)
instance FPtr TPaveText where
   type Raw TPaveText = RawTPaveText
   get_fptr (TPaveText fptr) = fptr
   cast_fptr_to_obj = TPaveText

data RawTDiamond
newtype TDiamond = TDiamond (ForeignPtr RawTDiamond) deriving (Eq, Ord, Show)
instance FPtr TDiamond where
   type Raw TDiamond = RawTDiamond
   get_fptr (TDiamond fptr) = fptr
   cast_fptr_to_obj = TDiamond

data RawTPaveStats
newtype TPaveStats = TPaveStats (ForeignPtr RawTPaveStats) deriving (Eq, Ord, Show)
instance FPtr TPaveStats where
   type Raw TPaveStats = RawTPaveStats
   get_fptr (TPaveStats fptr) = fptr
   cast_fptr_to_obj = TPaveStats

data RawTPavesText
newtype TPavesText = TPavesText (ForeignPtr RawTPavesText) deriving (Eq, Ord, Show)
instance FPtr TPavesText where
   type Raw TPavesText = RawTPavesText
   get_fptr (TPavesText fptr) = fptr
   cast_fptr_to_obj = TPavesText

data RawTLegend
newtype TLegend = TLegend (ForeignPtr RawTLegend) deriving (Eq, Ord, Show)
instance FPtr TLegend where
   type Raw TLegend = RawTLegend
   get_fptr (TLegend fptr) = fptr
   cast_fptr_to_obj = TLegend

data RawTPaveLabel
newtype TPaveLabel = TPaveLabel (ForeignPtr RawTPaveLabel) deriving (Eq, Ord, Show)
instance FPtr TPaveLabel where
   type Raw TPaveLabel = RawTPaveLabel
   get_fptr (TPaveLabel fptr) = fptr
   cast_fptr_to_obj = TPaveLabel

data RawTPaveClass
newtype TPaveClass = TPaveClass (ForeignPtr RawTPaveClass) deriving (Eq, Ord, Show)
instance FPtr TPaveClass where
   type Raw TPaveClass = RawTPaveClass
   get_fptr (TPaveClass fptr) = fptr
   cast_fptr_to_obj = TPaveClass

data RawTWbox
newtype TWbox = TWbox (ForeignPtr RawTWbox) deriving (Eq, Ord, Show)
instance FPtr TWbox where
   type Raw TWbox = RawTWbox
   get_fptr (TWbox fptr) = fptr
   cast_fptr_to_obj = TWbox

data RawTFrame
newtype TFrame = TFrame (ForeignPtr RawTFrame) deriving (Eq, Ord, Show)
instance FPtr TFrame where
   type Raw TFrame = RawTFrame
   get_fptr (TFrame fptr) = fptr
   cast_fptr_to_obj = TFrame

data RawTSliderBox
newtype TSliderBox = TSliderBox (ForeignPtr RawTSliderBox) deriving (Eq, Ord, Show)
instance FPtr TSliderBox where
   type Raw TSliderBox = RawTSliderBox
   get_fptr (TSliderBox fptr) = fptr
   cast_fptr_to_obj = TSliderBox

data RawTTree
newtype TTree = TTree (ForeignPtr RawTTree) deriving (Eq, Ord, Show)
instance FPtr TTree where
   type Raw TTree = RawTTree
   get_fptr (TTree fptr) = fptr
   cast_fptr_to_obj = TTree

data RawTChain
newtype TChain = TChain (ForeignPtr RawTChain) deriving (Eq, Ord, Show)
instance FPtr TChain where
   type Raw TChain = RawTChain
   get_fptr (TChain fptr) = fptr
   cast_fptr_to_obj = TChain

data RawTNtuple
newtype TNtuple = TNtuple (ForeignPtr RawTNtuple) deriving (Eq, Ord, Show)
instance FPtr TNtuple where
   type Raw TNtuple = RawTNtuple
   get_fptr (TNtuple fptr) = fptr
   cast_fptr_to_obj = TNtuple

data RawTNtupleD
newtype TNtupleD = TNtupleD (ForeignPtr RawTNtupleD) deriving (Eq, Ord, Show)
instance FPtr TNtupleD where
   type Raw TNtupleD = RawTNtupleD
   get_fptr (TNtupleD fptr) = fptr
   cast_fptr_to_obj = TNtupleD

data RawTTreeSQL
newtype TTreeSQL = TTreeSQL (ForeignPtr RawTTreeSQL) deriving (Eq, Ord, Show)
instance FPtr TTreeSQL where
   type Raw TTreeSQL = RawTTreeSQL
   get_fptr (TTreeSQL fptr) = fptr
   cast_fptr_to_obj = TTreeSQL

data RawTPolyLine
newtype TPolyLine = TPolyLine (ForeignPtr RawTPolyLine) deriving (Eq, Ord, Show)
instance FPtr TPolyLine where
   type Raw TPolyLine = RawTPolyLine
   get_fptr (TPolyLine fptr) = fptr
   cast_fptr_to_obj = TPolyLine

data RawTCurlyLine
newtype TCurlyLine = TCurlyLine (ForeignPtr RawTCurlyLine) deriving (Eq, Ord, Show)
instance FPtr TCurlyLine where
   type Raw TCurlyLine = RawTCurlyLine
   get_fptr (TCurlyLine fptr) = fptr
   cast_fptr_to_obj = TCurlyLine

data RawTCurlyArc
newtype TCurlyArc = TCurlyArc (ForeignPtr RawTCurlyArc) deriving (Eq, Ord, Show)
instance FPtr TCurlyArc where
   type Raw TCurlyArc = RawTCurlyArc
   get_fptr (TCurlyArc fptr) = fptr
   cast_fptr_to_obj = TCurlyArc

data RawTEfficiency
newtype TEfficiency = TEfficiency (ForeignPtr RawTEfficiency) deriving (Eq, Ord, Show)
instance FPtr TEfficiency where
   type Raw TEfficiency = RawTEfficiency
   get_fptr (TEfficiency fptr) = fptr
   cast_fptr_to_obj = TEfficiency

data RawTAxis
newtype TAxis = TAxis (ForeignPtr RawTAxis) deriving (Eq, Ord, Show)
instance FPtr TAxis where
   type Raw TAxis = RawTAxis
   get_fptr (TAxis fptr) = fptr
   cast_fptr_to_obj = TAxis

data RawTLatex
newtype TLatex = TLatex (ForeignPtr RawTLatex) deriving (Eq, Ord, Show)
instance FPtr TLatex where
   type Raw TLatex = RawTLatex
   get_fptr (TLatex fptr) = fptr
   cast_fptr_to_obj = TLatex

data RawTText
newtype TText = TText (ForeignPtr RawTText) deriving (Eq, Ord, Show)
instance FPtr TText where
   type Raw TText = RawTText
   get_fptr (TText fptr) = fptr
   cast_fptr_to_obj = TText

data RawTDirectory
newtype TDirectory = TDirectory (ForeignPtr RawTDirectory) deriving (Eq, Ord, Show)
instance FPtr TDirectory where
   type Raw TDirectory = RawTDirectory
   get_fptr (TDirectory fptr) = fptr
   cast_fptr_to_obj = TDirectory

data RawTDirectoryFile
newtype TDirectoryFile = TDirectoryFile (ForeignPtr RawTDirectoryFile) deriving (Eq, Ord, Show)
instance FPtr TDirectoryFile where
   type Raw TDirectoryFile = RawTDirectoryFile
   get_fptr (TDirectoryFile fptr) = fptr
   cast_fptr_to_obj = TDirectoryFile

data RawTFile
newtype TFile = TFile (ForeignPtr RawTFile) deriving (Eq, Ord, Show)
instance FPtr TFile where
   type Raw TFile = RawTFile
   get_fptr (TFile fptr) = fptr
   cast_fptr_to_obj = TFile

data RawTBranch
newtype TBranch = TBranch (ForeignPtr RawTBranch) deriving (Eq, Ord, Show)
instance FPtr TBranch where
   type Raw TBranch = RawTBranch
   get_fptr (TBranch fptr) = fptr
   cast_fptr_to_obj = TBranch

data RawTVirtualTreePlayer
newtype TVirtualTreePlayer = TVirtualTreePlayer (ForeignPtr RawTVirtualTreePlayer) deriving (Eq, Ord, Show)
instance FPtr TVirtualTreePlayer where
   type Raw TVirtualTreePlayer = RawTVirtualTreePlayer
   get_fptr (TVirtualTreePlayer fptr) = fptr
   cast_fptr_to_obj = TVirtualTreePlayer

data RawTTreePlayer
newtype TTreePlayer = TTreePlayer (ForeignPtr RawTTreePlayer) deriving (Eq, Ord, Show)
instance FPtr TTreePlayer where
   type Raw TTreePlayer = RawTTreePlayer
   get_fptr (TTreePlayer fptr) = fptr
   cast_fptr_to_obj = TTreePlayer

data RawTArray
newtype TArray = TArray (ForeignPtr RawTArray) deriving (Eq, Ord, Show)
instance FPtr TArray where
   type Raw TArray = RawTArray
   get_fptr (TArray fptr) = fptr
   cast_fptr_to_obj = TArray

data RawTArrayC
newtype TArrayC = TArrayC (ForeignPtr RawTArrayC) deriving (Eq, Ord, Show)
instance FPtr TArrayC where
   type Raw TArrayC = RawTArrayC
   get_fptr (TArrayC fptr) = fptr
   cast_fptr_to_obj = TArrayC

data RawTArrayD
newtype TArrayD = TArrayD (ForeignPtr RawTArrayD) deriving (Eq, Ord, Show)
instance FPtr TArrayD where
   type Raw TArrayD = RawTArrayD
   get_fptr (TArrayD fptr) = fptr
   cast_fptr_to_obj = TArrayD

data RawTArrayF
newtype TArrayF = TArrayF (ForeignPtr RawTArrayF) deriving (Eq, Ord, Show)
instance FPtr TArrayF where
   type Raw TArrayF = RawTArrayF
   get_fptr (TArrayF fptr) = fptr
   cast_fptr_to_obj = TArrayF

data RawTArrayI
newtype TArrayI = TArrayI (ForeignPtr RawTArrayI) deriving (Eq, Ord, Show)
instance FPtr TArrayI where
   type Raw TArrayI = RawTArrayI
   get_fptr (TArrayI fptr) = fptr
   cast_fptr_to_obj = TArrayI

data RawTArrayL
newtype TArrayL = TArrayL (ForeignPtr RawTArrayL) deriving (Eq, Ord, Show)
instance FPtr TArrayL where
   type Raw TArrayL = RawTArrayL
   get_fptr (TArrayL fptr) = fptr
   cast_fptr_to_obj = TArrayL

data RawTArrayL64
newtype TArrayL64 = TArrayL64 (ForeignPtr RawTArrayL64) deriving (Eq, Ord, Show)
instance FPtr TArrayL64 where
   type Raw TArrayL64 = RawTArrayL64
   get_fptr (TArrayL64 fptr) = fptr
   cast_fptr_to_obj = TArrayL64

data RawTArrayS
newtype TArrayS = TArrayS (ForeignPtr RawTArrayS) deriving (Eq, Ord, Show)
instance FPtr TArrayS where
   type Raw TArrayS = RawTArrayS
   get_fptr (TArrayS fptr) = fptr
   cast_fptr_to_obj = TArrayS

data RawTH1
newtype TH1 = TH1 (ForeignPtr RawTH1) deriving (Eq, Ord, Show)
instance FPtr TH1 where
   type Raw TH1 = RawTH1
   get_fptr (TH1 fptr) = fptr
   cast_fptr_to_obj = TH1

data RawTH2
newtype TH2 = TH2 (ForeignPtr RawTH2) deriving (Eq, Ord, Show)
instance FPtr TH2 where
   type Raw TH2 = RawTH2
   get_fptr (TH2 fptr) = fptr
   cast_fptr_to_obj = TH2

data RawTH3
newtype TH3 = TH3 (ForeignPtr RawTH3) deriving (Eq, Ord, Show)
instance FPtr TH3 where
   type Raw TH3 = RawTH3
   get_fptr (TH3 fptr) = fptr
   cast_fptr_to_obj = TH3

data RawTH1C
newtype TH1C = TH1C (ForeignPtr RawTH1C) deriving (Eq, Ord, Show)
instance FPtr TH1C where
   type Raw TH1C = RawTH1C
   get_fptr (TH1C fptr) = fptr
   cast_fptr_to_obj = TH1C

data RawTH1D
newtype TH1D = TH1D (ForeignPtr RawTH1D) deriving (Eq, Ord, Show)
instance FPtr TH1D where
   type Raw TH1D = RawTH1D
   get_fptr (TH1D fptr) = fptr
   cast_fptr_to_obj = TH1D

data RawTH1F
newtype TH1F = TH1F (ForeignPtr RawTH1F) deriving (Eq, Ord, Show)
instance FPtr TH1F where
   type Raw TH1F = RawTH1F
   get_fptr (TH1F fptr) = fptr
   cast_fptr_to_obj = TH1F

data RawTH1I
newtype TH1I = TH1I (ForeignPtr RawTH1I) deriving (Eq, Ord, Show)
instance FPtr TH1I where
   type Raw TH1I = RawTH1I
   get_fptr (TH1I fptr) = fptr
   cast_fptr_to_obj = TH1I

data RawTH1S
newtype TH1S = TH1S (ForeignPtr RawTH1S) deriving (Eq, Ord, Show)
instance FPtr TH1S where
   type Raw TH1S = RawTH1S
   get_fptr (TH1S fptr) = fptr
   cast_fptr_to_obj = TH1S

data RawTH2C
newtype TH2C = TH2C (ForeignPtr RawTH2C) deriving (Eq, Ord, Show)
instance FPtr TH2C where
   type Raw TH2C = RawTH2C
   get_fptr (TH2C fptr) = fptr
   cast_fptr_to_obj = TH2C

data RawTH2D
newtype TH2D = TH2D (ForeignPtr RawTH2D) deriving (Eq, Ord, Show)
instance FPtr TH2D where
   type Raw TH2D = RawTH2D
   get_fptr (TH2D fptr) = fptr
   cast_fptr_to_obj = TH2D

data RawTH2F
newtype TH2F = TH2F (ForeignPtr RawTH2F) deriving (Eq, Ord, Show)
instance FPtr TH2F where
   type Raw TH2F = RawTH2F
   get_fptr (TH2F fptr) = fptr
   cast_fptr_to_obj = TH2F

data RawTH2I
newtype TH2I = TH2I (ForeignPtr RawTH2I) deriving (Eq, Ord, Show)
instance FPtr TH2I where
   type Raw TH2I = RawTH2I
   get_fptr (TH2I fptr) = fptr
   cast_fptr_to_obj = TH2I

data RawTH2Poly
newtype TH2Poly = TH2Poly (ForeignPtr RawTH2Poly) deriving (Eq, Ord, Show)
instance FPtr TH2Poly where
   type Raw TH2Poly = RawTH2Poly
   get_fptr (TH2Poly fptr) = fptr
   cast_fptr_to_obj = TH2Poly

data RawTH2S
newtype TH2S = TH2S (ForeignPtr RawTH2S) deriving (Eq, Ord, Show)
instance FPtr TH2S where
   type Raw TH2S = RawTH2S
   get_fptr (TH2S fptr) = fptr
   cast_fptr_to_obj = TH2S

data RawTH3C
newtype TH3C = TH3C (ForeignPtr RawTH3C) deriving (Eq, Ord, Show)
instance FPtr TH3C where
   type Raw TH3C = RawTH3C
   get_fptr (TH3C fptr) = fptr
   cast_fptr_to_obj = TH3C

data RawTH3D
newtype TH3D = TH3D (ForeignPtr RawTH3D) deriving (Eq, Ord, Show)
instance FPtr TH3D where
   type Raw TH3D = RawTH3D
   get_fptr (TH3D fptr) = fptr
   cast_fptr_to_obj = TH3D

data RawTH3F
newtype TH3F = TH3F (ForeignPtr RawTH3F) deriving (Eq, Ord, Show)
instance FPtr TH3F where
   type Raw TH3F = RawTH3F
   get_fptr (TH3F fptr) = fptr
   cast_fptr_to_obj = TH3F

data RawTH3I
newtype TH3I = TH3I (ForeignPtr RawTH3I) deriving (Eq, Ord, Show)
instance FPtr TH3I where
   type Raw TH3I = RawTH3I
   get_fptr (TH3I fptr) = fptr
   cast_fptr_to_obj = TH3I

data RawTH3S
newtype TH3S = TH3S (ForeignPtr RawTH3S) deriving (Eq, Ord, Show)
instance FPtr TH3S where
   type Raw TH3S = RawTH3S
   get_fptr (TH3S fptr) = fptr
   cast_fptr_to_obj = TH3S

data RawTQObject
newtype TQObject = TQObject (ForeignPtr RawTQObject) deriving (Eq, Ord, Show)
instance FPtr TQObject where
   type Raw TQObject = RawTQObject
   get_fptr (TQObject fptr) = fptr
   cast_fptr_to_obj = TQObject

data RawTVirtualPad
newtype TVirtualPad = TVirtualPad (ForeignPtr RawTVirtualPad) deriving (Eq, Ord, Show)
instance FPtr TVirtualPad where
   type Raw TVirtualPad = RawTVirtualPad
   get_fptr (TVirtualPad fptr) = fptr
   cast_fptr_to_obj = TVirtualPad

data RawTPad
newtype TPad = TPad (ForeignPtr RawTPad) deriving (Eq, Ord, Show)
instance FPtr TPad where
   type Raw TPad = RawTPad
   get_fptr (TPad fptr) = fptr
   cast_fptr_to_obj = TPad

data RawTButton
newtype TButton = TButton (ForeignPtr RawTButton) deriving (Eq, Ord, Show)
instance FPtr TButton where
   type Raw TButton = RawTButton
   get_fptr (TButton fptr) = fptr
   cast_fptr_to_obj = TButton

data RawTGroupButton
newtype TGroupButton = TGroupButton (ForeignPtr RawTGroupButton) deriving (Eq, Ord, Show)
instance FPtr TGroupButton where
   type Raw TGroupButton = RawTGroupButton
   get_fptr (TGroupButton fptr) = fptr
   cast_fptr_to_obj = TGroupButton

data RawTCanvas
newtype TCanvas = TCanvas (ForeignPtr RawTCanvas) deriving (Eq, Ord, Show)
instance FPtr TCanvas where
   type Raw TCanvas = RawTCanvas
   get_fptr (TCanvas fptr) = fptr
   cast_fptr_to_obj = TCanvas

data RawTDialogCanvas
newtype TDialogCanvas = TDialogCanvas (ForeignPtr RawTDialogCanvas) deriving (Eq, Ord, Show)
instance FPtr TDialogCanvas where
   type Raw TDialogCanvas = RawTDialogCanvas
   get_fptr (TDialogCanvas fptr) = fptr
   cast_fptr_to_obj = TDialogCanvas

data RawTInspectCanvas
newtype TInspectCanvas = TInspectCanvas (ForeignPtr RawTInspectCanvas) deriving (Eq, Ord, Show)
instance FPtr TInspectCanvas where
   type Raw TInspectCanvas = RawTInspectCanvas
   get_fptr (TInspectCanvas fptr) = fptr
   cast_fptr_to_obj = TInspectCanvas

data RawTEvePad
newtype TEvePad = TEvePad (ForeignPtr RawTEvePad) deriving (Eq, Ord, Show)
instance FPtr TEvePad where
   type Raw TEvePad = RawTEvePad
   get_fptr (TEvePad fptr) = fptr
   cast_fptr_to_obj = TEvePad

data RawTSlider
newtype TSlider = TSlider (ForeignPtr RawTSlider) deriving (Eq, Ord, Show)
instance FPtr TSlider where
   type Raw TSlider = RawTSlider
   get_fptr (TSlider fptr) = fptr
   cast_fptr_to_obj = TSlider

data RawTApplication
newtype TApplication = TApplication (ForeignPtr RawTApplication) deriving (Eq, Ord, Show)
instance FPtr TApplication where
   type Raw TApplication = RawTApplication
   get_fptr (TApplication fptr) = fptr
   cast_fptr_to_obj = TApplication

data RawTRint
newtype TRint = TRint (ForeignPtr RawTRint) deriving (Eq, Ord, Show)
instance FPtr TRint where
   type Raw TRint = RawTRint
   get_fptr (TRint fptr) = fptr
   cast_fptr_to_obj = TRint