{-# LANGUAGE TypeFamilies #-}
module Data.Array.Knead.Code where

import qualified Data.Array.Knead.Shape as Shape

import qualified LLVM.Extra.Multi.Value as MultiValue
import qualified LLVM.Extra.Storable as Storable

import qualified LLVM.Core as LLVM

import Foreign.Ptr (Ptr)

import Prelude2010
import Prelude ()


getElementPtr ::
   (Shape.C sh, Shape.Index sh ~ ix, Storable.C a) =>
   MultiValue.T sh -> LLVM.Value (Ptr a) ->
   MultiValue.T ix ->
   LLVM.CodeGenFunction r (LLVM.Value (Ptr a))
getElementPtr sh ptr ix =
   flip Storable.advancePtr ptr =<< LLVM.bitcast =<< Shape.offset sh ix