Add memcpyAddr
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Mon, 20 Sep 2010 00:21:36 +0000 (00:21 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Mon, 20 Sep 2010 00:21:36 +0000 (00:21 +0000)
Data/Primitive/Addr.hs

index 5fb5fcd..543572a 100644 (file)
@@ -15,7 +15,8 @@ module Data.Primitive.Addr (
   Addr(..),
 
   nullAddr, plusAddr, minusAddr, remAddr,
-  indexOffAddr, readOffAddr, writeOffAddr
+  indexOffAddr, readOffAddr, writeOffAddr,
+  memcpyAddr
 ) where
 
 import Control.Monad.Primitive
@@ -24,6 +25,10 @@ import Data.Primitive.Types
 import GHC.Base ( Int(..) )
 import GHC.Prim
 
+import GHC.Ptr
+import Foreign.Marshal.Utils
+
+
 -- | The null address
 nullAddr :: Addr
 nullAddr = Addr nullAddr#
@@ -62,3 +67,7 @@ writeOffAddr :: (Prim a, PrimMonad m) => Addr -> Int -> a -> m ()
 {-# INLINE writeOffAddr #-}
 writeOffAddr (Addr addr#) (I# i#) x = primitive_ (writeOffAddr# addr# i# x)
 
+memcpyAddr :: PrimMonad m => Addr -> Addr -> Int -> m ()
+memcpyAddr (Addr dst#) (Addr src#) n
+  = unsafePrimToPrim $ copyBytes (Ptr dst#) (Ptr src#) n
+