{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, RoleAnnotations #-}{-# OPTIONS_HADDOCK not-home #-}------------------------------------------------------------------------------- |-- Module : Data.Array.Storable.Internals-- Copyright : (c) The University of Glasgow 2011-- License : BSD-style (see the file libraries/base/LICENSE)---- Maintainer : libraries@haskell.org-- Stability : experimental-- Portability : non-portable (uses Data.Array.MArray)---- Actual implementation of "Data.Array.Storable".---- @since 0.4.0.0---- = WARNING---- This module is considered __internal__.---- The Package Versioning Policy __does not apply__.---- The contents of this module may change __in any way whatsoever__-- and __without any warning__ between minor versions of this package.---- Authors importing this module are expected to track development-- closely.-----------------------------------------------------------------------------moduleData.Array.Storable.Internals(StorableArray (..),withStorableArray ,touchStorableArray ,unsafeForeignPtrToStorableArray ,)whereimportData.Array.Base importData.Array.MArray importForeignhiding(newArray)-- |The array typedataStorableArray i e =StorableArray !i !i Int!(ForeignPtre )-- Both parameters have class-based invariants. See also #9220.typeroleStorableArray nominalnominalinstanceStorablee =>MArray StorableArray e IOwheregetBounds :: forall i. Ix i => StorableArray i e -> IO (i, i)
getBounds (StorableArray i
l i
u Int
_ForeignPtr e
_)=(i, i) -> IO (i, i)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return(i
l ,i
u )getNumElements :: forall i. Ix i => StorableArray i e -> IO Int
getNumElements (StorableArray i
_l i
_u Int
n ForeignPtr e
_)=Int -> IO Int
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
returnInt
n newArray :: forall i. Ix i => (i, i) -> e -> IO (StorableArray i e)
newArray (i
l ,i
u )e
initialValue =doForeignPtr e
fp <-Int -> IO (ForeignPtr e)
forall a. Storable a => Int -> IO (ForeignPtr a)
mallocForeignPtrArrayInt
size ForeignPtr e -> (Ptr e -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtrForeignPtr e
fp ((Ptr e -> IO ()) -> IO ()) -> (Ptr e -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$\Ptr e
a ->[IO ()] -> IO ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_[Ptr e -> Int -> e -> IO ()
forall a. Storable a => Ptr a -> Int -> a -> IO ()
pokeElemOffPtr e
a Int
i e
initialValue |Int
i <-[Int
0..Int
size Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1]]StorableArray i e -> IO (StorableArray i e)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return(i -> i -> Int -> ForeignPtr e -> StorableArray i e
forall i e. i -> i -> Int -> ForeignPtr e -> StorableArray i e
StorableArray i
l i
u Int
size ForeignPtr e
fp )wheresize :: Int
size =(i, i) -> Int
forall a. Ix a => (a, a) -> Int
rangeSize(i
l ,i
u )unsafeNewArray_ :: forall i. Ix i => (i, i) -> IO (StorableArray i e)
unsafeNewArray_ (i
l ,i
u )=doletn :: Int
n =(i, i) -> Int
forall a. Ix a => (a, a) -> Int
rangeSize(i
l ,i
u )ForeignPtr e
fp <-Int -> IO (ForeignPtr e)
forall a. Storable a => Int -> IO (ForeignPtr a)
mallocForeignPtrArrayInt
n StorableArray i e -> IO (StorableArray i e)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return(i -> i -> Int -> ForeignPtr e -> StorableArray i e
forall i e. i -> i -> Int -> ForeignPtr e -> StorableArray i e
StorableArray i
l i
u Int
n ForeignPtr e
fp )newArray_ :: forall i. Ix i => (i, i) -> IO (StorableArray i e)
newArray_ =(i, i) -> IO (StorableArray i e)
forall i. Ix i => (i, i) -> IO (StorableArray i e)
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
(i, i) -> m (a i e)
unsafeNewArray_ unsafeRead :: forall i. Ix i => StorableArray i e -> Int -> IO e
unsafeRead (StorableArray i
_i
_Int
_ForeignPtr e
fp )Int
i =ForeignPtr e -> (Ptr e -> IO e) -> IO e
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtrForeignPtr e
fp ((Ptr e -> IO e) -> IO e) -> (Ptr e -> IO e) -> IO e
forall a b. (a -> b) -> a -> b
$\Ptr e
a ->Ptr e -> Int -> IO e
forall a. Storable a => Ptr a -> Int -> IO a
peekElemOffPtr e
a Int
i unsafeWrite :: forall i. Ix i => StorableArray i e -> Int -> e -> IO ()
unsafeWrite (StorableArray i
_i
_Int
_ForeignPtr e
fp )Int
i e
e =ForeignPtr e -> (Ptr e -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtrForeignPtr e
fp ((Ptr e -> IO ()) -> IO ()) -> (Ptr e -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$\Ptr e
a ->Ptr e -> Int -> e -> IO ()
forall a. Storable a => Ptr a -> Int -> a -> IO ()
pokeElemOffPtr e
a Int
i e
e -- |The pointer to the array contents is obtained by 'withStorableArray'.-- The idea is similar to 'ForeignPtr' (used internally here).-- The pointer should be used only during execution of the 'IO' action-- retured by the function passed as argument to 'withStorableArray'.withStorableArray ::StorableArray i e ->(Ptre ->IOa )->IOa withStorableArray :: forall i e a. StorableArray i e -> (Ptr e -> IO a) -> IO a
withStorableArray (StorableArray i
_i
_Int
_ForeignPtr e
fp )Ptr e -> IO a
f =ForeignPtr e -> (Ptr e -> IO a) -> IO a
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtrForeignPtr e
fp Ptr e -> IO a
f -- |If you want to use it afterwards, ensure that you-- 'touchStorableArray' after the last use of the pointer,-- so the array is not freed too early.touchStorableArray ::StorableArray i e ->IO()touchStorableArray :: forall i e. StorableArray i e -> IO ()
touchStorableArray (StorableArray i
_i
_Int
_ForeignPtr e
fp )=ForeignPtr e -> IO ()
forall a. ForeignPtr a -> IO ()
touchForeignPtrForeignPtr e
fp -- |Construct a 'StorableArray' from an arbitrary 'ForeignPtr'. It is-- the caller's responsibility to ensure that the 'ForeignPtr' points to-- an area of memory sufficient for the specified bounds.unsafeForeignPtrToStorableArray ::Ixi =>ForeignPtre ->(i ,i )->IO(StorableArray i e )unsafeForeignPtrToStorableArray :: forall i e.
Ix i =>
ForeignPtr e -> (i, i) -> IO (StorableArray i e)
unsafeForeignPtrToStorableArray ForeignPtr e
p (i
l ,i
u )=StorableArray i e -> IO (StorableArray i e)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return(i -> i -> Int -> ForeignPtr e -> StorableArray i e
forall i e. i -> i -> Int -> ForeignPtr e -> StorableArray i e
StorableArray i
l i
u ((i, i) -> Int
forall a. Ix a => (a, a) -> Int
rangeSize(i
l ,i
u ))ForeignPtr e
p )

AltStyle によって変換されたページ (->オリジナル) /