{-# LANGUAGE BangPatterns, MagicHash, UnboxedTuples #-}
{-# OPTIONS_GHC -O2 #-}
-- We always optimise this, otherwise performance of a non-optimised
-- compiler is severely affected
--
-- (c) The University of Glasgow 2002-2006
--
-- Unboxed mutable Ints

module GHC.Data.FastMutInt(
        FastMutInt, newFastMutInt,
        readFastMutInt, writeFastMutInt,
        atomicFetchAddFastMut
  ) where

import GHC.Prelude.Basic

import GHC.Base

data FastMutInt = FastMutInt !(MutableByteArray# RealWorld)

newFastMutInt :: Int -> IO FastMutInt
newFastMutInt :: Int -> IO FastMutInt
newFastMutInt Int
n = do
    FastMutInt
x <- IO FastMutInt
create
    FastMutInt -> Int -> IO ()
writeFastMutInt FastMutInt
x Int
n
    forall (m :: * -> *) a. Monad m => a -> m a
return FastMutInt
x
  where
    !(I# Int#
size) = forall b. FiniteBits b => b -> Int
finiteBitSize (Int
0 :: Int) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
3
    create :: IO FastMutInt
create = forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO forall a b. (a -> b) -> a -> b
$ \State# RealWorld
s ->
      case forall d. Int# -> State# d -> (# State# d, MutableByteArray# d #)
newByteArray# Int#
size State# RealWorld
s of
        (# State# RealWorld
s, MutableByteArray# RealWorld
arr #) -> (# State# RealWorld
s, MutableByteArray# RealWorld -> FastMutInt
FastMutInt MutableByteArray# RealWorld
arr #)

readFastMutInt :: FastMutInt -> IO Int
readFastMutInt :: FastMutInt -> IO Int
readFastMutInt (FastMutInt MutableByteArray# RealWorld
arr) = forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO forall a b. (a -> b) -> a -> b
$ \State# RealWorld
s ->
  case forall d.
MutableByteArray# d -> Int# -> State# d -> (# State# d, Int# #)
readIntArray# MutableByteArray# RealWorld
arr Int#
0# State# RealWorld
s of
    (# State# RealWorld
s, Int#
i #) -> (# State# RealWorld
s, Int# -> Int
I# Int#
i #)

writeFastMutInt :: FastMutInt -> Int -> IO ()
writeFastMutInt :: FastMutInt -> Int -> IO ()
writeFastMutInt (FastMutInt MutableByteArray# RealWorld
arr) (I# Int#
i) = forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO forall a b. (a -> b) -> a -> b
$ \State# RealWorld
s ->
  case forall d.
MutableByteArray# d -> Int# -> Int# -> State# d -> State# d
writeIntArray# MutableByteArray# RealWorld
arr Int#
0# Int#
i State# RealWorld
s of
    State# RealWorld
s -> (# State# RealWorld
s, () #)

atomicFetchAddFastMut :: FastMutInt -> Int -> IO Int
atomicFetchAddFastMut :: FastMutInt -> Int -> IO Int
atomicFetchAddFastMut (FastMutInt MutableByteArray# RealWorld
arr) (I# Int#
i) = forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO forall a b. (a -> b) -> a -> b
$ \State# RealWorld
s ->
  case forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchAddIntArray# MutableByteArray# RealWorld
arr Int#
0# Int#
i State# RealWorld
s of
    (# State# RealWorld
s, Int#
n #) -> (# State# RealWorld
s, Int# -> Int
I# Int#
n #)