{-# LINE 1 "lib/Deka/Internal/Mpdec.hsc" #-}
{-# LANGUAGE EmptyDataDecls, Safe #-}
{-# LINE 2 "lib/Deka/Internal/Mpdec.hsc" #-}
{-# LANGUAGE OverloadedStrings #-}

{-# LINE 4 "lib/Deka/Internal/Mpdec.hsc" #-}


{-# LINE 6 "lib/Deka/Internal/Mpdec.hsc" #-}

module Deka.Internal.Mpdec
  ( 
   -- * Context
    Signed
  , Unsigned
  , C'mpd_context_t
  , c'MPD_VERSION
  , c'MPD_SSIZE_MAX
  , c'MPD_SSIZE_MIN
  , c'MPD_MAX_PREC
  , c'MPD_MAX_EMAX
  , c'MPD_MIN_EMIN
  , c'MPD_ROUND_UP
  , c'MPD_ROUND_DOWN
  , c'MPD_ROUND_CEILING
  , c'MPD_ROUND_FLOOR
  , c'MPD_ROUND_HALF_UP
  , c'MPD_ROUND_HALF_DOWN
  , c'MPD_ROUND_HALF_EVEN
  , c'MPD_ROUND_05UP
  , c'MPD_ROUND_TRUNC
  , c'mpd_context_t'sizeOf
  , p'mpd_context_t'prec
  , p'mpd_context_t'emax
  , p'mpd_context_t'emin
  , p'mpd_context_t'traps
  , p'mpd_context_t'status
  , p'mpd_context_t'newtrap
  , p'mpd_context_t'round
  , p'mpd_context_t'clamp
  , p'mpd_context_t'allcr
  , c'MPD_Clamped
  , c'MPD_Conversion_syntax
  , c'MPD_Division_by_zero
  , c'MPD_Division_impossible
  , c'MPD_Division_undefined
  , c'MPD_Fpu_error
  , c'MPD_Inexact
  , c'MPD_Invalid_context
  , c'MPD_Invalid_operation
  , c'MPD_Malloc_error
  , c'MPD_Not_implemented
  , c'MPD_Overflow
  , c'MPD_Rounded
  , c'MPD_Subnormal
  , c'MPD_Underflow
  , c'mpd_maxcontext
  , c'mpd_defaultcontext
  , c'mpd_basiccontext
  , c'mpd_ieee_context

  -- * Mpdec
  , CMpd
  , Mpd
  , Dec
  , withDec
  , newDec
  , newDec2
  , c'divmod
  , c'mpd_fma
  , c'mpd_powmod
  , c'mpd_adjexp
  , capitalize
  , c'mpd_to_sci
  , c'mpd_to_eng
  , c'mpd_set_string
  , c'mpd_compare_total
  , c'mpd_cmp_total
  , c'mpd_compare_total_mag
  , c'mpd_cmp_total_mag
  , c'mpd_same_quantum
  , c'mpd_class
  , c'mpd_isnormal
  , c'mpd_issubnormal
  , c'mpd_sign
  , c'mpd_arith_sign
  , c'mpd_trail_zeros
  , c'mpd_del
  , c'mpd_copy
  , c'mpd_copy_abs
  , c'mpd_copy_negate
  , c'mpd_invert
  , c'mpd_logb
  , c'mpd_abs
  , c'mpd_exp
  , c'mpd_ln
  , c'mpd_log10
  , c'mpd_minus
  , c'mpd_next_minus
  , c'mpd_next_plus
  , c'mpd_plus
  , c'mpd_reduce
  , c'mpd_round_to_intx
  , c'mpd_round_to_int
  , c'mpd_trunc
  , c'mpd_floor
  , c'mpd_ceil
  , c'mpd_sqrt
  , c'mpd_invroot
  , c'mpd_and
  , c'mpd_copy_sign
  , c'mpd_or
  , c'mpd_rotate
  , c'mpd_scaleb
  , c'mpd_shift
  , c'mpd_xor
  , c'mpd_compare
  , c'mpd_compare_signal
  , c'mpd_add
  , c'mpd_sub
  , c'mpd_div
  , c'mpd_divint
  , c'mpd_max
  , c'mpd_max_mag
  , c'mpd_min
  , c'mpd_min_mag
  , c'mpd_mul
  , c'mpd_next_toward
  , c'mpd_pow
  , c'mpd_quantize
  , c'mpd_rescale
  , c'mpd_rem
  , c'mpd_rem_near
  , c'mpd_isfinite
  , c'mpd_isinfinite
  , c'mpd_isinteger
  , c'mpd_isnan
  , c'mpd_isnegative
  , c'mpd_ispositive
  , c'mpd_isqnan
  , c'mpd_issnan
  , c'mpd_issigned
  , c'mpd_isspecial
  , c'mpd_iszero
  , c'mpd_iszerocoeff
  , c'mpd_isoddcoeff
  , c'mpd_isodd
  , c'mpd_iseven
  ) where

import Foreign.Safe
import Foreign.C
import Control.Monad
import Data.String

c'MPD_VERSION :: IsString a => a
c'MPD_VERSION = "2.4.0"
{-# LINE 154 "lib/Deka/Internal/Mpdec.hsc" #-}

-- | An unsigned integer.  Its size is platform dependent.
type Unsigned = Word64
{-# LINE 157 "lib/Deka/Internal/Mpdec.hsc" #-}

-- | A signed integer.  Its size is platform dependent.
type Signed = Int64
{-# LINE 160 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_SSIZE_MAX :: Signed
c'MPD_SSIZE_MAX = 9223372036854775807
{-# LINE 163 "lib/Deka/Internal/Mpdec.hsc" #-}

-- Must convert the constant to an Integer first; it will overflow
-- otherwise.  GHC's NegativeLiterals extension solves this problem,
-- but it is not available on GHC < 7.8.
c'MPD_SSIZE_MIN :: Signed
c'MPD_SSIZE_MIN = fromInteger $ -9223372036854775808
{-# LINE 169 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_MAX_PREC :: Signed
c'MPD_MAX_PREC = 999999999999999999
{-# LINE 172 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_MAX_EMAX :: Signed
c'MPD_MAX_EMAX = 999999999999999999
{-# LINE 175 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_MIN_EMIN :: Signed
c'MPD_MIN_EMIN = -999999999999999999
{-# LINE 178 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_ROUND_UP :: CInt
c'MPD_ROUND_UP = 0
{-# LINE 181 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_ROUND_DOWN :: CInt
c'MPD_ROUND_DOWN = 1
{-# LINE 184 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_ROUND_CEILING :: CInt
c'MPD_ROUND_CEILING = 2
{-# LINE 187 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_ROUND_FLOOR :: CInt
c'MPD_ROUND_FLOOR = 3
{-# LINE 190 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_ROUND_HALF_UP :: CInt
c'MPD_ROUND_HALF_UP = 4
{-# LINE 193 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_ROUND_HALF_DOWN :: CInt
c'MPD_ROUND_HALF_DOWN = 5
{-# LINE 196 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_ROUND_HALF_EVEN :: CInt
c'MPD_ROUND_HALF_EVEN = 6
{-# LINE 199 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_ROUND_05UP :: CInt
c'MPD_ROUND_05UP = 7
{-# LINE 202 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_ROUND_TRUNC :: CInt
c'MPD_ROUND_TRUNC = 8
{-# LINE 205 "lib/Deka/Internal/Mpdec.hsc" #-}

data C'mpd_context_t

c'mpd_context_t'sizeOf :: Int
c'mpd_context_t'sizeOf = (48)
{-# LINE 210 "lib/Deka/Internal/Mpdec.hsc" #-}

p'mpd_context_t'prec :: Ptr C'mpd_context_t -> Ptr Signed
p'mpd_context_t'prec = (\hsc_ptr -> hsc_ptr `plusPtr` 0)
{-# LINE 213 "lib/Deka/Internal/Mpdec.hsc" #-}

p'mpd_context_t'emax :: Ptr C'mpd_context_t -> Ptr Signed
p'mpd_context_t'emax = (\hsc_ptr -> hsc_ptr `plusPtr` 8)
{-# LINE 216 "lib/Deka/Internal/Mpdec.hsc" #-}

p'mpd_context_t'emin :: Ptr C'mpd_context_t -> Ptr Signed
p'mpd_context_t'emin = (\hsc_ptr -> hsc_ptr `plusPtr` 16)
{-# LINE 219 "lib/Deka/Internal/Mpdec.hsc" #-}

p'mpd_context_t'traps :: Ptr C'mpd_context_t -> Ptr Word32
p'mpd_context_t'traps = (\hsc_ptr -> hsc_ptr `plusPtr` 24)
{-# LINE 222 "lib/Deka/Internal/Mpdec.hsc" #-}

p'mpd_context_t'status :: Ptr C'mpd_context_t -> Ptr Word32
p'mpd_context_t'status = (\hsc_ptr -> hsc_ptr `plusPtr` 28)
{-# LINE 225 "lib/Deka/Internal/Mpdec.hsc" #-}

p'mpd_context_t'newtrap :: Ptr C'mpd_context_t -> Ptr Word32
p'mpd_context_t'newtrap = (\hsc_ptr -> hsc_ptr `plusPtr` 32)
{-# LINE 228 "lib/Deka/Internal/Mpdec.hsc" #-}

p'mpd_context_t'round :: Ptr C'mpd_context_t -> Ptr CInt
p'mpd_context_t'round = (\hsc_ptr -> hsc_ptr `plusPtr` 36)
{-# LINE 231 "lib/Deka/Internal/Mpdec.hsc" #-}

p'mpd_context_t'clamp :: Ptr C'mpd_context_t -> Ptr CInt
p'mpd_context_t'clamp = (\hsc_ptr -> hsc_ptr `plusPtr` 40)
{-# LINE 234 "lib/Deka/Internal/Mpdec.hsc" #-}

p'mpd_context_t'allcr :: Ptr C'mpd_context_t -> Ptr CInt
p'mpd_context_t'allcr = (\hsc_ptr -> hsc_ptr `plusPtr` 44)
{-# LINE 237 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Clamped :: Word32
c'MPD_Clamped = 1
{-# LINE 240 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Conversion_syntax :: Word32
c'MPD_Conversion_syntax = 2
{-# LINE 243 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Division_by_zero :: Word32
c'MPD_Division_by_zero = 4
{-# LINE 246 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Division_impossible :: Word32
c'MPD_Division_impossible = 8
{-# LINE 249 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Division_undefined :: Word32
c'MPD_Division_undefined = 16
{-# LINE 252 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Fpu_error :: Word32
c'MPD_Fpu_error = 32
{-# LINE 255 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Inexact :: Word32
c'MPD_Inexact = 64
{-# LINE 258 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Invalid_context :: Word32
c'MPD_Invalid_context = 128
{-# LINE 261 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Invalid_operation :: Word32
c'MPD_Invalid_operation = 256
{-# LINE 264 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Malloc_error :: Word32
c'MPD_Malloc_error = 512
{-# LINE 267 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Not_implemented :: Word32
c'MPD_Not_implemented = 1024
{-# LINE 270 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Overflow :: Word32
c'MPD_Overflow = 2048
{-# LINE 273 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Rounded :: Word32
c'MPD_Rounded = 4096
{-# LINE 276 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Subnormal :: Word32
c'MPD_Subnormal = 8192
{-# LINE 279 "lib/Deka/Internal/Mpdec.hsc" #-}

c'MPD_Underflow :: Word32
c'MPD_Underflow = 16384
{-# LINE 282 "lib/Deka/Internal/Mpdec.hsc" #-}

foreign import ccall unsafe "mpd_maxcontext" c'mpd_maxcontext
  :: Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_defaultcontext" c'mpd_defaultcontext
  :: Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_basiccontext" c'mpd_basiccontext
  :: Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_ieee_context" c'mpd_ieee_context
  :: Ptr C'mpd_context_t
  -> CInt
  -> IO CInt

--
-- mpd_t
--

data C'mpd_t

newtype CMpd = CMpd { _unCMpd :: Ptr C'mpd_t }
newtype Mpd = Mpd { unMpd :: Ptr C'mpd_t }

-- | A decimal value.  A decimal consists of:
--
-- * an integral /coefficient/,
--
-- * an /exponent/, and
--
-- * a /sign/.
--
-- A decimal may also be a /special value/, which can be:
--
-- * /NaN/ (Not a Number), which may be either /quiet/
-- (propagates quietly through operations) or /signaling/ (raises
-- the /Invalid operation/ condition when encountered), or
--
-- * /Infinity/, either positive or negative.

newtype Dec = Dec { _unDec :: ForeignPtr C'mpd_t }

withDec :: Dec -> (CMpd -> IO a) -> IO a
withDec (Dec fp) f =
  withForeignPtr fp $ \ptr ->
  f (CMpd ptr)

-- Irregular arithmetics

foreign import ccall unsafe "mpd_divmod" c'divmod
  :: Mpd
  -> Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_fma" c'mpd_fma
  :: Mpd
  -> CMpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_powmod" c'mpd_powmod
  :: Mpd
  -> CMpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_adjexp" c'mpd_adjexp
  :: CMpd
  -> IO Signed

-- Output to string

foreign import ccall unsafe "mpd_to_sci" c'mpd_to_sci
  :: CMpd
  -> CInt
  -> IO (Ptr CChar)

-- | Set to 1 to capitalize the exponent character; otherwise, if it
-- is 0, the exponent character is lower case.
capitalize :: CInt
capitalize = 1

foreign import ccall unsafe "mpd_to_eng" c'mpd_to_eng
  :: CMpd
  -> CInt
  -> IO (Ptr CChar)

foreign import ccall unsafe "mpd_set_string" c'mpd_set_string
  :: Mpd
  -> Ptr CChar
  -> Ptr C'mpd_context_t
  -> IO ()

-- comparisons

-- compare_total is context free
foreign import ccall unsafe "mpd_compare_total" c'mpd_compare_total
  :: Mpd
  -> CMpd
  -> CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_cmp_total" c'mpd_cmp_total
  :: CMpd
  -> CMpd
  -> IO CInt

-- total_mag is context free
foreign import ccall unsafe "mpd_compare_total_mag" c'mpd_compare_total_mag
  :: Mpd
  -> CMpd
  -> CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_cmp_total_mag" c'mpd_cmp_total_mag
  :: CMpd
  -> CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_same_quantum" c'mpd_same_quantum
  :: CMpd
  -> CMpd
  -> IO CInt

-- Tests

foreign import ccall unsafe "mpd_class" c'mpd_class
  :: CMpd
  -> Ptr C'mpd_context_t
  -> IO (Ptr CChar)

foreign import ccall unsafe "mpd_isnormal" c'mpd_isnormal
  :: CMpd
  -> Ptr C'mpd_context_t
  -> IO CInt

foreign import ccall unsafe "mpd_issubnormal" c'mpd_issubnormal
  :: CMpd
  -> Ptr C'mpd_context_t
  -> IO CInt

foreign import ccall unsafe "mpd_sign" c'mpd_sign
  :: CMpd
  -> IO Word8

foreign import ccall unsafe "mpd_arith_sign" c'mpd_arith_sign
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_trail_zeros" c'mpd_trail_zeros
  :: CMpd
  -> IO Signed

-- Memory handling
foreign import ccall unsafe "mpd_qnew" c'mpd_qnew
  :: IO (Mpd)

newDec :: (Mpd -> IO ()) -> IO Dec
newDec f = do
  p <- c'mpd_qnew
  when (unMpd p == nullPtr) $ error "newMpd: failure"
  fp <- newForeignPtr fp'mpd_del (unMpd p)
  withForeignPtr fp $ \x1 ->
    f (Mpd x1)
  return $ Dec fp

newDec2 :: (Mpd -> Mpd -> IO ()) -> IO (Dec, Dec)
newDec2 f = do
  p1 <- c'mpd_qnew
  when (unMpd p1 == nullPtr) $ error "newMpd: failure"
  p2 <- c'mpd_qnew
  when (unMpd p2 == nullPtr) $ error "newMpd: failure"
  fp1 <- newForeignPtr fp'mpd_del (unMpd p1)
  fp2 <- newForeignPtr fp'mpd_del (unMpd p2)
  withForeignPtr fp1 $ \x1 ->
    withForeignPtr fp2 $ \x2 ->
    f (Mpd x1) (Mpd x2)
  return (Dec fp1, Dec fp2)


foreign import ccall unsafe "mpd_del" c'mpd_del
  :: Mpd
  -> IO ()

foreign import ccall unsafe "&mpd_del" fp'mpd_del
  :: FunPtr (Ptr C'mpd_t -> IO ())

-- Imported from mkmpd

foreign import ccall unsafe "mpd_copy" c'mpd_copy
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_copy_abs" c'mpd_copy_abs
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_copy_negate" c'mpd_copy_negate
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_invert" c'mpd_invert
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_logb" c'mpd_logb
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_abs" c'mpd_abs
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_exp" c'mpd_exp
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_ln" c'mpd_ln
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_log10" c'mpd_log10
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_minus" c'mpd_minus
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_next_minus" c'mpd_next_minus
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_next_plus" c'mpd_next_plus
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_plus" c'mpd_plus
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_reduce" c'mpd_reduce
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_round_to_intx" c'mpd_round_to_intx
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_round_to_int" c'mpd_round_to_int
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_trunc" c'mpd_trunc
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_floor" c'mpd_floor
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_ceil" c'mpd_ceil
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_sqrt" c'mpd_sqrt
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_invroot" c'mpd_invroot
  :: Mpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()


foreign import ccall unsafe "mpd_and" c'mpd_and
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_copy_sign" c'mpd_copy_sign
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_or" c'mpd_or
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_rotate" c'mpd_rotate
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_scaleb" c'mpd_scaleb
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_shift" c'mpd_shift
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_xor" c'mpd_xor
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_compare" c'mpd_compare
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_compare_signal" c'mpd_compare_signal
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_add" c'mpd_add
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_sub" c'mpd_sub
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_div" c'mpd_div
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_divint" c'mpd_divint
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_max" c'mpd_max
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_max_mag" c'mpd_max_mag
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_min" c'mpd_min
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_min_mag" c'mpd_min_mag
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_mul" c'mpd_mul
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_next_toward" c'mpd_next_toward
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_pow" c'mpd_pow
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_quantize" c'mpd_quantize
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_rescale" c'mpd_rescale
  :: Mpd
  -> CMpd
  -> Signed
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_rem" c'mpd_rem
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_rem_near" c'mpd_rem_near
  :: Mpd
  -> CMpd
  -> CMpd
  -> Ptr C'mpd_context_t
  -> IO ()

foreign import ccall unsafe "mpd_isfinite" c'mpd_isfinite
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_isinfinite" c'mpd_isinfinite
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_isinteger" c'mpd_isinteger
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_isnan" c'mpd_isnan
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_isnegative" c'mpd_isnegative
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_ispositive" c'mpd_ispositive
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_isqnan" c'mpd_isqnan
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_issnan" c'mpd_issnan
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_issigned" c'mpd_issigned
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_isspecial" c'mpd_isspecial
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_iszero" c'mpd_iszero
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_iszerocoeff" c'mpd_iszerocoeff
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_isoddcoeff" c'mpd_isoddcoeff
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_isodd" c'mpd_isodd
  :: CMpd
  -> IO CInt

foreign import ccall unsafe "mpd_iseven" c'mpd_iseven
  :: CMpd
  -> IO CInt

-- Handlers