{-# LANGUAGE BinaryLiterals #-}
module Data.BitStream.ContinuousMapping
( intToWord
, wordToInt
, toZCurve
, fromZCurve
, toZCurve3
, fromZCurve3
) where
import Data.Bits
import Unsafe.Coerce
word2int :: Word -> Int
word2int :: Word -> Int
word2int = Word -> Int
forall a b. a -> b
unsafeCoerce
int2word :: Int -> Word
int2word :: Int -> Word
int2word = Int -> Word
forall a b. a -> b
unsafeCoerce
intToWord :: Int -> Word
intToWord :: Int -> Word
intToWord Int
i
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 = Int -> Word
int2word Int
i Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
1
| Bool
otherwise = Int -> Word
int2word (-Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i) Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
1 Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
1
wordToInt :: Word -> Int
wordToInt :: Word -> Int
wordToInt Word
w
| Word -> Bool
forall a. Integral a => a -> Bool
even Word
w = Word -> Int
word2int (Word
w Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
1)
| Bool
otherwise = Int -> Int
forall a. Num a => a -> a
negate (Word -> Int
word2int (Word
w Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
1)) Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
toZCurve :: Word -> Word -> Word
toZCurve :: Word -> Word -> Word
toZCurve Word
x Word
y = Word -> Word
part1by1 Word
y Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
1 Word -> Word -> Word
forall a. Bits a => a -> a -> a
.|. Word -> Word
part1by1 Word
x
fromZCurve :: Word -> (Word, Word)
fromZCurve :: Word -> (Word, Word)
fromZCurve Word
z = (Word -> Word
compact1by1 Word
z, Word -> Word
compact1by1 (Word
z Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
1))
toZCurve3 :: Word -> Word -> Word -> Word
toZCurve3 :: Word -> Word -> Word -> Word
toZCurve3 Word
x Word
y Word
z = Word -> Word
part1by2 Word
z Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word -> Word -> Word
forall a. Bits a => a -> a -> a
.|. Word -> Word
part1by2 Word
y Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
1 Word -> Word -> Word
forall a. Bits a => a -> a -> a
.|. Word -> Word
part1by2 Word
x
fromZCurve3 :: Word -> (Word, Word, Word)
fromZCurve3 :: Word -> (Word, Word, Word)
fromZCurve3 Word
z = (Word -> Word
compact1by2 Word
z, Word -> Word
compact1by2 (Word
z Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
1), Word -> Word
compact1by2 (Word
z Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
2))
part1by1 :: Word -> Word
part1by1 :: Word -> Word
part1by1 Word
x = Word
x5
where
x0 :: Word
x0 = Word
x Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0000000000000000000000000000000011111111111111111111111111111111
x1 :: Word
x1 = (Word
x0 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x0 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
16)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0000000000000000111111111111111100000000000000001111111111111111
x2 :: Word
x2 = (Word
x1 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x1 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
8)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0000000011111111000000001111111100000000111111110000000011111111
x3 :: Word
x3 = (Word
x2 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x2 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
4)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0000111100001111000011110000111100001111000011110000111100001111
x4 :: Word
x4 = (Word
x3 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x3 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
2)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0011001100110011001100110011001100110011001100110011001100110011
x5 :: Word
x5 = (Word
x4 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x4 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
1)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0101010101010101010101010101010101010101010101010101010101010101
part1by2 :: Word -> Word
part1by2 :: Word -> Word
part1by2 Word
x = Word
x5
where
x0 :: Word
x0 = Word
x Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0000000000000000000000000000000011111111111111111111111111111111
x1 :: Word
x1 = (Word
x0 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x0 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
32)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b1111111111111111000000000000000000000000000000001111111111111111
x2 :: Word
x2 = (Word
x1 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x1 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
16)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0000000011111111000000000000000011111111000000000000000011111111
x3 :: Word
x3 = (Word
x2 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x2 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
8)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b1111000000001111000000001111000000001111000000001111000000001111
x4 :: Word
x4 = (Word
x3 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x3 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
4)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0011000011000011000011000011000011000011000011000011000011000011
x5 :: Word
x5 = (Word
x4 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x4 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
2)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0001001001001001001001001001001001001001001001001001001001001001
compact1by1 :: Word -> Word
compact1by1 :: Word -> Word
compact1by1 Word
x = Word
x5
where
x0 :: Word
x0 = Word
x Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0101010101010101010101010101010101010101010101010101010101010101
x1 :: Word
x1 = (Word
x0 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x0 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
1)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0011001100110011001100110011001100110011001100110011001100110011
x2 :: Word
x2 = (Word
x1 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x1 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
2)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0000111100001111000011110000111100001111000011110000111100001111
x3 :: Word
x3 = (Word
x2 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x2 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
4)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0000000011111111000000001111111100000000111111110000000011111111
x4 :: Word
x4 = (Word
x3 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x3 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
8)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0000000000000000111111111111111100000000000000001111111111111111
x5 :: Word
x5 = (Word
x4 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x4 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
16)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0000000000000000000000000000000011111111111111111111111111111111
compact1by2 :: Word -> Word
compact1by2 :: Word -> Word
compact1by2 Word
x = Word
x5
where
x0 :: Word
x0 = Word
x Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0001001001001001001001001001001001001001001001001001001001001001
x1 :: Word
x1 = (Word
x0 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x0 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
2)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0011000011000011000011000011000011000011000011000011000011000011
x2 :: Word
x2 = (Word
x1 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x1 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
4)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b1111000000001111000000001111000000001111000000001111000000001111
x3 :: Word
x3 = (Word
x2 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x2 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
8)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0000000011111111000000000000000011111111000000000000000011111111
x4 :: Word
x4 = (Word
x3 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x3 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
16)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b1111111111111111000000000000000000000000000000001111111111111111
x5 :: Word
x5 = (Word
x4 Word -> Word -> Word
forall a. Bits a => a -> a -> a
`xor` (Word
x4 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
32)) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
0b0000000000000000000000000000000011111111111111111111111111111111