packages feed

synthesizer-llvm-0.8.2: src/Synthesizer/LLVM/Storable/Vector.hs

{-# 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.castTuplePtr $ Unsafe.foreignPtrToPtr fp `advancePtr` s,
        l)