Add memcpy, memset and memmove for ByteArrays
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sun, 4 Apr 2010 12:51:25 +0000 (12:51 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sun, 4 Apr 2010 12:51:25 +0000 (12:51 +0000)
Data/Primitive/ByteArray.hs
cbits/memops.c
cbits/memops.h

index 541d205..752bcf6 100644 (file)
@@ -19,13 +19,16 @@ module Data.Primitive.ByteArray (
   readByteArray, writeByteArray, indexByteArray,
   unsafeFreezeByteArray,
   sizeofByteArray, sizeofMutableByteArray, sameMutableByteArray,
-  byteArrayContents
+  byteArrayContents,
+
+  memcpyByteArray, memcpyByteArray', memmoveByteArray, memsetByteArray
 ) where
 
 import Control.Monad.Primitive
 import Data.Primitive.Types
 
 import Foreign.C.Types
+import Data.Word ( Word8 )
 import GHC.Base ( Int(..) )
 import GHC.Prim
 
@@ -113,17 +116,60 @@ writeByteArray
 writeByteArray (MutableByteArray arr#) (I# i#) x
   = primitive_ (writeByteArray# arr# i# x)
 
-memcpyMutableByteArray
-  :: PrimMonad m => MutableByteArray s -> Int -> MutableByteArray s -> Int
+memcpyByteArray
+  :: PrimMonad m => MutableByteArray (PrimState m) -> Int
+                 -> MutableByteArray (PrimState m) -> Int
                  -> Int -> m ()
-memcpyMutableByteArray (MutableByteArray dst#) doff
-                       (MutableByteArray src#) soff sz
+memcpyByteArray (MutableByteArray dst#) doff
+                (MutableByteArray src#) soff sz
   = unsafePrimToPrim
-  $ memcpy_off dst# (fromIntegral doff) src# (fromIntegral soff)
+  $ memcpy_mba dst# (fromIntegral doff) src# (fromIntegral soff)
                     (fromIntegral sz)
 
+memcpyByteArray'
+  :: PrimMonad m => MutableByteArray (PrimState m) -> Int
+                 -> ByteArray -> Int
+                 -> Int -> m ()
+memcpyByteArray' (MutableByteArray dst#) doff
+                 (ByteArray src#) soff sz
+  = unsafePrimToPrim
+  $ memcpy_ba dst# (fromIntegral doff) src# (fromIntegral soff)
+                 (fromIntegral sz)
+
+memmoveByteArray
+  :: PrimMonad m => MutableByteArray (PrimState m) -> Int
+                 -> MutableByteArray (PrimState m) -> Int
+                 -> Int -> m ()
+memmoveByteArray (MutableByteArray dst#) doff
+                 (MutableByteArray src#) soff sz
+  = unsafePrimToPrim
+  $ memmove_mba dst# (fromIntegral doff) src# (fromIntegral soff)
+                     (fromIntegral sz)
+
+memsetByteArray
+  :: PrimMonad m => MutableByteArray (PrimState m) -> Int -> Word8
+                 -> Int -> m ()
+memsetByteArray (MutableByteArray dst#) doff c sz
+  = unsafePrimToPrim
+  $ memset_mba dst# (fromIntegral doff) (fromIntegral c) (fromIntegral sz)
+
+
+
 foreign import ccall unsafe "memops.h memcpy_off"
-  memcpy_off :: MutableByteArray# s -> CInt
+  memcpy_mba :: MutableByteArray# s -> CInt
              -> MutableByteArray# s -> CInt
              -> CSize -> IO ()
 
+foreign import ccall unsafe "memops.h memcpy_off"
+  memcpy_ba :: MutableByteArray# s -> CInt
+            -> ByteArray# -> CInt
+            -> CSize -> IO ()
+
+foreign import ccall unsafe "memops.h memmove_off"
+  memmove_mba :: MutableByteArray# s -> CInt
+              -> MutableByteArray# s -> CInt
+              -> CSize -> IO ()
+
+foreign import ccall unsafe "memops.h memset_off"
+  memset_mba :: MutableByteArray# s -> CInt -> CInt -> CSize -> IO ()
+
index 809282c..e4f6d9f 100644 (file)
@@ -5,3 +5,13 @@ void memcpy_off( void *dst, int doff, void *src, int soff, size_t len )
   memcpy( (char *)dst + doff, (char *)src + soff, len );
 }
 
+void memmove_off( void *dst, int doff, void *src, int soff, size_t len )
+{
+  memmove( (char *)dst + doff, (char *)src + soff, len );
+}
+
+void memset_off( void *dst, int doff, int c, size_t len )
+{
+  memset( (char *)dst + doff, c, len );
+}
+
index f7aa9a6..92dab27 100644 (file)
@@ -4,6 +4,8 @@
 #include <stdlib.h>
 
 void memcpy_off( void *dst, int doff, void *src, int soff, size_t len );
+void memmove_off( void *dst, int doff, void *src, int soff, size_t len );
+void memset_off( void *dst, int doff, int c, size_t len );
 
 #endif