module Data.Vector.Storable.ByteString
(
byteStringToVector
, vectorToByteString
) where
import qualified Data.ByteString as BS
import qualified Data.ByteString.Internal as BS
import qualified Data.Vector.Storable as V
import Foreign.Storable
import Foreign.ForeignPtr
sizeOfElem :: (Storable a) => V.Vector a -> Int
sizeOfElem vec = sizeOf (undefined `asTypeOf` V.head vec)
byteStringToVector :: (Storable a) => BS.ByteString -> V.Vector a
byteStringToVector bs = vec where
vec = V.unsafeFromForeignPtr (castForeignPtr fptr) (scale off) (scale len)
(fptr, off, len) = BS.toForeignPtr bs
scale = (`div` sizeOfElem vec)
vectorToByteString :: (Storable a) => V.Vector a -> BS.ByteString
vectorToByteString vec
= BS.fromForeignPtr (castForeignPtr fptr) (scale off) (scale len) where
(fptr, off, len) = V.unsafeToForeignPtr vec
scale = (* sizeOfElem vec)