Add setAddr
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Thu, 26 Jan 2012 22:03:27 +0000 (22:03 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Thu, 26 Jan 2012 22:03:27 +0000 (22:03 +0000)
Data/Primitive/Addr.hs

index fb0fd84..a38cfd2 100644 (file)
 --
 
 module Data.Primitive.Addr (
+  -- * Types
   Addr(..),
 
+  -- * Address arithmetic
   nullAddr, plusAddr, minusAddr, remAddr,
+
+  -- * Element access
   indexOffAddr, readOffAddr, writeOffAddr,
-  copyAddr, moveAddr, memcpyAddr
+
+  -- * Block operations
+  copyAddr, moveAddr, setAddr,
+
+  -- * Deprecated operations
+  memcpyAddr
 ) where
 
 import Control.Monad.Primitive
@@ -88,6 +97,12 @@ moveAddr :: PrimMonad m => Addr         -- ^ destination address
 moveAddr (Addr dst#) (Addr src#) n
   = unsafePrimToPrim $ moveBytes (Ptr dst#) (Ptr src#) n
 
+-- | Fill a memory block of with the given value. The length is in
+-- elements of type @a@ rather than in bytes.
+setAddr :: (Prim a, PrimMonad m) => Addr -> Int -> a -> m ()
+{-# INLINE setAddr #-}
+setAddr (Addr addr#) (I# n#) x = primitive_ (setOffAddr# addr# 0# n# x)
+
 memcpyAddr :: PrimMonad m => Addr -> Addr -> Int -> m ()
 {-# INLINE memcpyAddr #-}
 {-# DEPRECATED memcpyAddr "Use copyAddr instead" #-}