module Radix.Word8.Foundation
( Key
, Prefix
, Mask
, beyond
, upper
, lower
, zeroBit
, mask
, branchingBit
) where
import Data.Bits
import Data.Word
type Key = Word8
type Prefix = Word8
{-# INLINE beyond #-}
beyond :: Prefix -> Key -> Bool
beyond :: Mask -> Mask -> Bool
beyond Mask
p Mask
k = (Mask
k Mask -> Mask -> Mask
forall a. Bits a => a -> a -> a
`xor` Mask
p) Mask -> Mask -> Mask
forall a. Bits a => a -> a -> a
.&. (Mask
p Mask -> Mask -> Mask
forall a. Bits a => a -> a -> a
`xor` Mask -> Mask
forall a. Num a => a -> a
negate Mask
p) Mask -> Mask -> Bool
forall a. Eq a => a -> a -> Bool
/= Mask
0
{-# INLINE upper #-}
upper :: Prefix -> Key
upper :: Mask -> Mask
upper Mask
p = Mask
p Mask -> Mask -> Mask
forall a. Bits a => a -> a -> a
.|. (Mask
p Mask -> Mask -> Mask
forall a. Num a => a -> a -> a
- Mask
1)
{-# INLINE lower #-}
lower :: Prefix -> Key
lower :: Mask -> Mask
lower Mask
p = Mask
p Mask -> Mask -> Mask
forall a. Bits a => a -> a -> a
.&. (Mask
p Mask -> Mask -> Mask
forall a. Num a => a -> a -> a
- Mask
1)
type Mask = Word8
{-# INLINE zeroBit #-}
zeroBit :: Key -> Mask -> Bool
zeroBit :: Mask -> Mask -> Bool
zeroBit Mask
k Mask
m = (Mask
k Mask -> Mask -> Mask
forall a. Bits a => a -> a -> a
.&. Mask
m) Mask -> Mask -> Bool
forall a. Eq a => a -> a -> Bool
== Mask
0
{-# INLINE mask #-}
mask :: Key -> Mask -> Prefix
mask :: Mask -> Mask -> Mask
mask Mask
k Mask
m = Mask
k Mask -> Mask -> Mask
forall a. Bits a => a -> a -> a
.&. (Mask -> Mask
forall a. Num a => a -> a
negate Mask
m Mask -> Mask -> Mask
forall a. Bits a => a -> a -> a
`xor` Mask
m)
{-# INLINE branchingBit #-}
branchingBit :: Prefix -> Prefix -> Mask
branchingBit :: Mask -> Mask -> Mask
branchingBit Mask
p Mask
o = Mask
1 Mask -> Int -> Mask
forall a. Bits a => a -> Int -> a
`unsafeShiftL` (Int
7 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Mask -> Int
forall b. FiniteBits b => b -> Int
countLeadingZeros (Mask
p Mask -> Mask -> Mask
forall a. Bits a => a -> a -> a
`xor` Mask
o))