{-# LANGUAGE UnicodeSyntax, NoImplicitPrelude, KindSignatures #-} ------------------------------------------------------------------------------- -- | -- Module : Foreign.Ptr.Region -- Copyright : (c) 2010-2011 Bas van Dijk -- License : BSD3 (see the file LICENSE) -- Maintainer : Bas van Dijk -- ------------------------------------------------------------------------------- module Foreign.Ptr.Region ( {-| Note that this module re-exports the @Control.Monad.Trans.Region@ module from the @regions@ package which allows you to run regions using 'runRegionT' and duplicate a 'RegionalPtr' to a parent region using 'dup'. -} module Control.Monad.Trans.Region -- * Regional pointers , RegionalPtr -- * Null pointers , nullPtr, NullPtr -- * Class of pointers , Pointer(mapPointer) , AllocatedPointer -- * Pure functions on pointers , castPtr , alignPtr , plusPtr , minusPtr ) where -------------------------------------------------------------------------------- -- Imports -------------------------------------------------------------------------------- -- from base: import Data.Int ( Int ) import qualified Foreign.Ptr as FP ( castPtr, plusPtr, alignPtr, minusPtr ) -- from regions: import Control.Monad.Trans.Region -- (re-exported entirely) -- from ourselves: import Foreign.Ptr.Region.Internal ( RegionalPtr , NullPtr, nullPtr , Pointer(unsafePtr, mapPointer) , AllocatedPointer ) -------------------------------------------------------------------------------- -- * Pure functions on regional pointers -------------------------------------------------------------------------------- -- | The @castPtr@ function casts a pointer from one type to another. -- -- Wraps: @Foreign.Ptr.@'FP.castPtr' castPtr ∷ Pointer pointer ⇒ pointer α r → pointer β r castPtr = mapPointer FP.castPtr -- | Given an arbitrary address and an alignment constraint, @alignPtr@ yields -- the next higher address that fulfills the alignment constraint. An alignment -- constraint @x@ is fulfilled by any address divisible by @x@. This operation -- is idempotent. -- -- Wraps: @Foreign.Ptr.@'FP.alignPtr' alignPtr ∷ AllocatedPointer pointer ⇒ pointer α r → Int → pointer α r alignPtr pointer n = mapPointer (\ptr → FP.alignPtr ptr n) pointer -- | Advances the given address by the given offset in bytes. -- -- Wraps: @Foreign.Ptr.@'FP.plusPtr' plusPtr ∷ AllocatedPointer pointer ⇒ pointer α r → Int → pointer β r plusPtr pointer n = mapPointer (\ptr → FP.plusPtr ptr n) pointer -- | Computes the offset required to get from the second to the first -- argument. We have -- -- > p2 == p1 `plusPtr` (p2 `minusPtr` p1) -- -- Wraps: @Foreign.Ptr.@'FP.minusPtr' minusPtr ∷ AllocatedPointer pointer ⇒ pointer α r1 → pointer β r2 → Int minusPtr pointer1 pointer2 = FP.minusPtr (unsafePtr pointer1) (unsafePtr pointer2) -- The End ---------------------------------------------------------------------