{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Data.Massiv.Array.Unsafe
(
unsafeMakeLoadArray
, unsafeMakeLoadArrayAdjusted
, Sz(SafeSz)
, Stride(SafeStride)
, unsafeIndex
, unsafeLinearIndex
, unsafeLinearIndexM
, unsafeBackpermute
, unsafeResize
, unsafeExtract
, unsafeTransform
, unsafeTransform2
, unsafeSlice
, unsafeOuterSlice
, unsafeInnerSlice
, unsafeLinearSlice
, unsafeThaw
, unsafeFreeze
, unsafeNew
, unsafeLoadIntoS
, unsafeLoadIntoM
, unsafeCreateArray
, unsafeCreateArray_
, unsafeCreateArrayS
, unsafeRead
, unsafeLinearRead
, unsafeWrite
, unsafeLinearWrite
, unsafeModify
, unsafeLinearModify
, unsafeSwap
, unsafeLinearSwap
, unsafeLinearSet
, unsafeLinearCopy
, unsafeArrayLinearCopy
, unsafeLinearShrink
, unsafeLinearGrow
, unsafeMallocMArray
, unsafeWithPtr
, unsafeArrayToForeignPtr
, unsafeMArrayToForeignPtr
, unsafeArrayFromForeignPtr
, unsafeArrayFromForeignPtr0
, unsafeMArrayFromForeignPtr
, unsafeMArrayFromForeignPtr0
, unsafeAtomicReadIntArray
, unsafeAtomicWriteIntArray
, unsafeAtomicModifyIntArray
, unsafeAtomicAddIntArray
, unsafeAtomicSubIntArray
, unsafeAtomicAndIntArray
, unsafeAtomicNandIntArray
, unsafeAtomicOrIntArray
, unsafeAtomicXorIntArray
, unsafeCasIntArray
, coerceBoxedArray
, coerceNormalBoxedArray
, unsafeUnstablePartitionRegionM
, module Data.Massiv.Vector.Unsafe
, module Data.Massiv.Array.Stencil.Unsafe
) where
import Data.Massiv.Array.Delayed.Pull (D)
import Data.Massiv.Array.Delayed.Push (unsafeMakeLoadArray, unsafeMakeLoadArrayAdjusted)
import Data.Massiv.Array.Manifest.Boxed
import Data.Massiv.Array.Manifest.Primitive
import Data.Massiv.Array.Manifest.Storable
import Data.Massiv.Array.Mutable.Internal
import Data.Massiv.Array.Ops.Sort (unsafeUnstablePartitionRegionM)
import Data.Massiv.Core.Common
import Data.Massiv.Core.Index.Stride (Stride(SafeStride))
import Data.Massiv.Vector.Unsafe
import Data.Massiv.Array.Stencil.Unsafe
unsafeBackpermute :: (Source r' ix' e, Index ix) =>
Sz ix -> (ix -> ix') -> Array r' ix' e -> Array D ix e
unsafeBackpermute :: Sz ix -> (ix -> ix') -> Array r' ix' e -> Array D ix e
unsafeBackpermute !Sz ix
sz ix -> ix'
ixF !Array r' ix' e
arr =
Comp -> Sz ix -> (ix -> e) -> Array D ix e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray (Array r' ix' e -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r' ix' e
arr) Sz ix
sz ((ix -> e) -> Array D ix e) -> (ix -> e) -> Array D ix e
forall a b. (a -> b) -> a -> b
$ \ !ix
ix -> Array r' ix' e -> ix' -> e
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r' ix' e
arr (ix -> ix'
ixF ix
ix)
{-# INLINE unsafeBackpermute #-}
unsafeTransform ::
(Source r' ix' e', Index ix)
=> (Sz ix' -> (Sz ix, a))
-> (a -> (ix' -> e') -> ix -> e)
-> Array r' ix' e'
-> Array D ix e
unsafeTransform :: (Sz ix' -> (Sz ix, a))
-> (a -> (ix' -> e') -> ix -> e) -> Array r' ix' e' -> Array D ix e
unsafeTransform Sz ix' -> (Sz ix, a)
getSz a -> (ix' -> e') -> ix -> e
get Array r' ix' e'
arr = Comp -> Sz ix -> (ix -> e) -> Array D ix e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray (Array r' ix' e' -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r' ix' e'
arr) Sz ix
sz (a -> (ix' -> e') -> ix -> e
get a
a (Array r' ix' e' -> ix' -> e'
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r' ix' e'
arr))
where
(Sz ix
sz, a
a) = Sz ix' -> (Sz ix, a)
getSz (Array r' ix' e' -> Sz ix'
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r' ix' e'
arr)
{-# INLINE unsafeTransform #-}
unsafeTransform2 ::
(Source r1 ix1 e1, Source r2 ix2 e2, Index ix)
=> (Sz ix1 -> Sz ix2 -> (Sz ix, a))
-> (a -> (ix1 -> e1) -> (ix2 -> e2) -> ix -> e)
-> Array r1 ix1 e1
-> Array r2 ix2 e2
-> Array D ix e
unsafeTransform2 :: (Sz ix1 -> Sz ix2 -> (Sz ix, a))
-> (a -> (ix1 -> e1) -> (ix2 -> e2) -> ix -> e)
-> Array r1 ix1 e1
-> Array r2 ix2 e2
-> Array D ix e
unsafeTransform2 Sz ix1 -> Sz ix2 -> (Sz ix, a)
getSz a -> (ix1 -> e1) -> (ix2 -> e2) -> ix -> e
get Array r1 ix1 e1
arr1 Array r2 ix2 e2
arr2 =
Comp -> Sz ix -> (ix -> e) -> Array D ix e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray (Array r1 ix1 e1 -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r1 ix1 e1
arr1 Comp -> Comp -> Comp
forall a. Semigroup a => a -> a -> a
<> Array r2 ix2 e2 -> Comp
forall r ix e. Load r ix e => Array r ix e -> Comp
getComp Array r2 ix2 e2
arr2) Sz ix
sz (a -> (ix1 -> e1) -> (ix2 -> e2) -> ix -> e
get a
a (Array r1 ix1 e1 -> ix1 -> e1
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r1 ix1 e1
arr1) (Array r2 ix2 e2 -> ix2 -> e2
forall r ix e. Source r ix e => Array r ix e -> ix -> e
unsafeIndex Array r2 ix2 e2
arr2))
where
(Sz ix
sz, a
a) = Sz ix1 -> Sz ix2 -> (Sz ix, a)
getSz (Array r1 ix1 e1 -> Sz ix1
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r1 ix1 e1
arr1) (Array r2 ix2 e2 -> Sz ix2
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array r2 ix2 e2
arr2)
{-# INLINE unsafeTransform2 #-}