module Data.Repa.Flow.IO.Storable
( Storable (..)
, Spec (..))
where
import Data.Repa.Array.Meta as A
import Data.Repa.Array.Generic as A
import Data.Repa.Array.Material as A
import Data.Repa.Array.Material.Foreign as AF
import Data.Repa.Array.Material.Strided as AS
import Data.Repa.Flow.IO.Bucket as F
import qualified Foreign.Storable as S
import Data.Int
#include "repa-flow.h"
class Bulk (Rep a) a
=> Storable a where
data Spec a
type Rep a
sizeElem :: Spec a -> Int
getArray
:: Spec a
-> Integer
-> Bucket
-> IO (Maybe (Array (Rep a) a))
instance Storable Int32 where
data Spec Int32 = SInt32
type Rep Int32 = F
sizeElem SInt32 = 4
getArray SInt32 lenElems bucket
= do let bytesElem = sizeElem SInt32
arr8 <- bGetArray bucket (lenElems * fromIntegral bytesElem)
let (startBytes, lenBytes, fptrBuf)
= AF.toForeignPtr arr8
let lenElems' = lenBytes `div` sizeElem SInt32
if (startBytes /= 0)
|| (lenBytes `mod` bytesElem /= 0)
then return Nothing
else return $ Just
$ AF.unsafeCast
$ AF.fromForeignPtr lenElems' fptrBuf
instance
( Storable a, Storable b
, S.Storable a, S.Storable b)
=> Storable (a, b) where
data Spec (a, b) = S2 (Spec a) (Spec b)
type Rep (a, b) = T2 S S
sizeElem (S2 sA sB)
= sizeElem sA + sizeElem sB
getArray (S2 sA sB) lenElems bucket
= do let bytesA = sizeElem sA
let bytesB = sizeElem sB
let bytesTuple = bytesA + bytesB
let lenBytes = lenElems * fromIntegral bytesTuple
arr8 <- bGetArray bucket lenBytes
let lenBytes' = A.length arr8
let lenElems' = lenBytes' `div` bytesTuple
if lenBytes' `mod` bytesTuple /= 0
then return Nothing
else do
let (startBuf, _lenBuf, fptrBuf)
= AF.toForeignPtr arr8
let arrA = AS.unsafeCast
$ AS.fromForeignPtr
startBuf
bytesTuple (fromIntegral lenElems') fptrBuf
let arrB = AS.unsafeCast
$ AS.fromForeignPtr
(startBuf + bytesA)
bytesTuple (fromIntegral lenElems') fptrBuf
return $ Just $ T2Array arrA arrB