{-# LINE 1 "src/Data/Number/Flint/Flint/Internal/FFI.hsc" #-}
{-|
module      :  Data.Number.Flint.Flint.Internal.FFI
copyright   :  (c) 2022 Hartmut Monien
license     :  GNU GPL, version 2 or above (see LICENSE)
maintainer  :  hmonien@uni-bonn.de
-}
module Data.Number.Flint.Flint.Internal.FFI (
    Flint (..)
  , CFlint (..)
  , printCStr
  , printCVec
  , CFBitCnt
) where

import Foreign.C.String (CString (..), peekCString)
import Foreign.C.Types
import Foreign.Marshal.Alloc (free)
import Foreign.Marshal.Array (advancePtr)
import Foreign.ForeignPtr 
import Foreign.Ptr 
import Foreign.Storable

import Control.Monad
import Data.Word





class Flint a where
  data CFlint a :: *

-- output ----------------------------------------------------------------------

printCStr :: (Ptr a -> IO CString) -> Ptr a -> IO CInt
printCStr :: forall a. (Ptr a -> IO CString) -> Ptr a -> IO CInt
printCStr Ptr a -> IO CString
f Ptr a
x = do
  CString
cs <- Ptr a -> IO CString
f Ptr a
x
  String
s <- CString -> IO String
peekCString CString
cs
  CString -> IO ()
forall a. Ptr a -> IO ()
free CString
cs
  String -> IO ()
putStr String
s
  CInt -> IO CInt
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return CInt
1

printCVec :: Storable a => (Ptr a -> IO CInt) -> Ptr a -> CLong -> IO CInt
printCVec :: forall a.
Storable a =>
(Ptr a -> IO CInt) -> Ptr a -> CLong -> IO CInt
printCVec Ptr a -> IO CInt
f Ptr a
vec CLong
len = do
  String -> IO ()
putStr (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ CLong -> String
forall a. Show a => a -> String
show CLong
len String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"  "
  [Int] -> (Int -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [Int
0..CLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CLong
len Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1] ((Int -> IO ()) -> IO ()) -> (Int -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Int
j -> do
    Ptr a -> IO CInt
f (Ptr a
vec Ptr a -> Int -> Ptr a
forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` Int
j)
    String -> IO ()
putStr String
" "
  CInt -> IO CInt
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return CInt
1

--------------------------------------------------------------------------------

type CFBitCnt = Word64
{-# LINE 54 "src/Data/Number/Flint/Flint/Internal/FFI.hsc" #-}