summaryrefslogtreecommitdiff
path: root/lib/Data/Packed/Internal/Vector.hs
diff options
context:
space:
mode:
authorAlberto Ruiz <aruiz@um.es>2013-05-21 13:30:45 +0200
committerAlberto Ruiz <aruiz@um.es>2013-05-21 13:30:45 +0200
commitc5606c622cebf265ae0bb3ea32a9f2ebf2f3a79f (patch)
tree7b3b202eb267e84f7815bf8b3cc1dbae51228476 /lib/Data/Packed/Internal/Vector.hs
parent6b2f191ea8d6665996070bf6b3e5b4109584dcab (diff)
merge develop, fix conflicts
Diffstat (limited to 'lib/Data/Packed/Internal/Vector.hs')
-rw-r--r--lib/Data/Packed/Internal/Vector.hs59
1 files changed, 0 insertions, 59 deletions
diff --git a/lib/Data/Packed/Internal/Vector.hs b/lib/Data/Packed/Internal/Vector.hs
index d3b80ff..5892e67 100644
--- a/lib/Data/Packed/Internal/Vector.hs
+++ b/lib/Data/Packed/Internal/Vector.hs
@@ -55,48 +55,17 @@ import GHC.Base
55import GHC.IOBase hiding (liftIO) 55import GHC.IOBase hiding (liftIO)
56#endif 56#endif
57 57
58#ifdef VECTOR
59import qualified Data.Vector.Storable as Vector 58import qualified Data.Vector.Storable as Vector
60import Data.Vector.Storable(Vector, 59import Data.Vector.Storable(Vector,
61 unsafeToForeignPtr, 60 unsafeToForeignPtr,
62 unsafeFromForeignPtr, 61 unsafeFromForeignPtr,
63 unsafeWith) 62 unsafeWith)
64#else
65import Foreign.ForeignPtr(withForeignPtr)
66#endif
67 63
68#ifdef VECTOR
69 64
70-- | Number of elements 65-- | Number of elements
71dim :: (Storable t) => Vector t -> Int 66dim :: (Storable t) => Vector t -> Int
72dim = Vector.length 67dim = Vector.length
73 68
74#else
75
76-- | One-dimensional array of objects stored in a contiguous memory block.
77data Vector t =
78 V { ioff :: {-# UNPACK #-} !Int -- ^ offset of first element
79 , idim :: {-# UNPACK #-} !Int -- ^ number of elements
80 , fptr :: {-# UNPACK #-} !(ForeignPtr t) -- ^ foreign pointer to the memory block
81 }
82
83unsafeToForeignPtr :: Storable a => Vector a -> (ForeignPtr a, Int, Int)
84unsafeToForeignPtr v = (fptr v, ioff v, idim v)
85
86-- | Same convention as in Roman Leshchinskiy's vector package.
87unsafeFromForeignPtr :: Storable a => ForeignPtr a -> Int -> Int -> Vector a
88unsafeFromForeignPtr fp i n | n > 0 = V {ioff = i, idim = n, fptr = fp}
89 | otherwise = error "unsafeFromForeignPtr with dim < 1"
90
91unsafeWith (V i _ fp) m = withForeignPtr fp $ \p -> m (p `advancePtr` i)
92{-# INLINE unsafeWith #-}
93
94-- | Number of elements
95dim :: (Storable t) => Vector t -> Int
96dim = idim
97
98#endif
99
100 69
101-- C-Haskell vector adapter 70-- C-Haskell vector adapter
102-- vec :: Adapt (CInt -> Ptr t -> r) (Vector t) r 71-- vec :: Adapt (CInt -> Ptr t -> r) (Vector t) r
@@ -204,36 +173,8 @@ subVector :: Storable t => Int -- ^ index of the starting element
204 -> Int -- ^ number of elements to extract 173 -> Int -- ^ number of elements to extract
205 -> Vector t -- ^ source 174 -> Vector t -- ^ source
206 -> Vector t -- ^ result 175 -> Vector t -- ^ result
207
208#ifdef VECTOR
209
210subVector = Vector.slice 176subVector = Vector.slice
211 177
212{-
213subVector k l v
214 | k<0 || k >= n || k+l > n || l < 0 = error "subVector out of range"
215 | otherwise = unsafeFromForeignPtr fp (i+k) l
216 where
217 (fp, i, n) = unsafeToForeignPtr v
218-}
219
220#else
221
222subVector k l v@V{idim = n, ioff = i}
223 | k<0 || k >= n || k+l > n || l < 0 = error "subVector out of range"
224 | otherwise = v {idim = l, ioff = i+k}
225
226{-
227subVectorCopy k l (v@V {idim=n})
228 | k<0 || k >= n || k+l > n || l < 0 = error "subVector out of range"
229 | otherwise = unsafePerformIO $ do
230 r <- createVector l
231 let f _ s _ d = copyArray d (advancePtr s k) l >> return 0
232 app2 f vec v vec r "subVector"
233 return r
234-}
235
236#endif
237 178
238{- | Reads a vector position: 179{- | Reads a vector position:
239 180