hw-excess-0.2.1.0: src/HaskellWorks/Data/Excess/PartialMinMaxExcess1.hs
module HaskellWorks.Data.Excess.PartialMinMaxExcess1
( PartialMinMaxExcess1(..)
) where
import Data.Word
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Excess.Triplet
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 PartialMinMaxExcess1 a where
partialMinMaxExcess1 :: Int -> a -> Triplet
instance PartialMinMaxExcess1 Word8 where
partialMinMaxExcess1 n w = Triplet partialMinMaxExcessMin partialMinMaxExcessAll partialMinMaxExcessMax
where partialMinMaxExcessMin = fromIntegral $ DVS.unsafeIndex T.tableWord8Excess1Lo (n * 256 + fromIntegral w)
partialMinMaxExcessAll = fromIntegral $ DVS.unsafeIndex T.tableWord8Excess1Ex (n * 256 + fromIntegral w)
partialMinMaxExcessMax = fromIntegral $ DVS.unsafeIndex T.tableWord8Excess1Hi (n * 256 + fromIntegral w)
{-# INLINE partialMinMaxExcess1 #-}
instance PartialMinMaxExcess1 Word16 where
partialMinMaxExcess1 n w = Triplet partialMinMaxExcessMin partialMinMaxExcessAll partialMinMaxExcessMax
where Triplet aMin aAll aMax = partialMinMaxExcess1 8 (fromIntegral w :: Word8)
Triplet bMin bAll bMax = partialMinMaxExcess1 (n - 8) (fromIntegral (w .>. 8) :: Word8)
partialMinMaxExcessMin = if n <= 8 then aMin else BL.minInt aMin (aAll + bMin)
partialMinMaxExcessAll = if n <= 8 then aAll else aAll + bAll
partialMinMaxExcessMax = if n <= 8 then aMax else BL.maxInt aMax (aAll + bMax)
{-# INLINE partialMinMaxExcess1 #-}
instance PartialMinMaxExcess1 Word32 where
partialMinMaxExcess1 n w = Triplet partialMinMaxExcessMin partialMinMaxExcessAll partialMinMaxExcessMax
where Triplet aMin aAll aMax = partialMinMaxExcess1 16 (fromIntegral w :: Word16)
Triplet bMin bAll bMax = partialMinMaxExcess1 (n - 16) (fromIntegral (w .>. 16) :: Word16)
partialMinMaxExcessMin = if n <= 8 then aMin else BL.minInt aMin (aAll + bMin)
partialMinMaxExcessAll = if n <= 8 then aAll else aAll + bAll
partialMinMaxExcessMax = if n <= 8 then aMax else BL.maxInt aMax (aAll + bMax)
{-# INLINE partialMinMaxExcess1 #-}
instance PartialMinMaxExcess1 Word64 where
partialMinMaxExcess1 n w = Triplet partialMinMaxExcessMin partialMinMaxExcessAll partialMinMaxExcessMax
where Triplet aMin aAll aMax = partialMinMaxExcess1 32 (fromIntegral w :: Word32)
Triplet bMin bAll bMax = partialMinMaxExcess1 (n - 32) (fromIntegral (w .>. 32) :: Word32)
partialMinMaxExcessMin = if n <= 8 then aMin else BL.minInt aMin (aAll + bMin)
partialMinMaxExcessAll = if n <= 8 then aAll else aAll + bAll
partialMinMaxExcessMax = if n <= 8 then aMax else BL.maxInt aMax (aAll + bMax)
{-# INLINE partialMinMaxExcess1 #-}