{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnboxedTuples #-}

module GHC.Prim.Compat (
    -- * Indexing Functions
    indexWord8Array#,indexWord16Array#,indexWord32Array#,indexWord64Array#,
    readWord8Array#,readWord16Array#,readWord32Array#,readWord64Array#,
    writeWord8Array#,writeWord16Array#,writeWord32Array#,writeWord64Array#,
    indexWord8OffAddr#,indexWord16OffAddr#,indexWord32OffAddr#,indexWord64OffAddr#,
    readWord8OffAddr#,readWord16OffAddr#,readWord32OffAddr#,readWord64OffAddr#,
    writeWord8OffAddr#,writeWord16OffAddr#,writeWord32OffAddr#,writeWord64OffAddr#) where

#if MIN_VERSION_ghc_prim(0,8,0)
import GHC.Prim (
    Addr#,ByteArray#,Int#,MutableByteArray#,State#,Word#,
    wordToWord8#,wordToWord16#,wordToWord32#,
    word8ToWord#,word16ToWord#,word32ToWord#
#if MIN_VERSION_ghc_prim(0,9,0)
    ,wordToWord64#,word64ToWord#
#endif
    )
import qualified GHC.Prim as Prim
#else
import GHC.Prim (
    indexWord8Array#,indexWord16Array#,indexWord32Array#,indexWord64Array#,
    readWord8Array#,readWord16Array#,readWord32Array#,readWord64Array#,
    writeWord8Array#,writeWord16Array#,writeWord32Array#,writeWord64Array#,
    indexWord8OffAddr#,indexWord16OffAddr#,indexWord32OffAddr#,indexWord64OffAddr#,
    readWord8OffAddr#,readWord16OffAddr#,readWord32OffAddr#,readWord64OffAddr#,
    writeWord8OffAddr#,writeWord16OffAddr#,writeWord32OffAddr#,writeWord64OffAddr#)
#endif


#if MIN_VERSION_ghc_prim(0,8,0)

#if !MIN_VERSION_ghc_prim(0,9,0)
wordToWord64#, word64ToWord# :: Word# -> Word#
wordToWord64# :: Word# -> Word#
wordToWord64# Word#
w = Word#
w
word64ToWord# :: Word# -> Word#
word64ToWord# Word#
w = Word#
w
{-# INLINE wordToWord64# #-}
{-# INLINE word64ToWord# #-}
#endif

indexWord8Array# :: ByteArray# -> Int# -> Word#
indexWord8Array# :: ByteArray# -> Int# -> Word#
indexWord8Array# ByteArray#
arr Int#
i = Word8# -> Word#
word8ToWord# (ByteArray# -> Int# -> Word8#
Prim.indexWord8Array# ByteArray#
arr Int#
i)
{-# INLINE indexWord8Array# #-}

indexWord16Array# :: ByteArray# -> Int# -> Word#
indexWord16Array# :: ByteArray# -> Int# -> Word#
indexWord16Array# ByteArray#
arr Int#
i = Word16# -> Word#
word16ToWord# (ByteArray# -> Int# -> Word16#
Prim.indexWord16Array# ByteArray#
arr Int#
i)
{-# INLINE indexWord16Array# #-}

indexWord32Array# :: ByteArray# -> Int# -> Word#
indexWord32Array# :: ByteArray# -> Int# -> Word#
indexWord32Array# ByteArray#
arr Int#
i = Word32# -> Word#
word32ToWord# (ByteArray# -> Int# -> Word32#
Prim.indexWord32Array# ByteArray#
arr Int#
i)
{-# INLINE indexWord32Array# #-}

indexWord64Array# :: ByteArray# -> Int# -> Word#
indexWord64Array# :: ByteArray# -> Int# -> Word#
indexWord64Array# ByteArray#
arr Int#
i = Word# -> Word#
word64ToWord# (ByteArray# -> Int# -> Word#
Prim.indexWord64Array# ByteArray#
arr Int#
i)
{-# INLINE indexWord64Array# #-}

readWord8Array# :: MutableByteArray# d -> Int# -> State# d -> (# State# d, Word# #)
readWord8Array# :: forall d.
MutableByteArray# d -> Int# -> State# d -> (# State# d, Word# #)
readWord8Array# MutableByteArray# d
arr Int#
ix State# d
st =
  let !(# State# d
st', Word8#
v #) = forall d.
MutableByteArray# d -> Int# -> State# d -> (# State# d, Word8# #)
Prim.readWord8Array# MutableByteArray# d
arr Int#
ix State# d
st
   in (# State# d
st', Word8# -> Word#
word8ToWord# Word8#
v #)
{-# INLINE readWord8Array# #-}

readWord16Array# :: MutableByteArray# d -> Int# -> State# d -> (# State# d, Word# #)
readWord16Array# :: forall d.
MutableByteArray# d -> Int# -> State# d -> (# State# d, Word# #)
readWord16Array# MutableByteArray# d
arr Int#
ix State# d
st =
  let !(# State# d
st', Word16#
v #) = forall d.
MutableByteArray# d -> Int# -> State# d -> (# State# d, Word16# #)
Prim.readWord16Array# MutableByteArray# d
arr Int#
ix State# d
st
   in (# State# d
st', Word16# -> Word#
word16ToWord# Word16#
v #)
{-# INLINE readWord16Array# #-}

readWord32Array# :: MutableByteArray# d -> Int# -> State# d -> (# State# d, Word# #)
readWord32Array# :: forall d.
MutableByteArray# d -> Int# -> State# d -> (# State# d, Word# #)
readWord32Array# MutableByteArray# d
arr Int#
ix State# d
st =
  let !(# State# d
st', Word32#
v #) = forall d.
MutableByteArray# d -> Int# -> State# d -> (# State# d, Word32# #)
Prim.readWord32Array# MutableByteArray# d
arr Int#
ix State# d
st
   in (# State# d
st', Word32# -> Word#
word32ToWord# Word32#
v #)
{-# INLINE readWord32Array# #-}

readWord64Array# :: MutableByteArray# d -> Int# -> State# d -> (# State# d, Word# #)
readWord64Array# :: forall d.
MutableByteArray# d -> Int# -> State# d -> (# State# d, Word# #)
readWord64Array# MutableByteArray# d
arr Int#
ix State# d
st =
  let !(# State# d
st', Word#
v #) = forall d.
MutableByteArray# d -> Int# -> State# d -> (# State# d, Word# #)
Prim.readWord64Array# MutableByteArray# d
arr Int#
ix State# d
st
   in (# State# d
st', Word# -> Word#
word64ToWord# Word#
v #)
{-# INLINE readWord64Array# #-}

writeWord8Array# :: MutableByteArray# d -> Int# -> Word# -> State# d -> State# d
writeWord8Array# :: forall d.
MutableByteArray# d -> Int# -> Word# -> State# d -> State# d
writeWord8Array# MutableByteArray# d
arr Int#
ix Word#
v State# d
st = forall d.
MutableByteArray# d -> Int# -> Word8# -> State# d -> State# d
Prim.writeWord8Array# MutableByteArray# d
arr Int#
ix (Word# -> Word8#
wordToWord8# Word#
v) State# d
st
{-# INLINE writeWord8Array# #-}

writeWord16Array# :: MutableByteArray# d -> Int# -> Word# -> State# d -> State# d
writeWord16Array# :: forall d.
MutableByteArray# d -> Int# -> Word# -> State# d -> State# d
writeWord16Array# MutableByteArray# d
arr Int#
ix Word#
v State# d
st = forall d.
MutableByteArray# d -> Int# -> Word16# -> State# d -> State# d
Prim.writeWord16Array# MutableByteArray# d
arr Int#
ix (Word# -> Word16#
wordToWord16# Word#
v) State# d
st
{-# INLINE writeWord16Array# #-}

writeWord32Array# :: MutableByteArray# d -> Int# -> Word# -> State# d -> State# d
writeWord32Array# :: forall d.
MutableByteArray# d -> Int# -> Word# -> State# d -> State# d
writeWord32Array# MutableByteArray# d
arr Int#
ix Word#
v State# d
st = forall d.
MutableByteArray# d -> Int# -> Word32# -> State# d -> State# d
Prim.writeWord32Array# MutableByteArray# d
arr Int#
ix (Word# -> Word32#
wordToWord32# Word#
v) State# d
st
{-# INLINE writeWord32Array# #-}

writeWord64Array# :: MutableByteArray# d -> Int# -> Word# -> State# d -> State# d
writeWord64Array# :: forall d.
MutableByteArray# d -> Int# -> Word# -> State# d -> State# d
writeWord64Array# MutableByteArray# d
arr Int#
ix Word#
v State# d
st = forall d.
MutableByteArray# d -> Int# -> Word# -> State# d -> State# d
Prim.writeWord64Array# MutableByteArray# d
arr Int#
ix (Word# -> Word#
wordToWord64# Word#
v) State# d
st
{-# INLINE writeWord64Array# #-}

indexWord8OffAddr# :: Addr# -> Int# -> Word#
indexWord8OffAddr# :: Addr# -> Int# -> Word#
indexWord8OffAddr# Addr#
addr Int#
off = Word8# -> Word#
word8ToWord# (Addr# -> Int# -> Word8#
Prim.indexWord8OffAddr# Addr#
addr Int#
off)
{-# INLINE indexWord8OffAddr# #-}

indexWord16OffAddr# :: Addr# -> Int# -> Word#
indexWord16OffAddr# :: Addr# -> Int# -> Word#
indexWord16OffAddr# Addr#
addr Int#
off = Word16# -> Word#
word16ToWord# (Addr# -> Int# -> Word16#
Prim.indexWord16OffAddr# Addr#
addr Int#
off)
{-# INLINE indexWord16OffAddr# #-}

indexWord32OffAddr# :: Addr# -> Int# -> Word#
indexWord32OffAddr# :: Addr# -> Int# -> Word#
indexWord32OffAddr# Addr#
addr Int#
off = Word32# -> Word#
word32ToWord# (Addr# -> Int# -> Word32#
Prim.indexWord32OffAddr# Addr#
addr Int#
off)
{-# INLINE indexWord32OffAddr# #-}

indexWord64OffAddr# :: Addr# -> Int# -> Word#
indexWord64OffAddr# :: Addr# -> Int# -> Word#
indexWord64OffAddr# Addr#
addr Int#
off = Word# -> Word#
word64ToWord# (Addr# -> Int# -> Word#
Prim.indexWord64OffAddr# Addr#
addr Int#
off)
{-# INLINE indexWord64OffAddr# #-}

readWord8OffAddr# :: Addr# -> Int# -> State# d -> (# State# d, Word# #)
readWord8OffAddr# :: forall d. Addr# -> Int# -> State# d -> (# State# d, Word# #)
readWord8OffAddr# Addr#
addr Int#
off State# d
st =
  let !(# State# d
st', Word8#
v #) = forall d. Addr# -> Int# -> State# d -> (# State# d, Word8# #)
Prim.readWord8OffAddr# Addr#
addr Int#
off State# d
st
   in (# State# d
st', Word8# -> Word#
word8ToWord# Word8#
v #)
{-# INLINE readWord8OffAddr# #-}

readWord16OffAddr# :: Addr# -> Int# -> State# d -> (# State# d, Word# #)
readWord16OffAddr# :: forall d. Addr# -> Int# -> State# d -> (# State# d, Word# #)
readWord16OffAddr# Addr#
addr Int#
off State# d
st =
  let !(# State# d
st', Word16#
v #) = forall d. Addr# -> Int# -> State# d -> (# State# d, Word16# #)
Prim.readWord16OffAddr# Addr#
addr Int#
off State# d
st
   in (# State# d
st', Word16# -> Word#
word16ToWord# Word16#
v #)
{-# INLINE readWord16OffAddr# #-}

readWord32OffAddr# :: Addr# -> Int# -> State# d -> (# State# d, Word# #)
readWord32OffAddr# :: forall d. Addr# -> Int# -> State# d -> (# State# d, Word# #)
readWord32OffAddr# Addr#
addr Int#
off State# d
st =
  let !(# State# d
st', Word32#
v #) = forall d. Addr# -> Int# -> State# d -> (# State# d, Word32# #)
Prim.readWord32OffAddr# Addr#
addr Int#
off State# d
st
   in (# State# d
st', Word32# -> Word#
word32ToWord# Word32#
v #)
{-# INLINE readWord32OffAddr# #-}

readWord64OffAddr# :: Addr# -> Int# -> State# d -> (# State# d, Word# #)
readWord64OffAddr# :: forall d. Addr# -> Int# -> State# d -> (# State# d, Word# #)
readWord64OffAddr# Addr#
addr Int#
off State# d
st =
  let !(# State# d
st', Word#
v #) = forall d. Addr# -> Int# -> State# d -> (# State# d, Word# #)
Prim.readWord64OffAddr# Addr#
addr Int#
off State# d
st
   in (# State# d
st', Word# -> Word#
word64ToWord# Word#
v #)
{-# INLINE readWord64OffAddr# #-}

writeWord8OffAddr# :: Addr# -> Int# -> Word# -> State# d -> State# d
writeWord8OffAddr# :: forall d. Addr# -> Int# -> Word# -> State# d -> State# d
writeWord8OffAddr# Addr#
addr Int#
off Word#
v State# d
st =
  forall d. Addr# -> Int# -> Word8# -> State# d -> State# d
Prim.writeWord8OffAddr# Addr#
addr Int#
off (Word# -> Word8#
wordToWord8# Word#
v) State# d
st
{-# INLINE writeWord8OffAddr# #-}

writeWord16OffAddr# :: Addr# -> Int# -> Word# -> State# d -> State# d
writeWord16OffAddr# :: forall d. Addr# -> Int# -> Word# -> State# d -> State# d
writeWord16OffAddr# Addr#
addr Int#
off Word#
v State# d
st =
  forall d. Addr# -> Int# -> Word16# -> State# d -> State# d
Prim.writeWord16OffAddr# Addr#
addr Int#
off (Word# -> Word16#
wordToWord16# Word#
v) State# d
st
{-# INLINE writeWord16OffAddr# #-}

writeWord32OffAddr# :: Addr# -> Int# -> Word# -> State# d -> State# d
writeWord32OffAddr# :: forall d. Addr# -> Int# -> Word# -> State# d -> State# d
writeWord32OffAddr# Addr#
addr Int#
off Word#
v State# d
st =
  forall d. Addr# -> Int# -> Word32# -> State# d -> State# d
Prim.writeWord32OffAddr# Addr#
addr Int#
off (Word# -> Word32#
wordToWord32# Word#
v) State# d
st
{-# INLINE writeWord32OffAddr# #-}

writeWord64OffAddr# :: Addr# -> Int# -> Word# -> State# d -> State# d
writeWord64OffAddr# :: forall d. Addr# -> Int# -> Word# -> State# d -> State# d
writeWord64OffAddr# Addr#
addr Int#
off Word#
v State# d
st =
  forall d. Addr# -> Int# -> Word# -> State# d -> State# d
Prim.writeWord64OffAddr# Addr#
addr Int#
off (Word# -> Word#
wordToWord64# Word#
v) State# d
st
{-# INLINE writeWord64OffAddr# #-}

#endif