module Data.Repa.IO.Convert
(
readDouble, readDoubleFromBytes
, showDouble, showDoubleAsBytes
, showDoubleFixed, showDoubleFixedAsBytes)
where
import Data.Repa.Array.Material.Foreign as A
import Data.Repa.Array as A
import System.IO.Unsafe
import Data.Word
import Data.Char
import GHC.Ptr
import qualified Foreign.ForeignPtr as F
import qualified Foreign.Storable as F
import qualified Foreign.Marshal.Alloc as F
import qualified Foreign.Marshal.Utils as F
import qualified Data.Double.Conversion.ByteString as DC
readDouble :: Array F Char -> Double
readDouble vec
= readDoubleFromBytes
$ A.computeS F $ A.map (fromIntegral . ord) vec
readDoubleFromBytes :: Array F Word8 -> Double
readDoubleFromBytes (toForeignPtr -> (start,len,fptr))
= unsafePerformIO
$ F.allocaBytes (len + 1) $ \pBuf ->
F.alloca $ \pRes ->
F.withForeignPtr fptr $ \pIn ->
do
F.copyBytes pBuf (pIn `plusPtr` start) (fromIntegral len)
F.pokeByteOff pBuf len (0 :: Word8)
let !d = strtod pBuf pRes
return d
foreign import ccall unsafe
strtod :: Ptr Word8 -> Ptr (Ptr Word8) -> Double
showDouble :: Double -> Array F Char
showDouble !d
= A.computeS F $ A.map (chr . fromIntegral)
$ showDoubleAsBytes d
showDoubleAsBytes :: Double -> Array F Word8
showDoubleAsBytes !d
= fromByteString $ DC.toShortest d
showDoubleFixed :: Int -> Double -> Array F Char
showDoubleFixed !prec !d
= A.computeS F $ A.map (chr . fromIntegral)
$ showDoubleFixedAsBytes prec d
showDoubleFixedAsBytes :: Int -> Double -> Array F Word8
showDoubleFixedAsBytes !prec !d
= fromByteString $ DC.toFixed prec d