diff --git a/ghc/lib/exts/ByteArray.lhs b/ghc/lib/exts/ByteArray.lhs index 6a900236264210f6a0ed3c942ac6544b93ce0c58..7f9615b6ded745177df343b8c35e7f73e691ca38 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}