{-# LANGUAGE CApiFFI #-}
module OpenCascade.GeomConvert.ApproxCurve
( ApproxCurve
, fromCurveToleranceOrderSegmentsAndDegree
, curve
, isDone
, hasResult
) where 

import OpenCascade.GeomConvert.Types (ApproxCurve)
import OpenCascade.GeomConvert.Internal.Destructors (deleteApproxCurve)
import OpenCascade.Geom.Internal.Destructors (deleteHandleBSplineCurve)
import qualified OpenCascade.GeomAbs.Shape as GeomAbs.Shape
import Foreign.Ptr (Ptr)
import Foreign.C (CInt (..), CDouble (..), CBool (..))
import Data.Coerce (coerce)
import Data.Acquire (Acquire, mkAcquire)
import OpenCascade.Handle (Handle)
import OpenCascade.Geom.Types as Geom
import OpenCascade.Internal.Bool (cBoolToBool)

foreign import capi unsafe "hs_GeomConvert_ApproxCurve.h hs_new_GeomConvert_ApproxCurve_fromCurveToleranceOrderSegmentsAndDegree" rawFromCurveToleranceOrderSegmentsAndDegree :: Ptr (Handle Geom.Curve) -> CDouble -> CInt -> CInt -> CInt -> IO (Ptr ApproxCurve)

fromCurveToleranceOrderSegmentsAndDegree :: Ptr (Handle Geom.Curve) -> Double -> GeomAbs.Shape.Shape -> Int -> Int -> Acquire (Ptr ApproxCurve)
fromCurveToleranceOrderSegmentsAndDegree :: Ptr (Handle Curve)
-> Double -> Shape -> Int -> Int -> Acquire (Ptr ApproxCurve)
fromCurveToleranceOrderSegmentsAndDegree Ptr (Handle Curve)
theCurve Double
tolerance Shape
order Int
maxSegments Int
maxDegree = 
    IO (Ptr ApproxCurve)
-> (Ptr ApproxCurve -> IO ()) -> Acquire (Ptr ApproxCurve)
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire 
        (Ptr (Handle Curve)
-> CDouble -> CInt -> CInt -> CInt -> IO (Ptr ApproxCurve)
rawFromCurveToleranceOrderSegmentsAndDegree 
            Ptr (Handle Curve)
theCurve
            (Double -> CDouble
forall a b. Coercible a b => a -> b
coerce Double
tolerance)
            (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> CInt) -> (Shape -> Int) -> Shape -> CInt
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Shape -> Int
forall a. Enum a => a -> Int
fromEnum (Shape -> CInt) -> Shape -> CInt
forall a b. (a -> b) -> a -> b
$ Shape
order)
            (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
maxSegments)
            (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
maxDegree)) 
        Ptr ApproxCurve -> IO ()
deleteApproxCurve


foreign import capi unsafe "hs_GeomConvert_ApproxCurve.h hs_GeomConvert_ApproxCurve_curve" rawCurve :: Ptr ApproxCurve -> IO (Ptr (Handle Geom.BSplineCurve))

curve :: Ptr ApproxCurve -> Acquire (Ptr (Handle Geom.BSplineCurve))
curve :: Ptr ApproxCurve -> Acquire (Ptr (Handle BSplineCurve))
curve Ptr ApproxCurve
approxCurve = IO (Ptr (Handle BSplineCurve))
-> (Ptr (Handle BSplineCurve) -> IO ())
-> Acquire (Ptr (Handle BSplineCurve))
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire (Ptr ApproxCurve -> IO (Ptr (Handle BSplineCurve))
rawCurve Ptr ApproxCurve
approxCurve) Ptr (Handle BSplineCurve) -> IO ()
deleteHandleBSplineCurve

foreign import capi unsafe "hs_GeomConvert_ApproxCurve.h hs_GeomConvert_ApproxCurve_isDone" rawIsDone :: Ptr ApproxCurve -> IO (CBool)

isDone :: Ptr ApproxCurve -> IO Bool
isDone :: Ptr ApproxCurve -> IO Bool
isDone Ptr ApproxCurve
approxCurve = CBool -> Bool
cBoolToBool (CBool -> Bool) -> IO CBool -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr ApproxCurve -> IO CBool
rawIsDone Ptr ApproxCurve
approxCurve


foreign import capi unsafe "hs_GeomConvert_ApproxCurve.h hs_GeomConvert_ApproxCurve_hasResult" rawHasResult :: Ptr ApproxCurve -> IO (CBool)

hasResult :: Ptr ApproxCurve -> IO Bool
hasResult :: Ptr ApproxCurve -> IO Bool
hasResult Ptr ApproxCurve
approxCurve = CBool -> Bool
cBoolToBool (CBool -> Bool) -> IO CBool -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr ApproxCurve -> IO CBool
rawHasResult Ptr ApproxCurve
approxCurve