From: sof Date: Tue, 2 Feb 1999 13:21:59 +0000 (+0000) Subject: [project @ 1999-02-02 13:21:59 by sof] X-Git-Tag: Approximately_9120_patches~6640 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=d1d2c1d2585d7dd9038b356d84e6d7f39c3b5e54;hp=189e06775c143405b914bd401f3aa5c46e329133;p=ghc-hetmet.git [project @ 1999-02-02 13:21:59 by sof] - Added: newByteArray :: Ix ix => (ix,ix) -> ST s (ByteArray ix) boundsOfByteArray :: Ix ix => ByteArray ix -> (ix,ix) sizeofByteArray :: Ix ix => ByteArray ix -> Int plus defined Eq over ByteArrays. --- diff --git a/ghc/lib/exts/ByteArray.lhs b/ghc/lib/exts/ByteArray.lhs index 6a90023..7f9615b 100644 --- a/ghc/lib/exts/ByteArray.lhs +++ b/ghc/lib/exts/ByteArray.lhs @@ -9,9 +9,11 @@ together the definitions in @ArrBase@ and exports them as one. \begin{code} module ByteArray ( - ByteArray(..), -- not abstract, for now. + ByteArray(..), -- not abstract, for now. Instance of : CCallable, Eq. Ix, + newByteArray, -- :: Ix ix => (ix,ix) -> ST s (ByteArray ix) + --Indexing of ordinary @Arrays@ is standard Haskell and isn't defined here. indexCharArray, -- :: Ix ix => ByteArray ix -> ix -> Char indexIntArray, -- :: Ix ix => ByteArray ix -> ix -> Int @@ -19,13 +21,17 @@ module ByteArray indexAddrArray, -- :: Ix ix => ByteArray ix -> ix -> Addr indexFloatArray, -- :: Ix ix => ByteArray ix -> ix -> Float indexDoubleArray, -- :: Ix ix => ByteArray ix -> ix -> Double - indexStablePtrArray -- :: Ix ix => ByteArray ix -> ix -> (StablePtr a) + indexStablePtrArray, -- :: Ix ix => ByteArray ix -> ix -> (StablePtr a) + + sizeofByteArray, -- :: Ix ix => ByteArray ix -> Int + boundsOfByteArray -- :: Ix ix => ByteArray ix -> (ix, ix) ) where import PrelArr import PrelBase import PrelStable( StablePtr(..) ) +import PrelST import Ix \end{code} @@ -36,3 +42,35 @@ indexStablePtrArray (ByteArray ixs barr#) n case indexStablePtrArray# barr# n# of { r# -> (StablePtr r#)}} \end{code} + +The size returned is in bytes. + +\begin{code} +sizeofByteArray :: Ix ix => ByteArray ix -> Int +sizeofByteArray (ByteArray _ arr#) = + case (sizeofByteArray# arr#) of + i# -> (I# i#) + +boundsOfByteArray :: Ix ix => ByteArray ix -> (ix, ix) +boundsOfByteArray (ByteArray ixs _) = ixs +\end{code} + +\begin{code} +newByteArray :: Ix ix => (ix,ix) -> ST s (ByteArray ix) +newByteArray ixs = do + m_arr <- newCharArray ixs + unsafeFreezeByteArray m_arr +\end{code} + +If it should turn out to be an issue, could probably be speeded +up quite a bit. + +\begin{code} +instance Ix ix => Eq (ByteArray ix) where + b1 == b2 = eqByteArray b1 b2 + +eqByteArray :: Ix ix => ByteArray ix -> ByteArray ix -> Bool +eqByteArray b1 b2 = + sizeofByteArray b1 == sizeofByteArray b2 && + all (\ x -> indexCharArray b1 x == indexCharArray b2 x) (range (boundsOfByteArray b1)) +\end{code}