module Data.Repa.Array.Material.Auto.InstBox where
import Data.Repa.Array.Material.Auto.Base as A
import Data.Repa.Array.Material.Boxed as A
import Data.Repa.Array.Meta.Window as A
import Data.Repa.Array.Internals.Bulk as A
import Data.Repa.Array.Internals.Target as A
import Data.Repa.Array.Internals.Layout as A
import Data.Repa.Scalar.Box
import Control.Monad
#include "repa-array.h"
instance Bulk B a => Bulk A (Box a) where
data Array A (Box a) = AArray_Box !(Array B a)
layout (AArray_Box arr) = Auto (A.length arr)
index (AArray_Box arr) !ix = Box (A.index arr ix)
deriving instance Show a => Show (Array A (Box a))
instance Bulk B a => Windowable A (Box a) where
window st len (AArray_Box arr)
= AArray_Box (window st len arr)
instance Target B a => Target A (Box a) where
data Buffer A (Box a)
= ABuffer_Box !(Buffer B a)
unsafeNewBuffer (Auto len)
= liftM ABuffer_Box $ unsafeNewBuffer (Boxed len)
unsafeReadBuffer (ABuffer_Box arr) ix
= do x <- unsafeReadBuffer arr ix
return $ Box x
unsafeWriteBuffer (ABuffer_Box arr) ix (Box x)
= x `seq` unsafeWriteBuffer arr ix x
unsafeGrowBuffer (ABuffer_Box arr) bump
= liftM ABuffer_Box $ unsafeGrowBuffer arr bump
unsafeFreezeBuffer (ABuffer_Box arr)
= liftM AArray_Box $ unsafeFreezeBuffer arr
unsafeThawBuffer (AArray_Box arr)
= liftM ABuffer_Box $ unsafeThawBuffer arr
unsafeSliceBuffer st len (ABuffer_Box buf)
= liftM ABuffer_Box $ unsafeSliceBuffer st len buf
touchBuffer (ABuffer_Box buf)
= touchBuffer buf
bufferLayout (ABuffer_Box buf)
= Auto $ A.extent $ bufferLayout buf
instance Eq a
=> Eq (Array A (Box a)) where
(==) (AArray_Box arr1) (AArray_Box arr2) = arr1 == arr2