packages feed

bytebuild-0.3.16.1: src-checked/Op.hs

{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnboxedTuples #-}

module Op
  ( writeCharArray#
  , copyByteArray#
  , copyMutableByteArray#
  ) where

import GHC.Exts (ByteArray#, Char#, Int#, MutableByteArray#, State#, (<#), (>=#))
import qualified GHC.Exts as Exts
import GHC.Int (Int (I#))

writeCharArray# :: MutableByteArray# s -> Int# -> Char# -> State# s -> State# s
writeCharArray# arr i v st = case i <# 0# of
  1# -> error ("writeCharArray#: negative index " ++ show (I# i))
  _ -> case Exts.getSizeofMutableByteArray# arr st of
    (# st', sz #) -> case i >=# sz of
      1# -> error ("writeCharArray#: index " ++ show (I# i) ++ " >= length " ++ show (I# sz))
      _ -> Exts.writeCharArray# arr i v st'

copyByteArray# :: ByteArray# -> Int# -> MutableByteArray# s -> Int# -> Int# -> State# s -> State# s
copyByteArray# src soff dst doff len s0 =
  case Exts.getSizeofMutableByteArray# dst s0 of
    (# s1, sz #)
      | I# soff >= 0
      , I# doff >= 0
      , I# len >= 0
      , I# doff + I# len <= I# sz
      , I# soff + I# len <= I# (Exts.sizeofByteArray# src) ->
          Exts.copyByteArray# src soff dst doff len s1
      | otherwise -> error "copyByteArray#: index range out of bounds"

copyMutableByteArray# :: MutableByteArray# s -> Int# -> MutableByteArray# s -> Int# -> Int# -> State# s -> State# s
copyMutableByteArray# src soff dst doff len s0 =
  case Exts.getSizeofMutableByteArray# dst s0 of
    (# s1, szDst #) -> case Exts.getSizeofMutableByteArray# src s1 of
      (# s2, szSrc #)
        | I# soff >= 0
        , I# doff >= 0
        , I# len >= 0
        , I# doff + I# len <= I# szDst
        , I# soff + I# len <= I# szSrc ->
            Exts.copyMutableByteArray# src soff dst doff len s2
        | otherwise -> error "copyMutableByteArray#: index range out of bounds"