hw-excess-0.2.2.0: src/HaskellWorks/Data/Excess/PartialMinExcess1.hs
module HaskellWorks.Data.Excess.PartialMinExcess1
( PartialMinExcess1(..)
) where
import Data.Word
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Excess.MinExcess
import qualified Data.Vector.Storable as DVS
import qualified HaskellWorks.Data.Excess.Internal.Branchless as BL
import qualified HaskellWorks.Data.Excess.Internal.Partial.Table as T
class PartialMinExcess1 a where
partialMinExcess1 :: Int -> a -> MinExcess
instance PartialMinExcess1 Word8 where
partialMinExcess1 n w = MinExcess partialMinExcessMin partialMinExcessAll
where partialMinExcessMin = fromIntegral $ DVS.unsafeIndex T.tableWord8Excess1Lo (n * 256 + fromIntegral w)
partialMinExcessAll = fromIntegral $ DVS.unsafeIndex T.tableWord8Excess1Ex (n * 256 + fromIntegral w)
{-# INLINE partialMinExcess1 #-}
instance PartialMinExcess1 Word16 where
partialMinExcess1 n w = MinExcess partialMinExcessMin partialMinExcessAll
where MinExcess aMin aAll = partialMinExcess1 8 (fromIntegral w :: Word8)
MinExcess bMin bAll = partialMinExcess1 (n - 8) (fromIntegral (w .>. 8) :: Word8)
partialMinExcessMin = if n <= 8 then aMin else BL.minInt aMin (aAll + bMin)
partialMinExcessAll = if n <= 8 then aAll else aAll + bAll
{-# INLINE partialMinExcess1 #-}
instance PartialMinExcess1 Word32 where
partialMinExcess1 n w = MinExcess partialMinExcessMin partialMinExcessAll
where MinExcess aMin aAll = partialMinExcess1 16 (fromIntegral w :: Word16)
MinExcess bMin bAll = partialMinExcess1 (n - 16) (fromIntegral (w .>. 16) :: Word16)
partialMinExcessMin = if n <= 8 then aMin else BL.minInt aMin (aAll + bMin)
partialMinExcessAll = if n <= 8 then aAll else aAll + bAll
{-# INLINE partialMinExcess1 #-}
instance PartialMinExcess1 Word64 where
partialMinExcess1 n w = MinExcess partialMinExcessMin partialMinExcessAll
where MinExcess aMin aAll = partialMinExcess1 32 (fromIntegral w :: Word32)
MinExcess bMin bAll = partialMinExcess1 (n - 32) (fromIntegral (w .>. 32) :: Word32)
partialMinExcessMin = if n <= 8 then aMin else BL.minInt aMin (aAll + bMin)
partialMinExcessAll = if n <= 8 then aAll else aAll + bAll
{-# INLINE partialMinExcess1 #-}