{-# LANGUAGE FlexibleContexts, FlexibleInstances, ForeignFunctionInterface, GeneralizedNewtypeDeriving, MonoLocalBinds, MultiParamTypeClasses, ScopedTypeVariables, TypeSynonymInstances, UndecidableInstances #-}
---------- GENERATED FILE, EDITS WILL BE LOST ----------

module Graphics.UI.Qtah.Generated.Core.QMargins (
  QMarginsValue (..),
  QMarginsConstPtr (..),
  bottom,
  isNull,
  left,
  right,
  top,
  eQ,
  nE,
  QMarginsPtr (..),
  setBottom,
  setLeft,
  setRight,
  setTop,
  aDDA,
  aDDAInt,
  sUBA,
  sUBAInt,
  mULA,
  mULAReal,
  dIVA,
  dIVAReal,
  aSSIGN,
  QMarginsConst (..),
  castQMarginsToConst,
  QMargins (..),
  castQMarginsToNonconst,
  newNull,
  new,
  newCopy,
  QMarginsSuper (..),
  QMarginsSuperConst (..),
  ) where

import Control.Applicative ((<$>), (<*>))
import qualified Foreign as HoppyF
import qualified Foreign.C as HoppyFC
import qualified Foreign.Hoppy.Runtime as HoppyFHR
import qualified Graphics.UI.Qtah.Core.HMargins as HMargins
import Prelude (($), (.), (/=), (==), (>>))
import qualified Prelude as HoppyP

foreign import ccall "genpop__QMargins_newNull" newNull' ::  HoppyP.IO (HoppyF.Ptr QMargins)
foreign import ccall "genpop__QMargins_new" new' ::  HoppyFC.CInt -> HoppyFC.CInt -> HoppyFC.CInt -> HoppyFC.CInt -> HoppyP.IO (HoppyF.Ptr QMargins)
foreign import ccall "genpop__QMargins_newCopy" newCopy' ::  HoppyF.Ptr QMarginsConst -> HoppyP.IO (HoppyF.Ptr QMargins)
foreign import ccall "genpop__QMargins_bottom" bottom' ::  HoppyF.Ptr QMarginsConst -> HoppyP.IO HoppyFC.CInt
foreign import ccall "genpop__QMargins_setBottom" setBottom' ::  HoppyF.Ptr QMargins -> HoppyFC.CInt -> HoppyP.IO ()
foreign import ccall "genpop__QMargins_isNull" isNull' ::  HoppyF.Ptr QMarginsConst -> HoppyP.IO HoppyFHR.CBool
foreign import ccall "genpop__QMargins_left" left' ::  HoppyF.Ptr QMarginsConst -> HoppyP.IO HoppyFC.CInt
foreign import ccall "genpop__QMargins_setLeft" setLeft' ::  HoppyF.Ptr QMargins -> HoppyFC.CInt -> HoppyP.IO ()
foreign import ccall "genpop__QMargins_right" right' ::  HoppyF.Ptr QMarginsConst -> HoppyP.IO HoppyFC.CInt
foreign import ccall "genpop__QMargins_setRight" setRight' ::  HoppyF.Ptr QMargins -> HoppyFC.CInt -> HoppyP.IO ()
foreign import ccall "genpop__QMargins_top" top' ::  HoppyF.Ptr QMarginsConst -> HoppyP.IO HoppyFC.CInt
foreign import ccall "genpop__QMargins_setTop" setTop' ::  HoppyF.Ptr QMargins -> HoppyFC.CInt -> HoppyP.IO ()
foreign import ccall "genpop__QMargins_ADDA" aDDA' ::  HoppyF.Ptr QMargins -> HoppyF.Ptr QMarginsConst -> HoppyP.IO (HoppyF.Ptr QMargins)
foreign import ccall "genpop__QMargins_ADDAInt" aDDAInt' ::  HoppyF.Ptr QMargins -> HoppyFC.CInt -> HoppyP.IO (HoppyF.Ptr QMargins)
foreign import ccall "genpop__QMargins_SUBA" sUBA' ::  HoppyF.Ptr QMargins -> HoppyF.Ptr QMarginsConst -> HoppyP.IO (HoppyF.Ptr QMargins)
foreign import ccall "genpop__QMargins_SUBAInt" sUBAInt' ::  HoppyF.Ptr QMargins -> HoppyFC.CInt -> HoppyP.IO (HoppyF.Ptr QMargins)
foreign import ccall "genpop__QMargins_MULA" mULA' ::  HoppyF.Ptr QMargins -> HoppyFC.CInt -> HoppyP.IO (HoppyF.Ptr QMargins)
foreign import ccall "genpop__QMargins_MULAReal" mULAReal' ::  HoppyF.Ptr QMargins -> HoppyFC.CDouble -> HoppyP.IO (HoppyF.Ptr QMargins)
foreign import ccall "genpop__QMargins_DIVA" dIVA' ::  HoppyF.Ptr QMargins -> HoppyFC.CInt -> HoppyP.IO (HoppyF.Ptr QMargins)
foreign import ccall "genpop__QMargins_DIVAReal" dIVAReal' ::  HoppyF.Ptr QMargins -> HoppyFC.CDouble -> HoppyP.IO (HoppyF.Ptr QMargins)
foreign import ccall "genpop__QMargins_EQ" eQ' ::  HoppyF.Ptr QMarginsConst -> HoppyF.Ptr QMarginsConst -> HoppyP.IO HoppyFHR.CBool
foreign import ccall "genpop__QMargins_NE" nE' ::  HoppyF.Ptr QMarginsConst -> HoppyF.Ptr QMarginsConst -> HoppyP.IO HoppyFHR.CBool
foreign import ccall "genpop__QMargins_ASSIGN" aSSIGN' ::  HoppyF.Ptr QMargins -> HoppyF.Ptr QMarginsConst -> HoppyP.IO (HoppyF.Ptr QMargins)
foreign import ccall "gendel__QMargins" delete'QMargins :: HoppyF.Ptr QMarginsConst -> HoppyP.IO ()
foreign import ccall "&gendel__QMargins" deletePtr'QMargins :: HoppyF.FunPtr (HoppyF.Ptr QMarginsConst -> HoppyP.IO ())

class QMarginsValue a where
  withQMarginsPtr :: a -> (QMarginsConst -> HoppyP.IO b) -> HoppyP.IO b

instance {-# OVERLAPPABLE #-} QMarginsConstPtr a => QMarginsValue a where
  withQMarginsPtr = HoppyP.flip ($) . toQMarginsConst

instance {-# OVERLAPPING #-} QMarginsValue (HMargins.HMargins) where
  withQMarginsPtr = HoppyFHR.withCppObj

class (HoppyFHR.CppPtr this) => QMarginsConstPtr this where
  toQMarginsConst :: this -> QMarginsConst

bottom :: (QMarginsValue arg'1) => arg'1 -> HoppyP.IO HoppyP.Int
bottom arg'1 =
  withQMarginsPtr arg'1 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'1' ->
  HoppyP.fmap HoppyFHR.coerceIntegral
  (bottom' arg'1')

isNull :: (QMarginsValue arg'1) => arg'1 -> HoppyP.IO HoppyP.Bool
isNull arg'1 =
  withQMarginsPtr arg'1 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'1' ->
  HoppyP.fmap (/= 0)
  (isNull' arg'1')

left :: (QMarginsValue arg'1) => arg'1 -> HoppyP.IO HoppyP.Int
left arg'1 =
  withQMarginsPtr arg'1 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'1' ->
  HoppyP.fmap HoppyFHR.coerceIntegral
  (left' arg'1')

right :: (QMarginsValue arg'1) => arg'1 -> HoppyP.IO HoppyP.Int
right arg'1 =
  withQMarginsPtr arg'1 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'1' ->
  HoppyP.fmap HoppyFHR.coerceIntegral
  (right' arg'1')

top :: (QMarginsValue arg'1) => arg'1 -> HoppyP.IO HoppyP.Int
top arg'1 =
  withQMarginsPtr arg'1 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'1' ->
  HoppyP.fmap HoppyFHR.coerceIntegral
  (top' arg'1')

eQ :: (QMarginsValue arg'1, QMarginsValue arg'2) => arg'1 -> arg'2 -> HoppyP.IO HoppyP.Bool
eQ arg'1 arg'2 =
  withQMarginsPtr arg'1 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'1' ->
  withQMarginsPtr arg'2 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'2' ->
  HoppyP.fmap (/= 0)
  (eQ' arg'1' arg'2')

nE :: (QMarginsValue arg'1, QMarginsValue arg'2) => arg'1 -> arg'2 -> HoppyP.IO HoppyP.Bool
nE arg'1 arg'2 =
  withQMarginsPtr arg'1 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'1' ->
  withQMarginsPtr arg'2 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'2' ->
  HoppyP.fmap (/= 0)
  (nE' arg'1' arg'2')

class (QMarginsConstPtr this) => QMarginsPtr this where
  toQMargins :: this -> QMargins

setBottom :: (QMarginsPtr arg'1) => arg'1 -> HoppyP.Int -> HoppyP.IO ()
setBottom arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  let arg'2' = HoppyFHR.coerceIntegral arg'2 in
  (setBottom' arg'1' arg'2')

setLeft :: (QMarginsPtr arg'1) => arg'1 -> HoppyP.Int -> HoppyP.IO ()
setLeft arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  let arg'2' = HoppyFHR.coerceIntegral arg'2 in
  (setLeft' arg'1' arg'2')

setRight :: (QMarginsPtr arg'1) => arg'1 -> HoppyP.Int -> HoppyP.IO ()
setRight arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  let arg'2' = HoppyFHR.coerceIntegral arg'2 in
  (setRight' arg'1' arg'2')

setTop :: (QMarginsPtr arg'1) => arg'1 -> HoppyP.Int -> HoppyP.IO ()
setTop arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  let arg'2' = HoppyFHR.coerceIntegral arg'2 in
  (setTop' arg'1' arg'2')

aDDA :: (QMarginsPtr arg'1, QMarginsValue arg'2) => arg'1 -> arg'2 -> HoppyP.IO QMargins
aDDA arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  withQMarginsPtr arg'2 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'2' ->
  HoppyP.fmap QMargins
  (aDDA' arg'1' arg'2')

aDDAInt :: (QMarginsPtr arg'1) => arg'1 -> HoppyP.Int -> HoppyP.IO QMargins
aDDAInt arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  let arg'2' = HoppyFHR.coerceIntegral arg'2 in
  HoppyP.fmap QMargins
  (aDDAInt' arg'1' arg'2')

sUBA :: (QMarginsPtr arg'1, QMarginsValue arg'2) => arg'1 -> arg'2 -> HoppyP.IO QMargins
sUBA arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  withQMarginsPtr arg'2 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'2' ->
  HoppyP.fmap QMargins
  (sUBA' arg'1' arg'2')

sUBAInt :: (QMarginsPtr arg'1) => arg'1 -> HoppyP.Int -> HoppyP.IO QMargins
sUBAInt arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  let arg'2' = HoppyFHR.coerceIntegral arg'2 in
  HoppyP.fmap QMargins
  (sUBAInt' arg'1' arg'2')

mULA :: (QMarginsPtr arg'1) => arg'1 -> HoppyP.Int -> HoppyP.IO QMargins
mULA arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  let arg'2' = HoppyFHR.coerceIntegral arg'2 in
  HoppyP.fmap QMargins
  (mULA' arg'1' arg'2')

mULAReal :: (QMarginsPtr arg'1) => arg'1 -> HoppyP.Double -> HoppyP.IO QMargins
mULAReal arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  let arg'2' = HoppyP.realToFrac arg'2 in
  HoppyP.fmap QMargins
  (mULAReal' arg'1' arg'2')

dIVA :: (QMarginsPtr arg'1) => arg'1 -> HoppyP.Int -> HoppyP.IO QMargins
dIVA arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  let arg'2' = HoppyFHR.coerceIntegral arg'2 in
  HoppyP.fmap QMargins
  (dIVA' arg'1' arg'2')

dIVAReal :: (QMarginsPtr arg'1) => arg'1 -> HoppyP.Double -> HoppyP.IO QMargins
dIVAReal arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  let arg'2' = HoppyP.realToFrac arg'2 in
  HoppyP.fmap QMargins
  (dIVAReal' arg'1' arg'2')

aSSIGN :: (QMarginsPtr arg'1, QMarginsValue arg'2) => arg'1 -> arg'2 -> HoppyP.IO QMargins
aSSIGN arg'1 arg'2 =
  HoppyFHR.withCppPtr (toQMargins arg'1) $ \arg'1' ->
  withQMarginsPtr arg'2 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'2' ->
  HoppyP.fmap QMargins
  (aSSIGN' arg'1' arg'2')

data QMarginsConst =
    QMarginsConst (HoppyF.Ptr QMarginsConst)
  | QMarginsConstGc (HoppyF.ForeignPtr ()) (HoppyF.Ptr QMarginsConst)
  deriving (HoppyP.Show)

instance HoppyP.Eq QMarginsConst where
  x == y = HoppyFHR.toPtr x == HoppyFHR.toPtr y

instance HoppyP.Ord QMarginsConst where
  compare x y = HoppyP.compare (HoppyFHR.toPtr x) (HoppyFHR.toPtr y)

castQMarginsToConst :: QMargins -> QMarginsConst
castQMarginsToConst (QMargins ptr') = QMarginsConst $ HoppyF.castPtr ptr'
castQMarginsToConst (QMarginsGc fptr' ptr') = QMarginsConstGc fptr' $ HoppyF.castPtr ptr'

instance HoppyFHR.CppPtr QMarginsConst where
  nullptr = QMarginsConst HoppyF.nullPtr

  withCppPtr (QMarginsConst ptr') f' = f' ptr'
  withCppPtr (QMarginsConstGc fptr' ptr') f' = HoppyF.withForeignPtr fptr' $ \_ -> f' ptr'

  toPtr (QMarginsConst ptr') = ptr'
  toPtr (QMarginsConstGc _ ptr') = ptr'

  touchCppPtr (QMarginsConst _) = HoppyP.return ()
  touchCppPtr (QMarginsConstGc fptr' _) = HoppyF.touchForeignPtr fptr'

instance HoppyFHR.Deletable QMarginsConst where
  delete (QMarginsConst ptr') = delete'QMargins ptr'
  delete (QMarginsConstGc _ _) = HoppyP.fail $ HoppyP.concat ["Deletable.delete: Asked to delete a GC-managed ", "QMarginsConst", " object."]

  toGc this'@(QMarginsConst ptr') = if ptr' == HoppyF.nullPtr then HoppyP.return this' else HoppyP.fmap (HoppyP.flip QMarginsConstGc ptr') $ HoppyF.newForeignPtr (HoppyF.castFunPtr deletePtr'QMargins :: HoppyF.FunPtr (HoppyF.Ptr () -> HoppyP.IO ())) (HoppyF.castPtr ptr' :: HoppyF.Ptr ())
  toGc this'@(QMarginsConstGc {}) = HoppyP.return this'

instance HoppyFHR.Copyable QMarginsConst QMargins where copy = newCopy

instance QMarginsConstPtr QMarginsConst where
  toQMarginsConst = HoppyP.id

data QMargins =
    QMargins (HoppyF.Ptr QMargins)
  | QMarginsGc (HoppyF.ForeignPtr ()) (HoppyF.Ptr QMargins)
  deriving (HoppyP.Show)

instance HoppyP.Eq QMargins where
  x == y = HoppyFHR.toPtr x == HoppyFHR.toPtr y

instance HoppyP.Ord QMargins where
  compare x y = HoppyP.compare (HoppyFHR.toPtr x) (HoppyFHR.toPtr y)

castQMarginsToNonconst :: QMarginsConst -> QMargins
castQMarginsToNonconst (QMarginsConst ptr') = QMargins $ HoppyF.castPtr ptr'
castQMarginsToNonconst (QMarginsConstGc fptr' ptr') = QMarginsGc fptr' $ HoppyF.castPtr ptr'

instance HoppyFHR.CppPtr QMargins where
  nullptr = QMargins HoppyF.nullPtr

  withCppPtr (QMargins ptr') f' = f' ptr'
  withCppPtr (QMarginsGc fptr' ptr') f' = HoppyF.withForeignPtr fptr' $ \_ -> f' ptr'

  toPtr (QMargins ptr') = ptr'
  toPtr (QMarginsGc _ ptr') = ptr'

  touchCppPtr (QMargins _) = HoppyP.return ()
  touchCppPtr (QMarginsGc fptr' _) = HoppyF.touchForeignPtr fptr'

instance HoppyFHR.Deletable QMargins where
  delete (QMargins ptr') = delete'QMargins $ (HoppyF.castPtr ptr' :: HoppyF.Ptr QMarginsConst)
  delete (QMarginsGc _ _) = HoppyP.fail $ HoppyP.concat ["Deletable.delete: Asked to delete a GC-managed ", "QMargins", " object."]

  toGc this'@(QMargins ptr') = if ptr' == HoppyF.nullPtr then HoppyP.return this' else HoppyP.fmap (HoppyP.flip QMarginsGc ptr') $ HoppyF.newForeignPtr (HoppyF.castFunPtr deletePtr'QMargins :: HoppyF.FunPtr (HoppyF.Ptr () -> HoppyP.IO ())) (HoppyF.castPtr ptr' :: HoppyF.Ptr ())
  toGc this'@(QMarginsGc {}) = HoppyP.return this'

instance HoppyFHR.Copyable QMargins QMargins where copy = newCopy

instance QMarginsConstPtr QMargins where
  toQMarginsConst (QMargins ptr') = QMarginsConst $ (HoppyF.castPtr :: HoppyF.Ptr QMargins -> HoppyF.Ptr QMarginsConst) ptr'
  toQMarginsConst (QMarginsGc fptr' ptr') = QMarginsConstGc fptr' $ (HoppyF.castPtr :: HoppyF.Ptr QMargins -> HoppyF.Ptr QMarginsConst) ptr'

instance QMarginsPtr QMargins where
  toQMargins = HoppyP.id

newNull ::  HoppyP.IO QMargins
newNull =
  HoppyP.fmap QMargins
  (newNull')

new ::  HoppyP.Int -> HoppyP.Int -> HoppyP.Int -> HoppyP.Int -> HoppyP.IO QMargins
new arg'1 arg'2 arg'3 arg'4 =
  let arg'1' = HoppyFHR.coerceIntegral arg'1 in
  let arg'2' = HoppyFHR.coerceIntegral arg'2 in
  let arg'3' = HoppyFHR.coerceIntegral arg'3 in
  let arg'4' = HoppyFHR.coerceIntegral arg'4 in
  HoppyP.fmap QMargins
  (new' arg'1' arg'2' arg'3' arg'4')

newCopy :: (QMarginsValue arg'1) => arg'1 -> HoppyP.IO QMargins
newCopy arg'1 =
  withQMarginsPtr arg'1 $ HoppyP.flip HoppyFHR.withCppPtr $ \arg'1' ->
  HoppyP.fmap QMargins
  (newCopy' arg'1')

class QMarginsSuper a where
  downToQMargins :: a -> QMargins


class QMarginsSuperConst a where
  downToQMarginsConst :: a -> QMarginsConst


instance HoppyFHR.Assignable (HoppyF.Ptr (HoppyF.Ptr QMargins)) QMargins where
  assign ptr' value' = HoppyF.poke ptr' $ HoppyFHR.toPtr value'

instance QMarginsValue a => HoppyFHR.Assignable QMargins a where
  assign x' y' = aSSIGN x' y' >> HoppyP.return ()

instance HoppyFHR.Decodable (HoppyF.Ptr (HoppyF.Ptr QMargins)) QMargins where
  decode = HoppyP.fmap QMargins . HoppyF.peek

instance HoppyFHR.Encodable QMargins (HMargins.HMargins) where
  encode =
    new <$> HMargins.left <*> HMargins.top <*> HMargins.right <*> HMargins.bottom

instance HoppyFHR.Encodable QMarginsConst (HMargins.HMargins) where
  encode = HoppyP.fmap (toQMarginsConst) . HoppyFHR.encodeAs (HoppyP.undefined :: QMargins)

instance HoppyFHR.Decodable QMargins (HMargins.HMargins) where
  decode = HoppyFHR.decode . toQMarginsConst

instance HoppyFHR.Decodable QMarginsConst (HMargins.HMargins) where
  decode =
    \q -> HMargins.HMargins <$> left q <*> top q <*> right q <*> bottom q