Specialisation code for D.V.Storable.(==) (commented out for now)
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sun, 6 Dec 2009 15:34:02 +0000 (15:34 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sun, 6 Dec 2009 15:34:02 +0000 (15:34 +0000)
Data/Vector/Storable.hs

index e312e27..46dfe7c 100644 (file)
@@ -71,6 +71,8 @@ import Data.Vector.Storable.Internal
 
 import Foreign.Storable
 import Foreign.ForeignPtr
+-- import Foreign.Ptr
+-- import Foreign.C.Types
 
 import Control.Monad.ST ( ST, runST )
 
@@ -89,6 +91,8 @@ import Prelude hiding ( length, null,
 
 import qualified Prelude
 
+#include "vector.h"
+
 -- | 'Storable'-based vectors
 data Vector a = Vector {-# UNPACK #-} !Int
                        {-# UNPACK #-} !Int
@@ -121,6 +125,27 @@ instance (Storable a, Eq a) => Eq (Vector a) where
   {-# INLINE (==) #-}
   (==) = G.eq
 
+{-
+eq_memcmp :: forall a. Storable a => Vector a -> Vector a -> Bool
+{-# INLINE_STREAM eq_memcmp #-}
+eq_memcmp (Vector i m p) (Vector j n q)
+  = m == n && inlinePerformIO
+              (withForeignPtr p $ \p' ->
+               withForeignPtr q $ \q' ->
+               return $
+               memcmp (p' `plusPtr` i) (q' `plusPtr` j)
+                      (fromIntegral $ sizeOf (undefined :: a) * m) == 0)
+
+foreign import ccall unsafe "string.h memcmp" memcmp
+        :: Ptr a -> Ptr a -> CSize -> CInt
+
+{-# RULES
+
+"(==) [Vector.Storable Int]"
+  G.eq = eq_memcmp :: Vector Int -> Vector Int -> Bool
+ #-}
+-}
+
 instance (Storable a, Ord a) => Ord (Vector a) where
   {-# INLINE compare #-}
   compare = G.cmp