{-# LANGUAGE TypeFamilies #-} module Synthesizer.LLVM.Storable.Vector where import qualified LLVM.Extra.Memory as Memory import LLVM.Extra.Class (MakeValueTuple, ValueTuple, ) import qualified Data.StorableVector as SV import qualified Data.StorableVector.Base as SVB import Foreign.Storable (Storable, ) import Foreign.Marshal.Array (advancePtr, ) import Foreign.ForeignPtr (ForeignPtr, ) import Foreign.Ptr (Ptr, ) import qualified System.Unsafe as Unsafe unsafeToPointers :: (Storable a, MakeValueTuple a, ValueTuple a ~ value, Memory.C value) => SV.Vector a -> (ForeignPtr a, Ptr (Memory.Struct value), Int) unsafeToPointers v = let (fp,s,l) = SVB.toForeignPtr v in (fp, Memory.castStorablePtr $ Unsafe.foreignPtrToPtr fp `advancePtr` s, l)