@@ -200,11 +200,11 @@ module Streamly.Internal.Data.Array.Foreign.Mut.Type
202 , c_memchr
202 , c_memchr
207#include "inline.hs"
206#include "inline.hs"
207+#include "ArrayMacros.h"
208#include "MachDeps.h"
208#include "MachDeps.h"
210#ifdef USE_C_MALLOC
210#ifdef USE_C_MALLOC
@@ -276,14 +276,6 @@ import Prelude hiding
276-- >>> import qualified Streamly.Internal.Data.Fold as Fold
276-- >>> import qualified Streamly.Internal.Data.Fold as Fold
277-- >>> import qualified Streamly.Internal.Data.Fold.Type as Fold
277-- >>> import qualified Streamly.Internal.Data.Fold.Type as Fold
279−-------------------------------------------------------------------------------
281−-------------------------------------------------------------------------------
283−{-# INLINE sizeOfElem #-}
284−sizeOfElem :: forall a . (Storable a) => a -> Int
285−sizeOfElem _ = max 1 $ sizeOf (undefined :: a)
287-------------------------------------------------------------------------------
279-------------------------------------------------------------------------------
288-- Foreign helpers
280-- Foreign helpers
289-------------------------------------------------------------------------------
281-------------------------------------------------------------------------------
@@ -301,10 +293,8 @@ foreign import ccall unsafe "string.h memcmp" c_memcmp
301-- how many elements of that type will completely fit in those bytes.
293-- how many elements of that type will completely fit in those bytes.
303{-# INLINE bytesToElemCount #-}
295{-# INLINE bytesToElemCount #-}
304−bytesToElemCount :: Storable a => a -> Int -> Int
296+bytesToElemCount :: forall a. Storable a => a -> Int -> Int
305−bytesToElemCount x n =
297+bytesToElemCount _ n = n `div` SIZE_OF(a)
306− let elemSize = sizeOfElem x
309-- XXX we are converting Int to CSize
299-- XXX we are converting Int to CSize
310memcpy :: Ptr Word8 -> Ptr Word8 -> Int -> IO ()
300memcpy :: Ptr Word8 -> Ptr Word8 -> Int -> IO ()
@@ -456,7 +446,7 @@ fromForeignPtrUnsafe fp@(ForeignPtr start contents) end bound =
456newArrayWith :: forall m a. (MonadIO m, Storable a)
446newArrayWith :: forall m a. (MonadIO m, Storable a)
457 => (Int -> Int -> m (ArrayContents, Ptr a)) -> Int -> Int -> m (Array a)
447 => (Int -> Int -> m (ArrayContents, Ptr a)) -> Int -> Int -> m (Array a)
458newArrayWith alloc alignSize count = do
448newArrayWith alloc alignSize count = do
459− let size = max (count * sizeOfElem (undefined :: a)) 0
449+ let size = max (count * SIZE_OF(a)) 0
460 (contents, p) <- alloc size alignSize
450 (contents, p) <- alloc size alignSize
461 return $ Array
451 return $ Array
462 { arrContents = contents
452 { arrContents = contents
@@ -511,7 +501,7 @@ newArrayAlignedUnmanaged = do
511 return (ArrayContents contents, Ptr addr)
501 return (ArrayContents contents, Ptr addr)
513newArrayAlignedUnmanaged _align count = do
503newArrayAlignedUnmanaged _align count = do
514− let size = max (count * sizeOfElem (undefined :: a)) 0
504+ let size = max (count * SIZE_OF(a)) 0
515 p <- liftIO $ mallocBytes size
505 p <- liftIO $ mallocBytes size
516 return $ Array
506 return $ Array
517 { arrContents = nilArrayContents
507 { arrContents = nilArrayContents
@@ -565,9 +555,8 @@ putIndexUnsafe :: forall m a. (MonadIO m, Storable a)
565 => Array a -> Int -> a -> m ()
555 => Array a -> Int -> a -> m ()
566putIndexUnsafe Array{..} i x =
556putIndexUnsafe Array{..} i x =
567 unsafeWithArrayContents arrContents arrStart $ \ptr -> do
557 unsafeWithArrayContents arrContents arrStart $ \ptr -> do
568− let elemSize = sizeOfElem (undefined :: a)
569− elemPtr = ptr `plusPtr` (elemSize * i)
558+ let elemPtr = PTR_INDEX(ptr,i,a)
570− assert (i >= 0 && elemPtr `plusPtr` elemSize <= aEnd) (return ())
559+ assert (i >= 0 && PTR_VALID(elemPtr,aEnd,a)) (return ())
571 liftIO $ poke elemPtr x
560 liftIO $ poke elemPtr x
573invalidIndex :: String -> Int -> a
562invalidIndex :: String -> Int -> a
@@ -578,9 +567,8 @@ invalidIndex label i =
578putIndexPtr :: forall m a. (MonadIO m, Storable a) =>
567putIndexPtr :: forall m a. (MonadIO m, Storable a) =>
579 Ptr a -> Ptr a -> Int -> a -> m ()
568 Ptr a -> Ptr a -> Int -> a -> m ()
580putIndexPtr start end i x = do
569putIndexPtr start end i x = do
581− let elemSize = sizeOfElem (undefined :: a)
582− elemPtr = start `plusPtr` (elemSize * i)
570+ let elemPtr = PTR_INDEX(start,i,a)
583− if i >= 0 && elemPtr `plusPtr` elemSize <= end
571+ if i >= 0 && PTR_VALID(elemPtr,end,a)
584 then liftIO $ poke elemPtr x
572 then liftIO $ poke elemPtr x
585 else invalidIndex "putIndexPtr" i
573 else invalidIndex "putIndexPtr" i
@@ -622,9 +610,8 @@ modifyIndexUnsafe :: forall m a b. (MonadIO m, Storable a) =>
622 Array a -> Int -> (a -> (a, b)) -> m b
610 Array a -> Int -> (a -> (a, b)) -> m b
623modifyIndexUnsafe Array{..} i f = do
611modifyIndexUnsafe Array{..} i f = do
624 liftIO $ unsafeWithArrayContents arrContents arrStart $ \ptr -> do
612 liftIO $ unsafeWithArrayContents arrContents arrStart $ \ptr -> do
625− let elemSize = sizeOfElem (undefined :: a)
626− elemPtr = ptr `plusPtr` (elemSize * i)
613+ let elemPtr = PTR_INDEX(ptr,i,a)
627− assert (i >= 0 && elemPtr `plusPtr` elemSize <= aEnd) (return ())
614+ assert (i >= 0 && PTR_NEXT(elemPtr,a) <= aEnd) (return ())
628 r <- peek elemPtr
615 r <- peek elemPtr
629 let (x, res) = f r
616 let (x, res) = f r
630 poke elemPtr x
617 poke elemPtr x
@@ -634,9 +621,8 @@ modifyIndexUnsafe Array{..} i f = do
634modifyIndexPtr :: forall m a b. (MonadIO m, Storable a) =>
621modifyIndexPtr :: forall m a b. (MonadIO m, Storable a) =>
635 Int -> (a -> (a, b)) -> Ptr a -> Ptr a -> m b
622 Int -> (a -> (a, b)) -> Ptr a -> Ptr a -> m b
636modifyIndexPtr i f start end = liftIO $ do
623modifyIndexPtr i f start end = liftIO $ do
637− let elemSize = sizeOfElem (undefined :: a)
638− elemPtr = start `plusPtr` (elemSize * i)
624+ let elemPtr = PTR_INDEX(start,i,a)
639− if i >= 0 && elemPtr `plusPtr` elemSize <= end
625+ if i >= 0 && PTR_VALID(elemPtr,end,a)
641 r <- peek elemPtr
627 r <- peek elemPtr
642 let (x, res) = f r
628 let (x, res) = f r
@@ -681,12 +667,11 @@ modify Array{..} f = liftIO $
684− go ptr = do
670+ go ptr =
685− let elemSize = sizeOfElem (undefined :: a)
686− when (ptr `plusPtr` elemSize <= aEnd) $ do
671+ when (PTR_VALID(ptr,aEnd,a)) $ do
687 r <- peek ptr
672 r <- peek ptr
688 poke ptr (f r)
673 poke ptr (f r)
689− go (ptr `plusPtr` elemSize)
674+ go (PTR_NEXT(ptr,a))
691{-# INLINE swapPtrs #-}
676{-# INLINE swapPtrs #-}
692swapPtrs :: Storable a => Ptr a -> Ptr a -> IO ()
677swapPtrs :: Storable a => Ptr a -> Ptr a -> IO ()
@@ -706,9 +691,8 @@ unsafeSwapIndices :: forall m a. (MonadIO m, Storable a)
706 => Array a -> Int -> Int -> m ()
691 => Array a -> Int -> Int -> m ()
707unsafeSwapIndices Array{..} i1 i2 = liftIO $ do
692unsafeSwapIndices Array{..} i1 i2 = liftIO $ do
708 unsafeWithArrayContents arrContents arrStart $ \ptr -> do
693 unsafeWithArrayContents arrContents arrStart $ \ptr -> do
709− let elemSize = sizeOfElem (undefined :: a)
694+ let ptr1 = PTR_INDEX(ptr,i1,a)
710− ptr1 = ptr `plusPtr` (elemSize * i1)
695+ ptr2 = PTR_INDEX(ptr,i2,a)
711− ptr2 = ptr `plusPtr` (elemSize * i2)
712 swapPtrs ptr1 (ptr2 :: Ptr a)
696 swapPtrs ptr1 (ptr2 :: Ptr a)
714-- | Swap the elements at two indices.
698-- | Swap the elements at two indices.
@@ -717,11 +701,12 @@ unsafeSwapIndices Array{..} i1 i2 = liftIO $ do
717swapIndices :: forall m a. (MonadIO m, Storable a)
701swapIndices :: forall m a. (MonadIO m, Storable a)
718 => Array a -> Int -> Int -> m ()
702 => Array a -> Int -> Int -> m ()
719swapIndices Array{..} i1 i2 = liftIO $ do
703swapIndices Array{..} i1 i2 = liftIO $ do
720− let elemSize = sizeOfElem (undefined :: a)
704+ let ptr1 = PTR_INDEX(arrStart,i1,a)
721− ptr1 = arrStart `plusPtr` (elemSize * i1)
705+ ptr2 = PTR_INDEX(arrStart,i2,a)
722− ptr2 = arrStart `plusPtr` (elemSize * i2)
706+ when (i1 < 0 || PTR_INVALID(ptr1,aEnd,a))
723− when (i1 < 0 || ptr1 >= aEnd ) $ invalidIndex "swapIndices" i1
707+ $ invalidIndex "swapIndices" i1
708+ when (i2 < 0 || PTR_INVALID(ptr2,aEnd,a))
724− when (i2 < 0 || ptr2 >= aEnd ) $ invalidIndex "swapIndices" i2
709+ $ invalidIndex "swapIndices" i2
725 swapPtrs ptr1 (ptr2 :: Ptr a)
710 swapPtrs ptr1 (ptr2 :: Ptr a)
727-------------------------------------------------------------------------------
712-------------------------------------------------------------------------------
@@ -777,8 +762,7 @@ roundUpToPower2 x =
778{-# INLINE allocBytesToBytes #-}
763{-# INLINE allocBytesToBytes #-}
779allocBytesToBytes :: forall a. Storable a => a -> Int -> Int
764allocBytesToBytes :: forall a. Storable a => a -> Int -> Int
780−allocBytesToBytes _ n =
765+allocBytesToBytes _ n = max (arrayPayloadSize n) (SIZE_OF(a))
781− max (arrayPayloadSize n) (sizeOfElem (undefined :: a))
783-- | Given a 'Storable' type (unused first arg) and real allocation size
767-- | Given a 'Storable' type (unused first arg) and real allocation size
784-- (including overhead), return how many elements of that type will completely
768-- (including overhead), return how many elements of that type will completely
@@ -827,8 +811,7 @@ snocNewEnd newEnd arr@Array{..} x = liftIO $ do
827{-# INLINE snocUnsafe #-}
811{-# INLINE snocUnsafe #-}
828snocUnsafe :: forall m a. (MonadIO m, Storable a) =>
812snocUnsafe :: forall m a. (MonadIO m, Storable a) =>
829 Array a -> a -> m (Array a)
813 Array a -> a -> m (Array a)
830−snocUnsafe arr@Array{..} =
814+snocUnsafe arr@Array{..} = snocNewEnd (PTR_NEXT(aEnd,a)) arr
831− snocNewEnd (aEnd `plusPtr` sizeOfElem (undefined :: a)) arr
833-- | Like 'snoc' but does not reallocate when pre-allocated array capacity
816-- | Like 'snoc' but does not reallocate when pre-allocated array capacity
834-- becomes full.
817-- becomes full.
@@ -838,7 +821,7 @@ snocUnsafe arr@Array{..} =
838snocMay :: forall m a. (MonadIO m, Storable a) =>
821snocMay :: forall m a. (MonadIO m, Storable a) =>
839 Array a -> a -> m (Maybe (Array a))
822 Array a -> a -> m (Maybe (Array a))
840snocMay arr@Array{..} x = liftIO $ do
823snocMay arr@Array{..} x = liftIO $ do
841− let newEnd = aEnd `plusPtr` sizeOfElem (undefined :: a)
824+ let newEnd = PTR_NEXT(aEnd,a)
842 if newEnd <= aBound
825 if newEnd <= aBound
843 then Just <$> snocNewEnd newEnd arr x
826 then Just <$> snocNewEnd newEnd arr x
844 else return Nothing
827 else return Nothing
@@ -875,8 +858,7 @@ snocWithRealloc :: forall m a. (MonadIO m, Storable a) =>
876 -> m (Array a)
859 -> m (Array a)
877snocWithRealloc sizer arr x = do
860snocWithRealloc sizer arr x = do
878− let elemSize = sizeOfElem (undefined :: a)
879− arr1 <- liftIO $ reallocWith "snocWith" sizer elemSize arr
861+ arr1 <- liftIO $ reallocWith "snocWith" sizer (SIZE_OF(a)) arr
880 snocUnsafe arr1 x
862 snocUnsafe arr1 x
882-- | @snocWith sizer arr elem@ mutates @arr@ to append @elem@. The length of
864-- | @snocWith sizer arr elem@ mutates @arr@ to append @elem@. The length of
@@ -899,7 +881,7 @@ snocWith :: forall m a. (MonadIO m, Storable a) =>
900 -> m (Array a)
882 -> m (Array a)
901snocWith allocSize arr x = liftIO $ do
883snocWith allocSize arr x = liftIO $ do
902− let newEnd = aEnd arr `plusPtr` sizeOfElem (undefined :: a)
884+ let newEnd = PTR_NEXT(aEnd arr,a)
903 if newEnd <= aBound arr
885 if newEnd <= aBound arr
904 then snocNewEnd newEnd arr x
886 then snocNewEnd newEnd arr x
905 else snocWithRealloc allocSize arr x
887 else snocWithRealloc allocSize arr x
@@ -970,9 +952,7 @@ reallocAligned elemSize alignSize newSize Array{..} = do
970{-# INLINABLE realloc #-}
952{-# INLINABLE realloc #-}
971realloc :: forall m a. (MonadIO m, Storable a) => Int -> Array a -> m (Array a)
953realloc :: forall m a. (MonadIO m, Storable a) => Int -> Array a -> m (Array a)
972realloc i arr =
954realloc i arr =
975− (sizeOfElem (undefined :: a)) (alignment (undefined :: a)) i arr
955+ liftIO $ reallocAligned (SIZE_OF(a)) (alignment (undefined :: a)) i arr
977-- | Change the reserved memory of the array so that it is enough to hold the
957-- | Change the reserved memory of the array so that it is enough to hold the
978-- specified number of elements. Nothing is done if the specified capacity is
958-- specified number of elements. Nothing is done if the specified capacity is
@@ -1014,7 +994,7 @@ rightSize arr@Array{..} = do
1014 target = roundUpLargeArray len
994 target = roundUpLargeArray len
1015 waste = aBound `minusPtr` aEnd
995 waste = aBound `minusPtr` aEnd
1016 assert (target >= len) (return ())
996 assert (target >= len) (return ())
1017− assert (len `mod` sizeOfElem (undefined :: a) == 0) (return ())
997+ assert (len `mod` SIZE_OF(a) == 0) (return ())
1018 -- We trade off some wastage (25%) to avoid reallocations and copying.
998 -- We trade off some wastage (25%) to avoid reallocations and copying.
1019 if target < capacity && len < 3 * waste
999 if target < capacity && len < 3 * waste
1020 then realloc target arr
1000 then realloc target arr
@@ -1065,18 +1045,16 @@ truncateExp = undefined
1065getIndexUnsafe :: forall m a. (MonadIO m, Storable a) => Array a -> Int -> m a
1045getIndexUnsafe :: forall m a. (MonadIO m, Storable a) => Array a -> Int -> m a
1066getIndexUnsafe Array {..} i =
1046getIndexUnsafe Array {..} i =
1067 unsafeWithArrayContents arrContents arrStart $ \ptr -> do
1047 unsafeWithArrayContents arrContents arrStart $ \ptr -> do
1068− let elemSize = sizeOfElem (undefined :: a)
1069− elemPtr = ptr `plusPtr` (elemSize * i)
1048+ let elemPtr = PTR_INDEX(ptr,i,a)
1070− assert (i >= 0 && elemPtr `plusPtr` elemSize <= aEnd) (return ())
1049+ assert (i >= 0 && PTR_VALID(elemPtr,aEnd,a)) (return ())
1071 liftIO $ peek elemPtr
1050 liftIO $ peek elemPtr
1073{-# INLINE getIndexPtr #-}
1052{-# INLINE getIndexPtr #-}
1074getIndexPtr :: forall m a. (MonadIO m, Storable a) =>
1053getIndexPtr :: forall m a. (MonadIO m, Storable a) =>
1075 Ptr a -> Ptr a -> Int -> m a
1054 Ptr a -> Ptr a -> Int -> m a
1076−getIndexPtr ptr end i = do
1055+getIndexPtr start end i = do
1077− let elemSize = sizeOfElem (undefined :: a)
1056+ let elemPtr = PTR_INDEX(start,i,a)
1078− elemPtr = ptr `plusPtr` (elemSize * i)
1079− if i >= 0 && elemPtr `plusPtr` elemSize <= end
1057+ if i >= 0 && PTR_VALID(elemPtr,end,a)
1080 then liftIO $ peek elemPtr
1058 then liftIO $ peek elemPtr
1081 else invalidIndex "getIndexPtr" i
1059 else invalidIndex "getIndexPtr" i
@@ -1091,10 +1069,9 @@ getIndex arr i =
1091{-# INLINE getIndexPtrRev #-}
1069{-# INLINE getIndexPtrRev #-}
1092getIndexPtrRev :: forall m a. (MonadIO m, Storable a) =>
1070getIndexPtrRev :: forall m a. (MonadIO m, Storable a) =>
1093 Ptr a -> Ptr a -> Int -> m a
1071 Ptr a -> Ptr a -> Int -> m a
1094−getIndexPtrRev ptr end i = do
1072+getIndexPtrRev start end i = do
1095− let elemSize = sizeOfElem (undefined :: a)
1073+ let elemPtr = PTR_RINDEX(end,i,a)
1096− elemPtr = end `plusPtr` negate (elemSize * (i + 1))
1097− if i >= 0 && elemPtr >= ptr
1074+ if i >= 0 && elemPtr >= start
1098 then liftIO $ peek elemPtr
1075 then liftIO $ peek elemPtr
1099 else invalidIndex "getIndexPtrRev" i
1076 else invalidIndex "getIndexPtrRev" i
@@ -1160,9 +1137,8 @@ getSliceUnsafe :: forall a. Storable a
1160 -> Array a
1137 -> Array a
1161 -> Array a
1138 -> Array a
1162getSliceUnsafe index len (Array contents start e _) =
1139getSliceUnsafe index len (Array contents start e _) =
1163− let size = sizeOfElem (undefined :: a)
1164− fp1 = start `plusPtr` (index * size)
1140+ let fp1 = PTR_INDEX(start,index,a)
1165− end = fp1 `plusPtr` (len * size)
1141+ end = fp1 `plusPtr` (len * SIZE_OF(a))
1166 in assert
1142 in assert
1167 (index >= 0 && len >= 0 && end <= e)
1143 (index >= 0 && len >= 0 && end <= e)
1168 (Array contents fp1 end end)
1144 (Array contents fp1 end end)
@@ -1178,9 +1154,8 @@ getSlice :: forall a. Storable a =>
1178 -> Array a
1154 -> Array a
1179 -> Array a
1155 -> Array a
1180getSlice index len (Array contents start e _) =
1156getSlice index len (Array contents start e _) =
1181− let size = sizeOfElem (undefined :: a)
1182− fp1 = start `plusPtr` (index * size)
1157+ let fp1 = PTR_INDEX(start,index,a)
1183− end = fp1 `plusPtr` (len * size)
1158+ end = fp1 `plusPtr` (len * SIZE_OF(a))
1184 in if index >= 0 && len >= 0 && end <= e
1159 in if index >= 0 && len >= 0 && end <= e
1185 then Array contents fp1 end end
1160 then Array contents fp1 end end
1186 else error
1161 else error
@@ -1203,17 +1178,15 @@ getSlice index len (Array contents start e _) =
1203reverse :: forall m a. (MonadIO m, Storable a) => Array a -> m ()
1178reverse :: forall m a. (MonadIO m, Storable a) => Array a -> m ()
1204reverse Array{..} = liftIO $ do
1179reverse Array{..} = liftIO $ do
1205 let l = arrStart
1180 let l = arrStart
1206− h = aEnd `plusPtr` (- elemSize)
1181+ h = PTR_PREV(aEnd,a)
1207 in swap l h
1182 in swap l h
1211− elemSize = sizeOfElem (undefined :: a)
1213 swap l h = do
1186 swap l h = do
1214 when (l < h) $ do
1187 when (l < h) $ do
1215 swapPtrs l h
1188 swapPtrs l h
1216− swap (l `plusPtr` elemSize) (h `plusPtr` (- elemSize))
1189+ swap (PTR_NEXT(l,a)) (PTR_PREV(h,a))
1218-- | Generate the next permutation of the sequence, returns False if this is
1191-- | Generate the next permutation of the sequence, returns False if this is
1219-- the last permutation.
1192-- the last permutation.
@@ -1297,7 +1270,7 @@ byteLength Array{..} =
1297{-# INLINE length #-}
1270{-# INLINE length #-}
1298length :: forall a. Storable a => Array a -> Int
1271length :: forall a. Storable a => Array a -> Int
1299length arr =
1272length arr =
1300− let elemSize = sizeOfElem (undefined :: a)
1273+ let elemSize = SIZE_OF(a)
1301 blen = byteLength arr
1274 blen = byteLength arr
1302 in assert (blen `mod` elemSize == 0) (blen `div` elemSize)
1275 in assert (blen `mod` elemSize == 0) (blen `div` elemSize)
@@ -1365,13 +1338,13 @@ arraysOf n (D.Stream step state) =
1365 case r of
1338 case r of
1366 D.Yield x s -> do
1339 D.Yield x s -> do
1367 liftIO $ poke end x >> touch contents
1340 liftIO $ poke end x >> touch contents
1368− let end' = end `plusPtr` sizeOfElem (undefined :: a)
1341+ let end1 = PTR_NEXT(end,a)
1369 return $
1342 return $
1370− if end' >= bound
1343+ if end1 >= bound
1371 then D.Skip
1344 then D.Skip
1372 (GroupYield
1345 (GroupYield
1373− contents start end' bound (GroupStart s))
1346+ contents start end1 bound (GroupStart s))
1374− else D.Skip (GroupBuffer s contents start end' bound)
1347+ else D.Skip (GroupBuffer s contents start end1 bound)
1375 D.Skip s ->
1348 D.Skip s ->
1376 return $ D.Skip (GroupBuffer s contents start end bound)
1349 return $ D.Skip (GroupBuffer s contents start end bound)
1377 D.Stop ->
1350 D.Stop ->
@@ -1430,8 +1403,7 @@ flattenArrays (D.Stream step state) = D.Stream step' (OuterLoop state)
1430 r <- peek p
1403 r <- peek p
1431 touch contents
1404 touch contents
1432 return r
1405 return r
1433− return $ D.Yield x (InnerLoop st contents
1406+ return $ D.Yield x (InnerLoop st contents (PTR_NEXT(p,a)) end)
1434− (p `plusPtr` sizeOfElem (undefined :: a)) end)
1436-- | Use the "readRev" unfold instead.
1408-- | Use the "readRev" unfold instead.
@@ -1451,7 +1423,7 @@ flattenArraysRev (D.Stream step state) = D.Stream step' (OuterLoop state)
1451 r <- step (adaptState gst) st
1423 r <- step (adaptState gst) st
1452 return $ case r of
1424 return $ case r of
1453 D.Yield Array{..} s ->
1425 D.Yield Array{..} s ->
1454− let p = aEnd `plusPtr` negate (sizeOfElem (undefined :: a))
1426+ let p = PTR_PREV(aEnd,a)
1455 in D.Skip (InnerLoop s arrContents p arrStart)
1427 in D.Skip (InnerLoop s arrContents p arrStart)
1456 D.Skip s -> D.Skip (OuterLoop s)
1428 D.Skip s -> D.Skip (OuterLoop s)
1457 D.Stop -> D.Stop
1429 D.Stop -> D.Stop
@@ -1464,7 +1436,7 @@ flattenArraysRev (D.Stream step state) = D.Stream step' (OuterLoop state)
1464 r <- peek p
1436 r <- peek p
1465 touch contents
1437 touch contents
1466 return r
1438 return r
1467− let cur = p `plusPtr` negate (sizeOfElem (undefined :: a))
1439+ let cur = PTR_PREV(p,a)
1468 return $ D.Yield x (InnerLoop st contents cur start)
1440 return $ D.Yield x (InnerLoop st contents cur start)
1470-------------------------------------------------------------------------------
1442-------------------------------------------------------------------------------
@@ -1493,8 +1465,7 @@ producer = Producer step (return . toReadUState) extract
1493 return D.Stop
1465 return D.Stop
1494 step (ReadUState contents end cur) = do
1466 step (ReadUState contents end cur) = do
1495 !x <- liftIO $ peek cur
1467 !x <- liftIO $ peek cur
1496− let cur1 = cur `plusPtr` sizeOfElem (undefined :: a)
1497− return $ D.Yield x (ReadUState contents end cur1)
1468+ return $ D.Yield x (ReadUState contents end (PTR_NEXT(cur,a)))
1499 extract (ReadUState contents end cur) = return $ Array contents cur end end
1470 extract (ReadUState contents end cur) = return $ Array contents cur end end
@@ -1514,7 +1485,7 @@ readRev = Unfold step inject
1516 inject (Array contents start end _) =
1487 inject (Array contents start end _) =
1517− let p = end `plusPtr` negate (sizeOfElem (undefined :: a))
1488+ let p = PTR_PREV(end,a)
1518 in return $ ReadUState contents start p
1489 in return $ ReadUState contents start p
1520 {-# INLINE_LATE step #-}
1491 {-# INLINE_LATE step #-}
@@ -1522,9 +1493,8 @@ readRev = Unfold step inject
1522 liftIO $ touch contents
1493 liftIO $ touch contents
1523 return D.Stop
1494 return D.Stop
1524 step (ReadUState contents start p) = do
1495 step (ReadUState contents start p) = do
1525− x <- liftIO $ peek p
1496+ x <- liftIO $ peek p
1526− let cur = p `plusPtr` negate (sizeOfElem (undefined :: a))
1527− return $ D.Yield x (ReadUState contents start cur)
1497+ return $ D.Yield x (ReadUState contents start (PTR_PREV(p,a)))
1529-------------------------------------------------------------------------------
1499-------------------------------------------------------------------------------
1530-- to Lists and streams
1500-- to Lists and streams
@@ -1551,7 +1521,7 @@ toListFB c n Array{..} = go arrStart
1551 r <- peek p
1521 r <- peek p
1552 touch arrContents
1522 touch arrContents
1553 return r
1523 return r
1554− in c x (go (p `plusPtr` sizeOfElem (undefined :: a)))
1524+ in c x (go (PTR_NEXT(p,a)))
1557-- XXX Monadic foldr/build fusion?
1527-- XXX Monadic foldr/build fusion?
@@ -1568,7 +1538,7 @@ toList Array{..} = liftIO $ go arrStart
1568 go p = do
1538 go p = do
1569 x <- peek p
1539 x <- peek p
1570 touch arrContents
1540 touch arrContents
1571− (:) x <$> go (p `plusPtr` sizeOfElem (undefined :: a))
1541+ (:) x <$> go (PTR_NEXT(p,a))
1573-- | Use the 'read' unfold instead.
1543-- | Use the 'read' unfold instead.
@@ -1586,7 +1556,7 @@ toStreamD Array{..} = D.Stream step arrStart
1586 step _ p = liftIO $ do
1556 step _ p = liftIO $ do
1587 r <- peek p
1557 r <- peek p
1588 touch arrContents
1558 touch arrContents
1589− return $ D.Yield r (p `plusPtr` sizeOfElem (undefined :: a))
1559+ return $ D.Yield r (PTR_NEXT(p,a))
1591{-# INLINE toStreamK #-}
1561{-# INLINE toStreamK #-}
1592toStreamK :: forall m a. (MonadIO m, Storable a) => Array a -> K.Stream m a
1562toStreamK :: forall m a. (MonadIO m, Storable a) => Array a -> K.Stream m a
@@ -1600,7 +1570,7 @@ toStreamK Array{..} = go arrStart
1600 r <- peek p
1570 r <- peek p
1601 touch arrContents
1571 touch arrContents
1602 return r
1572 return r
1603− in liftIO elemM `K.consM` go (p `plusPtr` sizeOfElem (undefined :: a))
1573+ in liftIO elemM `K.consM` go (PTR_NEXT(p,a))
1605-- | Use the 'readRev' unfold instead.
1575-- | Use the 'readRev' unfold instead.
@@ -1610,7 +1580,7 @@ toStreamK Array{..} = go arrStart
1610{-# INLINE_NORMAL toStreamDRev #-}
1580{-# INLINE_NORMAL toStreamDRev #-}
1611toStreamDRev :: forall m a. (MonadIO m, Storable a) => Array a -> D.Stream m a
1581toStreamDRev :: forall m a. (MonadIO m, Storable a) => Array a -> D.Stream m a
1612toStreamDRev Array{..} =
1582toStreamDRev Array{..} =
1613− let p = aEnd `plusPtr` negate (sizeOfElem (undefined :: a))
1583+ let p = PTR_PREV(aEnd,a)
1614 in D.Stream step p
1584 in D.Stream step p
@@ -1620,12 +1590,12 @@ toStreamDRev Array{..} =
1620 step _ p = liftIO $ do
1590 step _ p = liftIO $ do
1621 r <- peek p
1591 r <- peek p
1622 touch arrContents
1592 touch arrContents
1623− return $ D.Yield r (p `plusPtr` negate (sizeOfElem (undefined :: a)))
1593+ return $ D.Yield r (PTR_PREV(p,a))
1625{-# INLINE toStreamKRev #-}
1595{-# INLINE toStreamKRev #-}
1626toStreamKRev :: forall m a. (MonadIO m, Storable a) => Array a -> K.Stream m a
1596toStreamKRev :: forall m a. (MonadIO m, Storable a) => Array a -> K.Stream m a
1627toStreamKRev Array {..} =
1597toStreamKRev Array {..} =
1628− let p = aEnd `plusPtr` negate (sizeOfElem (undefined :: a))
1598+ let p = PTR_PREV(aEnd,a)
@@ -1636,7 +1606,7 @@ toStreamKRev Array {..} =
1636 r <- peek p
1606 r <- peek p
1637 touch arrContents
1607 touch arrContents
1638 return r
1608 return r
1639− in liftIO elemM `K.consM` go (p `plusPtr` negate (sizeOfElem (undefined :: a)))
1609+ in liftIO elemM `K.consM` go (PTR_PREV(p,a))
1641-------------------------------------------------------------------------------
1611-------------------------------------------------------------------------------
1642-- Folding
1612-- Folding
@@ -1705,8 +1675,7 @@ appendNUnsafe action n =
1705 assert (n >= 0) (return ())
1675 assert (n >= 0) (return ())
1706 arr@(Array _ _ end bound) <- action
1676 arr@(Array _ _ end bound) <- action
1707 let free = bound `minusPtr` end
1677 let free = bound `minusPtr` end
1708− elemSize = sizeOfElem (undefined :: a)
1709− needed = n * elemSize
1678+ needed = n * SIZE_OF(a)
1710 -- XXX We can also reallocate if the array has too much free space,
1679 -- XXX We can also reallocate if the array has too much free space,
1711 -- otherwise we lose that space.
1680 -- otherwise we lose that space.
@@ -1717,8 +1686,7 @@ appendNUnsafe action n =
1718 step (ArrayUnsafe contents start end) x = do
1687 step (ArrayUnsafe contents start end) x = do
1719 liftIO $ poke end x >> touch contents
1688 liftIO $ poke end x >> touch contents
1720− let end1 = end `plusPtr` sizeOfElem (undefined :: a)
1721− return $ ArrayUnsafe contents start end1
1689+ return $ ArrayUnsafe contents start (PTR_NEXT(end,a))
1723-- | Append @n@ elements to an existing array. Any free space left in the array
1691-- | Append @n@ elements to an existing array. Any free space left in the array
1724-- after appending @n@ elements is lost.
1692-- after appending @n@ elements is lost.
@@ -1835,7 +1803,7 @@ writeNWithUnsafe alloc n = Fold step initial (return . fromArrayUnsafe)
1835 liftIO $ poke end x >> touch contents
1803 liftIO $ poke end x >> touch contents
1837 $ FL.Partial
1805 $ FL.Partial
1838− $ ArrayUnsafe contents start (end `plusPtr` sizeOfElem (undefined :: a))
1806+ $ ArrayUnsafe contents start (PTR_NEXT(end,a))
1840-- | Like 'writeN' but does not check the array bounds when writing. The fold
1808-- | Like 'writeN' but does not check the array bounds when writing. The fold
1841-- driver must not call the step function more than 'n' times otherwise it will
1809-- driver must not call the step function more than 'n' times otherwise it will
@@ -1908,20 +1876,19 @@ writeWith elemCount =
1909 insertElem (Array contents start end bound) x = do
1877 insertElem (Array contents start end bound) x = do
1910 liftIO $ poke end x
1878 liftIO $ poke end x
1911− let end1 = end `plusPtr` sizeOfElem (undefined :: a)
1912− return $ Array contents start end1 bound
1879+ return $ Array contents start (PTR_NEXT(end,a)) bound
1914 initial = do
1881 initial = do
1915 when (elemCount < 0) $ error "writeWith: elemCount is negative"
1882 when (elemCount < 0) $ error "writeWith: elemCount is negative"
1916 liftIO $ newArrayAligned (alignment (undefined :: a)) elemCount
1883 liftIO $ newArrayAligned (alignment (undefined :: a)) elemCount
1917 step arr@(Array _ start end bound) x
1884 step arr@(Array _ start end bound) x
1918− | end `plusPtr` sizeOfElem (undefined :: a) > bound = do
1885+ | PTR_NEXT(end,a) > bound = do
1919 let oldSize = end `minusPtr` start
1886 let oldSize = end `minusPtr` start
1920 newSize = max (oldSize * 2) 1
1887 newSize = max (oldSize * 2) 1
1923 $ reallocAligned
1890 $ reallocAligned
1924− (sizeOfElem (undefined :: a))
1891+ (SIZE_OF(a))
1925 (alignment (undefined :: a))
1892 (alignment (undefined :: a))
@@ -1962,7 +1929,7 @@ fromStreamDN limit str = do
1963 fwrite ptr x = do
1930 fwrite ptr x = do
1964 liftIO $ poke ptr x
1931 liftIO $ poke ptr x
1965− return $ ptr `plusPtr` sizeOfElem (undefined :: a)
1932+ return $ PTR_NEXT(ptr,a)
1967-- | Create an 'Array' from the first N elements of a list. The array is
1934-- | Create an 'Array' from the first N elements of a list. The array is
1968-- allocated to size N, if the list terminates before N elements then the
1935-- allocated to size N, if the list terminates before N elements then the
@@ -2156,7 +2123,7 @@ splitAt i arr@Array{..} =
2156 else if i > maxIndex
2123 else if i > maxIndex
2157 then error $ "sliceAt: specified array index " ++ show i
2124 then error $ "sliceAt: specified array index " ++ show i
2158 ++ " is beyond the maximum index " ++ show maxIndex
2125 ++ " is beyond the maximum index " ++ show maxIndex
2159− else let off = i * sizeOfElem (undefined :: a)
2126+ else let off = i * SIZE_OF(a)
2160 p = arrStart `plusPtr` off
2127 p = arrStart `plusPtr` off
2161 in ( Array
2128 in ( Array
2162 { arrContents = arrContents
2129 { arrContents = arrContents
@@ -2207,7 +2174,7 @@ asBytes = castUnsafe
2207cast :: forall a b. Storable b => Array a -> Maybe (Array b)
2174cast :: forall a b. Storable b => Array a -> Maybe (Array b)
2208cast arr =
2175cast arr =
2209 let len = byteLength arr
2176 let len = byteLength arr
2210− r = len `mod` sizeOfElem (undefined :: b)
2177+ r = len `mod` SIZE_OF(b)
2211 in if r /= 0
2178 in if r /= 0
2212 then Nothing
2179 then Nothing
2213 else Just $ castUnsafe arr
2180 else Just $ castUnsafe arr