From 52305f136a2ea232e354cb2b55c387c2f8930fbc Mon Sep 17 00:00:00 2001 From: Alberto Ruiz Date: Tue, 11 Nov 2008 09:31:47 +0000 Subject: fix transdata --- lib/Data/Packed/Internal/Matrix.hs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/Data/Packed/Internal/Matrix.hs b/lib/Data/Packed/Internal/Matrix.hs index a32a782..9def473 100644 --- a/lib/Data/Packed/Internal/Matrix.hs +++ b/lib/Data/Packed/Internal/Matrix.hs @@ -234,21 +234,19 @@ transdata' c1 v c2 = then v else unsafePerformIO $ do w <- createVector (r2*c2) - let p = unsafeForeignPtrToPtr (fptr v) - q = unsafeForeignPtrToPtr (fptr w) - go (-1) _ = return () - go !i (-1) = go (i-1) (c1-1) - go !i !j = do x <- peekElemOff p (i*c1+j) - pokeElemOff q (j*c2+i) x - go i (j-1) - go (r1-1) (c1-1) - touchForeignPtr (fptr w) + withForeignPtr (fptr v) $ \p -> + withForeignPtr (fptr w) $ \q -> do + let go (-1) _ = return () + go !i (-1) = go (i-1) (c1-1) + go !i !j = do x <- peekElemOff p (i*c1+j) + pokeElemOff q (j*c2+i) x + go i (j-1) + go (r1-1) (c1-1) return w where r1 = dim v `div` c1 r2 = dim v `div` c2 noneed = r1 == 1 || c1 == 1 - -- {-# SPECIALIZE transdata' :: Int -> Vector Double -> Int -> Vector Double #-} -- {-# SPECIALIZE transdata' :: Int -> Vector (Complex Double) -> Int -> Vector (Complex Double) #-} -- cgit v1.2.3