    -- |
    -- Module      : Data.Vector.Storable.Internal
    -- Copyright   : (c) Roman Leshchinskiy 2009-2010
    -- License     : BSD-style
    --
    -- Maintainer  : Roman Leshchinskiy <rl@cse.unsw.edu.au>
    -- Stability   : experimental
    -- Portability : non-portable
    --
    -- Ugly internal utility functions for implementing 'Storable'-based vectors.
    --

    module Data.Vector.Storable.Internal (
      getPtr, setPtr, updPtr
    ) where

    import Control.Monad.Primitive ( unsafeInlineIO )
    import Foreign.Storable
    import Foreign.ForeignPtr
    import Foreign.Ptr
    import Foreign.Marshal.Array ( advancePtr )
    import GHC.Base         ( quotInt )
    import GHC.ForeignPtr   ( ForeignPtr(..) )
    import GHC.Ptr          ( Ptr(..) )

    getPtr :: ForeignPtr a -> Ptr a
    {-# INLINE getPtr #-}
    getPtr (ForeignPtr addr _) = Ptr addr

    setPtr :: ForeignPtr a -> Ptr a -> ForeignPtr a
    {-# INLINE setPtr #-}
    setPtr (ForeignPtr _ c) (Ptr addr) = ForeignPtr addr c

    updPtr :: (Ptr a -> Ptr a) -> ForeignPtr a -> ForeignPtr a
    {-# INLINE updPtr #-}
    updPtr f (ForeignPtr p c) = case f (Ptr p) of { Ptr q -> ForeignPtr q c }