Support for copying immutable vectors into mutable ones
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Thu, 15 Apr 2010 00:54:04 +0000 (00:54 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Thu, 15 Apr 2010 00:54:04 +0000 (00:54 +0000)
Data/Vector/Generic.hs

index cea8f03..5ed0ddf 100644 (file)
@@ -89,7 +89,7 @@ module Data.Vector.Generic (
   stream, unstream, streamR, unstreamR,
 
   -- * MVector-based initialisation
-  new,
+  new, copy, unsafeCopy,
 
   -- * Utilities for defining Data instances
   gfoldl, dataCast, mkType
@@ -282,6 +282,25 @@ unstreamR s = new (New.unstreamR s)
 
  #-}
 
+-- | Copy an immutable vector into a mutable one. The two vectors must have
+-- the same length. This is not checked.
+unsafeCopy
+  :: (PrimMonad m, Vector v a) => Mutable v (PrimState m) a -> v a -> m ()
+{-# INLINE unsafeCopy #-}
+unsafeCopy dst src = UNSAFE_CHECK(check) "unsafeCopy" "length mismatch"
+                                         (M.length dst == length src)
+                   $ (dst `seq` src `seq` basicUnsafeCopy dst src)
+           
+-- | Copy an immutable vector into a mutale one. The two vectors must have the
+-- same length.
+copy
+  :: (PrimMonad m, Vector v a) => Mutable v (PrimState m) a -> v a -> m ()
+{-# INLINE copy #-}
+copy dst src = BOUNDS_CHECK(check) "copy" "length mismatch"
+                                          (M.length dst == length src)
+             $ unsafeCopy dst src
+
+
 -- Length
 -- ------