{-# OPTIONS_HADDOCK not-home #-}
module Database.LSMTree.Internal.BitMath (
div2,
mod2,
mul2,
ceilDiv2,
div4,
mod4,
mul4,
div8,
mod8,
mul8,
ceilDiv8,
div16,
mod16,
mul16,
div32,
mod32,
div64,
mod64,
mul64,
ceilDiv64,
divPageSize,
modPageSize,
mulPageSize,
ceilDivPageSize,
roundUpToPageSize,
) where
import Data.Bits
div2 :: Bits a => a -> a
div2 :: forall a. Bits a => a -> a
div2 a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftR a
x Int
1
{-# INLINE div2 #-}
mod2 :: (Bits a, Num a) => a -> a
mod2 :: forall a. (Bits a, Num a) => a -> a
mod2 a
x = a
x a -> a -> a
forall a. Bits a => a -> a -> a
.&. a
1
{-# INLINE mod2 #-}
mul2 :: Bits a => a -> a
mul2 :: forall a. Bits a => a -> a
mul2 a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftL a
x Int
1
{-# INLINE mul2 #-}
ceilDiv2 :: (Bits a, Num a) => a -> a
ceilDiv2 :: forall a. (Bits a, Num a) => a -> a
ceilDiv2 a
i = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftR (a
i a -> a -> a
forall a. Num a => a -> a -> a
+ a
1) Int
1
{-# INLINE ceilDiv2 #-}
div4 :: Bits a => a -> a
div4 :: forall a. Bits a => a -> a
div4 a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftR a
x Int
2
{-# INLINE div4 #-}
mod4 :: (Bits a, Num a) => a -> a
mod4 :: forall a. (Bits a, Num a) => a -> a
mod4 a
x = a
x a -> a -> a
forall a. Bits a => a -> a -> a
.&. a
3
{-# INLINE mod4 #-}
mul4 :: Bits a => a -> a
mul4 :: forall a. Bits a => a -> a
mul4 a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftL a
x Int
2
{-# INLINE mul4 #-}
div8 :: Bits a => a -> a
div8 :: forall a. Bits a => a -> a
div8 a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftR a
x Int
3
{-# INLINE div8 #-}
mod8 :: (Bits a, Num a) => a -> a
mod8 :: forall a. (Bits a, Num a) => a -> a
mod8 a
x = a
x a -> a -> a
forall a. Bits a => a -> a -> a
.&. a
7
{-# INLINE mod8 #-}
mul8 :: Bits a => a -> a
mul8 :: forall a. Bits a => a -> a
mul8 a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftL a
x Int
3
{-# INLINE mul8 #-}
ceilDiv8 :: (Bits a, Num a) => a -> a
ceilDiv8 :: forall a. (Bits a, Num a) => a -> a
ceilDiv8 a
i = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftR (a
i a -> a -> a
forall a. Num a => a -> a -> a
+ a
7) Int
3
{-# INLINE ceilDiv8 #-}
div16 :: Bits a => a -> a
div16 :: forall a. Bits a => a -> a
div16 a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftR a
x Int
4
{-# INLINE div16 #-}
mod16 :: (Bits a, Num a) => a -> a
mod16 :: forall a. (Bits a, Num a) => a -> a
mod16 a
x = a
x a -> a -> a
forall a. Bits a => a -> a -> a
.&. a
15
{-# INLINE mod16 #-}
mul16 :: Bits a => a -> a
mul16 :: forall a. Bits a => a -> a
mul16 a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftL a
x Int
4
{-# INLINE mul16 #-}
div32 :: Bits a => a -> a
div32 :: forall a. Bits a => a -> a
div32 a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftR a
x Int
5
{-# INLINE div32 #-}
mod32 :: (Bits a, Num a) => a -> a
mod32 :: forall a. (Bits a, Num a) => a -> a
mod32 a
x = a
x a -> a -> a
forall a. Bits a => a -> a -> a
.&. a
31
{-# INLINE mod32 #-}
div64 :: Bits a => a -> a
div64 :: forall a. Bits a => a -> a
div64 a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftR a
x Int
6
{-# INLINE div64 #-}
mod64 :: (Bits a, Num a) => a -> a
mod64 :: forall a. (Bits a, Num a) => a -> a
mod64 a
x = a
x a -> a -> a
forall a. Bits a => a -> a -> a
.&. a
63
{-# INLINE mod64 #-}
mul64 :: Bits a => a -> a
mul64 :: forall a. Bits a => a -> a
mul64 a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftL a
x Int
6
{-# INLINE mul64 #-}
ceilDiv64 :: (Bits a, Num a) => a -> a
ceilDiv64 :: forall a. (Bits a, Num a) => a -> a
ceilDiv64 a
i = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftR (a
i a -> a -> a
forall a. Num a => a -> a -> a
+ a
63) Int
6
{-# INLINE ceilDiv64 #-}
divPageSize :: Bits a => a -> a
divPageSize :: forall a. Bits a => a -> a
divPageSize a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftR a
x Int
12
{-# INLINE divPageSize #-}
modPageSize :: (Bits a, Num a) => a -> a
modPageSize :: forall a. (Bits a, Num a) => a -> a
modPageSize a
x = a
x a -> a -> a
forall a. Bits a => a -> a -> a
.&. a
4095
{-# INLINE modPageSize #-}
mulPageSize :: Bits a => a -> a
mulPageSize :: forall a. Bits a => a -> a
mulPageSize a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftL a
x Int
12
{-# INLINE mulPageSize #-}
ceilDivPageSize :: (Bits a, Num a) => a -> a
ceilDivPageSize :: forall a. (Bits a, Num a) => a -> a
ceilDivPageSize a
x = a -> Int -> a
forall a. Bits a => a -> Int -> a
unsafeShiftR (a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a
4095) Int
12
{-# INLINE ceilDivPageSize #-}
roundUpToPageSize :: (Bits a, Num a) => a -> a
roundUpToPageSize :: forall a. (Bits a, Num a) => a -> a
roundUpToPageSize a
x = (a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a
4095) a -> a -> a
forall a. Bits a => a -> a -> a
.&. a -> a
forall a. Bits a => a -> a
complement a
4095
{-# INLINE roundUpToPageSize #-}