{-# LINE 1 "src/Data/Number/Flint/NF/Fmpzi/FFI.hsc" #-}
module Data.Number.Flint.NF.Fmpzi.FFI (
Fmpzi (..)
, CFmpzi (..)
, newFmpzi
, newFmpzi_
, withFmpzi
, withNewFmpzi
, withFmpziReal
, withFmpziImag
, fmpzi_init
, fmpzi_clear
, fmpzi_swap
, fmpzi_zero
, fmpzi_one
, fmpzi_set
, fmpzi_set_si_si
, fmpzi_get_str
, fmpzi_fprint
, fmpzi_print
, fmpzi_randtest
, fmpzi_equal
, fmpzi_is_zero
, fmpzi_is_one
, fmpzi_is_unit
, fmpzi_canonical_unit_i_pow
, fmpzi_canonicalise_unit
, fmpzi_bits
, fmpzi_norm
, fmpzi_conj
, fmpzi_neg
, fmpzi_add
, fmpzi_sub
, fmpzi_sqr
, fmpzi_mul
, fmpzi_pow_ui
, fmpzi_divexact
, fmpzi_divrem
, fmpzi_divrem_approx
, fmpzi_remove_one_plus_i
, fmpzi_gcd_euclidean
) where
import Control.Monad
import Foreign.C.String
import Foreign.C.Types
import qualified Foreign.Concurrent
import Foreign.ForeignPtr
import Foreign.Ptr ( Ptr, FunPtr, plusPtr, castPtr )
import Foreign.Storable
import Foreign.Marshal ( free )
import Foreign.Marshal.Array ( advancePtr )
import Data.Number.Flint.Flint
import Data.Number.Flint.Fmpz
data Fmpzi = Fmpzi {-# UNPACK #-} !(ForeignPtr CFmpzi)
data CFmpzi = CFmpzi CFmpz CFmpz
instance Storable CFmpzi where
{-# INLINE sizeOf #-}
sizeOf :: CFmpzi -> Int
sizeOf CFmpzi
_ = (Int
16)
{-# LINE 86 "src/Data/Number/Flint/NF/Fmpzi/FFI.hsc" #-}
{-# INLINE alignment #-}
alignment :: CFmpzi -> Int
alignment CFmpzi
_ = Int
8
{-# LINE 88 "src/Data/Number/Flint/NF/Fmpzi/FFI.hsc" #-}
peek = undefined
poke :: Ptr CFmpzi -> CFmpzi -> IO ()
poke = forall a. HasCallStack => a
undefined
newFmpzi :: IO Fmpzi
newFmpzi = do
ForeignPtr CFmpzi
x <- forall a. Storable a => IO (ForeignPtr a)
mallocForeignPtr
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CFmpzi
x Ptr CFmpzi -> IO ()
fmpzi_init
forall a. FinalizerPtr a -> ForeignPtr a -> IO ()
addForeignPtrFinalizer FunPtr (Ptr CFmpzi -> IO ())
p_fmpzi_clear ForeignPtr CFmpzi
x
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ ForeignPtr CFmpzi -> Fmpzi
Fmpzi ForeignPtr CFmpzi
x
newFmpzi_ :: CLong -> CLong -> IO Fmpzi
newFmpzi_ CLong
a CLong
b = do
ForeignPtr CFmpzi
x <- forall a. Storable a => IO (ForeignPtr a)
mallocForeignPtr
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CFmpzi
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzi
x -> do
Ptr CFmpzi -> IO ()
fmpzi_init Ptr CFmpzi
x
Ptr CFmpzi -> CLong -> CLong -> IO ()
fmpzi_set_si_si Ptr CFmpzi
x CLong
a CLong
b
forall a. FinalizerPtr a -> ForeignPtr a -> IO ()
addForeignPtrFinalizer FunPtr (Ptr CFmpzi -> IO ())
p_fmpzi_clear ForeignPtr CFmpzi
x
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ ForeignPtr CFmpzi -> Fmpzi
Fmpzi ForeignPtr CFmpzi
x
{-# INLINE withFmpzi #-}
withFmpzi :: Fmpzi -> (Ptr CFmpzi -> IO a) -> IO (Fmpzi, a)
withFmpzi (Fmpzi ForeignPtr CFmpzi
x) Ptr CFmpzi -> IO a
f = do
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CFmpzi
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzi
p -> Ptr CFmpzi -> IO a
f Ptr CFmpzi
p forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ForeignPtr CFmpzi -> Fmpzi
Fmpzi ForeignPtr CFmpzi
x,)
{-# INLINE withFmpziReal #-}
withFmpziReal :: Fmpzi -> (Ptr b -> IO a) -> IO (Fmpzi, a)
withFmpziReal (Fmpzi ForeignPtr CFmpzi
x) Ptr b -> IO a
f = do
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CFmpzi
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzi
p -> (ForeignPtr CFmpzi -> Fmpzi
Fmpzi ForeignPtr CFmpzi
x,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr b -> IO a
f (forall a b. Ptr a -> Ptr b
castPtr Ptr CFmpzi
p)
{-# INLINE withFmpziImag #-}
withFmpziImag :: Fmpzi -> (Ptr a -> IO a) -> IO (Fmpzi, a)
withFmpziImag (Fmpzi ForeignPtr CFmpzi
x) Ptr a -> IO a
f = do
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CFmpzi
x forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzi
p -> (ForeignPtr CFmpzi -> Fmpzi
Fmpzi ForeignPtr CFmpzi
x,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr a -> IO a
f (forall a b. Ptr a -> Ptr b
castPtr Ptr CFmpzi
p forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` Int
1)
{-# INLINE withNewFmpzi #-}
withNewFmpzi :: (Ptr CFmpzi -> IO a) -> IO (Fmpzi, a)
withNewFmpzi Ptr CFmpzi -> IO a
f = do
Fmpzi
x <- IO Fmpzi
newFmpzi
forall {a}. Fmpzi -> (Ptr CFmpzi -> IO a) -> IO (Fmpzi, a)
withFmpzi Fmpzi
x Ptr CFmpzi -> IO a
f
foreign import ccall "fmpzi.h fmpzi_init"
fmpzi_init :: Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_clear"
fmpzi_clear :: Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h &fmpzi_clear"
p_fmpzi_clear :: FunPtr (Ptr CFmpzi -> IO ())
foreign import ccall "fmpzi.h fmpzi_swap"
fmpzi_swap :: Ptr CFmpzi -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_zero"
fmpzi_zero :: Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_one"
fmpzi_one :: Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_set"
fmpzi_set :: Ptr CFmpzi -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_set_si_si"
fmpzi_set_si_si :: Ptr CFmpzi -> CLong -> CLong -> IO ()
foreign import ccall "fmpzi.h fmpzi_get_str"
fmpzi_get_str :: Ptr CFmpzi -> IO CString
foreign import ccall "fmpzi.h fmpzi_fprint"
fmpzi_fprint :: Ptr CFile -> Ptr CFmpzi -> IO ()
fmpzi_print :: Ptr CFmpzi -> IO ()
fmpzi_print :: Ptr CFmpzi -> IO ()
fmpzi_print Ptr CFmpzi
z = do
forall a. (Ptr a -> IO CString) -> Ptr a -> IO CInt
printCStr Ptr CFmpzi -> IO CString
fmpzi_get_str Ptr CFmpzi
z
forall (m :: * -> *) a. Monad m => a -> m a
return ()
foreign import ccall "fmpzi.h fmpzi_randtest"
fmpzi_randtest :: Ptr CFmpzi -> Ptr CFRandState -> CMpBitCnt -> IO ()
foreign import ccall "fmpzi.h fmpzi_equal"
fmpzi_equal :: Ptr CFmpzi -> Ptr CFmpzi -> IO CInt
foreign import ccall "fmpzi.h fmpzi_is_zero"
fmpzi_is_zero :: Ptr CFmpzi -> IO CInt
foreign import ccall "fmpzi.h fmpzi_is_one"
fmpzi_is_one :: Ptr CFmpzi -> IO CInt
foreign import ccall "fmpzi.h fmpzi_is_unit"
fmpzi_is_unit :: Ptr CFmpzi -> IO CInt
foreign import ccall "fmpzi.h fmpzi_canonical_unit_i_pow"
fmpzi_canonical_unit_i_pow :: Ptr CFmpzi -> IO CLong
foreign import ccall "fmpzi.h fmpzi_canonicalise_unit"
fmpzi_canonicalise_unit :: Ptr CFmpzi -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_bits"
fmpzi_bits :: Ptr CFmpzi -> IO CLong
foreign import ccall "fmpzi.h fmpzi_norm"
fmpzi_norm :: Ptr CFmpz -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_conj"
fmpzi_conj :: Ptr CFmpzi -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_neg"
fmpzi_neg :: Ptr CFmpzi -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_add"
fmpzi_add :: Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_sub"
fmpzi_sub :: Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_sqr"
fmpzi_sqr :: Ptr CFmpzi -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_mul"
fmpzi_mul :: Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_pow_ui"
fmpzi_pow_ui :: Ptr CFmpzi -> Ptr CFmpzi -> CULong -> IO ()
foreign import ccall "fmpzi.h fmpzi_divexact"
fmpzi_divexact :: Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_divrem"
fmpzi_divrem :: Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_divrem_approx"
fmpzi_divrem_approx :: Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO ()
foreign import ccall "fmpzi.h fmpzi_remove_one_plus_i"
fmpzi_remove_one_plus_i :: Ptr CFmpzi -> Ptr CFmpzi -> IO CLong
foreign import ccall "fmpzi.h fmpzi_gcd_euclidean"
fmpzi_gcd_euclidean :: Ptr CFmpzi -> Ptr CFmpzi -> Ptr CFmpzi -> IO ()