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

import qualified Data.Array.Knead.Shape as Shape

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

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