{-# LANGUAGE CApiFFI #-}
module OpenCascade.Geom.BSplineCurve 
( toHandle
, nbPoles
, pole
, isRational
, segment
) where
import Foreign.Ptr
import Foreign.C (CInt (..), CBool (..), CDouble (..))
import Data.Acquire
import OpenCascade.Geom.Types (BSplineCurve)
import OpenCascade.Geom.Internal.Destructors (deleteHandleBSplineCurve)
import OpenCascade.Handle (Handle)
import OpenCascade.Internal.Bool (cBoolToBool)
import OpenCascade.GP (Pnt)
import OpenCascade.GP.Internal.Destructors (deletePnt)
import Data.Coerce (coerce)

foreign import capi unsafe "hs_Geom_BSplineCurve.h hs_Geom_BSplineCurve_toHandle" rawToHandle :: Ptr BSplineCurve -> IO (Ptr (Handle BSplineCurve))

toHandle :: Ptr BSplineCurve -> Acquire (Ptr (Handle BSplineCurve))
toHandle :: Ptr BSplineCurve -> Acquire (Ptr (Handle BSplineCurve))
toHandle Ptr BSplineCurve
curve = IO (Ptr (Handle BSplineCurve))
-> (Ptr (Handle BSplineCurve) -> IO ())
-> Acquire (Ptr (Handle BSplineCurve))
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire (Ptr BSplineCurve -> IO (Ptr (Handle BSplineCurve))
rawToHandle Ptr BSplineCurve
curve) Ptr (Handle BSplineCurve) -> IO ()
deleteHandleBSplineCurve

foreign import capi unsafe "hs_Geom_BSplineCurve.h hs_Geom_BSplineCurve_nbPoles" rawNbPoles :: Ptr (Handle BSplineCurve) -> IO (CInt)

nbPoles :: Ptr (Handle (BSplineCurve)) -> IO Int 
nbPoles :: Ptr (Handle BSplineCurve) -> IO Int
nbPoles Ptr (Handle BSplineCurve)
h = CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr (Handle BSplineCurve) -> IO CInt
rawNbPoles Ptr (Handle BSplineCurve)
h

foreign import capi unsafe "hs_Geom_BSplineCurve.h hs_Geom_BSplineCurve_pole" rawPole :: Ptr (Handle BSplineCurve) -> CInt -> IO (Ptr Pnt)

pole :: Ptr (Handle BSplineCurve) -> Int -> Acquire (Ptr Pnt)
pole :: Ptr (Handle BSplineCurve) -> Int -> Acquire (Ptr Pnt)
pole Ptr (Handle BSplineCurve)
h Int
n = IO (Ptr Pnt) -> (Ptr Pnt -> IO ()) -> Acquire (Ptr Pnt)
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire (Ptr (Handle BSplineCurve) -> CInt -> IO (Ptr Pnt)
rawPole Ptr (Handle BSplineCurve)
h (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)) Ptr Pnt -> IO ()
deletePnt

foreign import capi unsafe "hs_Geom_BSplineCurve.h hs_Geom_BSplineCurve_isRational" rawIsRational :: Ptr (Handle BSplineCurve) -> IO (CBool)

isRational :: Ptr (Handle (BSplineCurve)) -> IO Bool
isRational :: Ptr (Handle BSplineCurve) -> IO Bool
isRational Ptr (Handle BSplineCurve)
h = CBool -> Bool
cBoolToBool (CBool -> Bool) -> IO CBool -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr (Handle BSplineCurve) -> IO CBool
rawIsRational Ptr (Handle BSplineCurve)
h

foreign import capi unsafe "hs_Geom_BSplineCurve.h hs_Geom_BSplineCurve_segment" rawSegment :: Ptr (Handle BSplineCurve) -> CDouble -> CDouble -> CDouble -> IO ()

segment :: Ptr (Handle BSplineCurve) -> Double -> Double -> Double -> IO ()
segment :: Ptr (Handle BSplineCurve) -> Double -> Double -> Double -> IO ()
segment = (Ptr (Handle BSplineCurve)
 -> CDouble -> CDouble -> CDouble -> IO ())
-> Ptr (Handle BSplineCurve) -> Double -> Double -> Double -> IO ()
forall a b. Coercible a b => a -> b
coerce Ptr (Handle BSplineCurve) -> CDouble -> CDouble -> CDouble -> IO ()
rawSegment