{-# LANGUAGE GADTs        #-}
{-# LANGUAGE TypeFamilies #-}
-- |
-- Module      : Data.Array.Accelerate.Numeric.LinearAlgebra.LLVM.Native.Base
-- Copyright   : [2017..2020] Trevor L. McDonell
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Data.Array.Accelerate.Numeric.LinearAlgebra.LLVM.Native.Base
  where

import Data.Array.Accelerate.Representation.Array
import Data.Array.Accelerate.Array.Data
import Data.Array.Accelerate.Array.Unique
import Data.Primitive.Vec

import Data.Array.Accelerate.Numeric.LinearAlgebra.Type
import Foreign.Ptr                                                  (Ptr)

import qualified Blas.Primitive.Types                               as C


type family ArrayPtrs e :: *
type instance ArrayPtrs Float         = Ptr Float
type instance ArrayPtrs Double        = Ptr Double
type instance ArrayPtrs (Vec2 Float)  = Ptr Float
type instance ArrayPtrs (Vec2 Double) = Ptr Double

encodeTranspose :: Transpose -> C.Transpose
encodeTranspose :: Transpose -> Transpose
encodeTranspose Transpose
N = Transpose
C.NoTrans
encodeTranspose Transpose
T = Transpose
C.Trans
encodeTranspose Transpose
H = Transpose
C.ConjTrans

{-# INLINE withArray #-}
withArray
    :: NumericR s e
    -> Array sh e
    -> (ArrayPtrs e -> IO b)
    -> IO b
withArray :: NumericR s e -> Array sh e -> (ArrayPtrs e -> IO b) -> IO b
withArray NumericR s e
nR (Array sh
_ ArrayData e
ad) ArrayPtrs e -> IO b
k = NumericR s e -> ArrayData e -> (ArrayPtrs e -> IO b) -> IO b
forall s e b.
NumericR s e -> ArrayData e -> (ArrayPtrs e -> IO b) -> IO b
withArrayData NumericR s e
nR ArrayData e
ad ArrayPtrs e -> IO b
k

{-# INLINE withArrayData #-}
withArrayData
    :: NumericR s e
    -> ArrayData e
    -> (ArrayPtrs e -> IO b)
    -> IO b
withArrayData :: NumericR s e -> ArrayData e -> (ArrayPtrs e -> IO b) -> IO b
withArrayData NumericR s e
NumericRfloat32   = ArrayData e -> (ArrayPtrs e -> IO b) -> IO b
forall a b. UniqueArray a -> (Ptr a -> IO b) -> IO b
withUniqueArrayPtr
withArrayData NumericR s e
NumericRfloat64   = ArrayData e -> (ArrayPtrs e -> IO b) -> IO b
forall a b. UniqueArray a -> (Ptr a -> IO b) -> IO b
withUniqueArrayPtr
withArrayData NumericR s e
NumericRcomplex32 = ArrayData e -> (ArrayPtrs e -> IO b) -> IO b
forall a b. UniqueArray a -> (Ptr a -> IO b) -> IO b
withUniqueArrayPtr
withArrayData NumericR s e
NumericRcomplex64 = ArrayData e -> (ArrayPtrs e -> IO b) -> IO b
forall a b. UniqueArray a -> (Ptr a -> IO b) -> IO b
withUniqueArrayPtr