{-# LANGUAGE FlexibleInstances #-}

module HaskellWorks.Data.Simd.Internal.Marshal where

import Data.Monoid ((<>))
import Data.Word

import qualified Data.Vector.Storable as DVS
import qualified Foreign.ForeignPtr   as F

{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}

unsafeToElemSizedForeignPtr :: Int -> DVS.Vector Word64 -> (F.ForeignPtr Word8, Int, Int)
unsafeToElemSizedForeignPtr elemSize v = case DVS.unsafeCast v :: DVS.Vector Word8 of
  au -> case DVS.unsafeToForeignPtr au of
    t@(_, _, srcALength) -> if sizeMismatch == 0
      then t
      else error $ "Byte string with mismatched element size: " <> show sizeMismatch
      where w64sLen       = srcALength `div` elemSize
            sizeMismatch  = srcALength - w64sLen * elemSize