{-# LINE 1 "lib/Numeric/GSL/Special/Internal.hsc" #-}
 {-# LANGUAGE ForeignFunctionInterface #-}
{-# LINE 2 "lib/Numeric/GSL/Special/Internal.hsc" #-}
-----------------------------------------------------------------------------
{- |
Module      :  Numeric.GSL.Special.Internal
Copyright   :  (c) Alberto Ruiz 2007
License     :  GPL-style

Maintainer  :  Alberto Ruiz (aruiz at um dot es)
Stability   :  provisional
Portability :  uses ffi

Support for Special functions.

<http://www.gnu.org/software/gsl/manual/html_node/Special-Functions.html#Special-Functions>
-}
-----------------------------------------------------------------------------


{-# LINE 19 "lib/Numeric/GSL/Special/Internal.hsc" #-}

{-# LINE 20 "lib/Numeric/GSL/Special/Internal.hsc" #-}

module Numeric.GSL.Special.Internal (
    createSFR,
    createSFR_E10,
    Precision(..),
    Gsl_mode_t,
    Size_t,
    precCode
)
where

import Foreign
import Data.Packed.Internal(check,(//))
import Foreign.C.Types(CSize,CInt)


data Precision = PrecDouble | PrecSingle | PrecApprox

precCode :: Precision -> Int
precCode PrecDouble = 0
precCode PrecSingle = 1
precCode PrecApprox = 2

type Gsl_mode_t = Int

type Size_t = CSize

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

data Gsl_sf_result = SF Double Double
  deriving (Show)

instance Storable Gsl_sf_result where
  sizeOf _ = (16)
{-# LINE 54 "lib/Numeric/GSL/Special/Internal.hsc" #-}
  alignment _ = 4
{-# LINE 55 "lib/Numeric/GSL/Special/Internal.hsc" #-}
  peek ptr = do
    val <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 57 "lib/Numeric/GSL/Special/Internal.hsc" #-}
    err <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 58 "lib/Numeric/GSL/Special/Internal.hsc" #-}
    return (SF val err)
  poke ptr (SF val err) = do
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr val
{-# LINE 61 "lib/Numeric/GSL/Special/Internal.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr err
{-# LINE 62 "lib/Numeric/GSL/Special/Internal.hsc" #-}


data Gsl_sf_result_e10 = SFE Double Double CInt
  deriving (Show)

instance Storable Gsl_sf_result_e10 where
  sizeOf _ = (20)
{-# LINE 69 "lib/Numeric/GSL/Special/Internal.hsc" #-}
  alignment _ = 4
{-# LINE 70 "lib/Numeric/GSL/Special/Internal.hsc" #-}
  peek ptr = do
    val <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 72 "lib/Numeric/GSL/Special/Internal.hsc" #-}
    err <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 73 "lib/Numeric/GSL/Special/Internal.hsc" #-}
    e10 <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) ptr
{-# LINE 74 "lib/Numeric/GSL/Special/Internal.hsc" #-}
    return (SFE val err e10)
  poke ptr (SFE val err e10) = do
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr val
{-# LINE 77 "lib/Numeric/GSL/Special/Internal.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr err
{-# LINE 78 "lib/Numeric/GSL/Special/Internal.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 16)) ptr e10
{-# LINE 79 "lib/Numeric/GSL/Special/Internal.hsc" #-}


----------------------------------------------------------------
-- | access to a sf_result
createSFR :: String -> (Ptr a -> IO CInt) -> (Double, Double)
createSFR s f = unsafePerformIO $ do
    p <- malloc :: IO (Ptr Gsl_sf_result)
    f (castPtr p) // check s
    SF val err <- peek p
    free p
    return (val,err)


---------------------------------------------------------------------
-- the sf_result_e10 contains two doubles and the exponent

-- | access to sf_result_e10
createSFR_E10 :: String -> (Ptr a -> IO CInt) -> (Double, Int, Double)
createSFR_E10 s f = unsafePerformIO $ do
    p <- malloc :: IO (Ptr Gsl_sf_result_e10)
    f (castPtr p) // check s
    SFE val err expo  <- peek p
    free p
    return (val, fromIntegral expo,err)