module Data.Chimera.ContinuousMapping
( intToWord
, wordToInt
, toZCurve
, fromZCurve
, toZCurve3
, fromZCurve3
) where
import Data.Bits
import Data.Chimera.FromIntegral
import Data.Word
intToWord :: Int -> Word
intToWord :: Int -> Word
intToWord Int
i = (if Word
sign forall a. Eq a => a -> a -> Bool
== Word
0 then forall a. a -> a
id else forall a. Bits a => a -> a
complement) (Int -> Word
int2word Int
i) forall a. Bits a => a -> Int -> a
`shiftL` Int
1 forall a. Num a => a -> a -> a
+ Word
sign
where
sign :: Word
sign = Int -> Word
int2word Int
i forall a. Bits a => a -> Int -> a
`shiftR` (forall b. FiniteBits b => b -> Int
finiteBitSize Int
i forall a. Num a => a -> a -> a
- Int
1)
{-# INLINE intToWord #-}
wordToInt :: Word -> Int
wordToInt :: Word -> Int
wordToInt Word
w = Word -> Int
word2int forall a b. (a -> b) -> a -> b
$ (if Word
w forall a. Bits a => a -> a -> a
.&. Word
1 forall a. Eq a => a -> a -> Bool
== Word
0 then forall a. a -> a
id else forall a. Bits a => a -> a
complement) (Word
w forall a. Bits a => a -> Int -> a
`shiftR` Int
1)
{-# INLINE wordToInt #-}
toZCurve :: Word -> Word -> Word
toZCurve :: Word -> Word -> Word
toZCurve Word
x Word
y = Word -> Word
part1by1 Word
y forall a. Bits a => a -> Int -> a
`shiftL` Int
1 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 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 forall a. Bits a => a -> Int -> a
`shiftL` Int
2 forall a. Bits a => a -> a -> a
.|. Word -> Word
part1by2 Word
y forall a. Bits a => a -> Int -> a
`shiftL` Int
1 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 forall a. Bits a => a -> Int -> a
`shiftR` Int
1), Word -> Word
compact1by2 (Word
z forall a. Bits a => a -> Int -> a
`shiftR` Int
2))
part1by1 :: Word -> Word
part1by1 :: Word -> Word
part1by1 Word
x = forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
x5 :: Word64)
where
x0 :: Word64
x0 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
x forall a. Bits a => a -> a -> a
.&. Word64
0x00000000ffffffff
x1 :: Word64
x1 = (Word64
x0 forall a. Bits a => a -> a -> a
`xor` (Word64
x0 forall a. Bits a => a -> Int -> a
`shiftL` Int
16)) forall a. Bits a => a -> a -> a
.&. Word64
0x0000ffff0000ffff
x2 :: Word64
x2 = (Word64
x1 forall a. Bits a => a -> a -> a
`xor` (Word64
x1 forall a. Bits a => a -> Int -> a
`shiftL` Int
8)) forall a. Bits a => a -> a -> a
.&. Word64
0x00ff00ff00ff00ff
x3 :: Word64
x3 = (Word64
x2 forall a. Bits a => a -> a -> a
`xor` (Word64
x2 forall a. Bits a => a -> Int -> a
`shiftL` Int
4)) forall a. Bits a => a -> a -> a
.&. Word64
0x0f0f0f0f0f0f0f0f
x4 :: Word64
x4 = (Word64
x3 forall a. Bits a => a -> a -> a
`xor` (Word64
x3 forall a. Bits a => a -> Int -> a
`shiftL` Int
2)) forall a. Bits a => a -> a -> a
.&. Word64
0x3333333333333333
x5 :: Word64
x5 = (Word64
x4 forall a. Bits a => a -> a -> a
`xor` (Word64
x4 forall a. Bits a => a -> Int -> a
`shiftL` Int
1)) forall a. Bits a => a -> a -> a
.&. Word64
0x5555555555555555
part1by2 :: Word -> Word
part1by2 :: Word -> Word
part1by2 Word
x = forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
x5 :: Word64)
where
x0 :: Word64
x0 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
x forall a. Bits a => a -> a -> a
.&. Word64
0x00000000ffffffff
x1 :: Word64
x1 = (Word64
x0 forall a. Bits a => a -> a -> a
`xor` (Word64
x0 forall a. Bits a => a -> Int -> a
`shiftL` Int
32)) forall a. Bits a => a -> a -> a
.&. Word64
0xffff00000000ffff
x2 :: Word64
x2 = (Word64
x1 forall a. Bits a => a -> a -> a
`xor` (Word64
x1 forall a. Bits a => a -> Int -> a
`shiftL` Int
16)) forall a. Bits a => a -> a -> a
.&. Word64
0x00ff0000ff0000ff
x3 :: Word64
x3 = (Word64
x2 forall a. Bits a => a -> a -> a
`xor` (Word64
x2 forall a. Bits a => a -> Int -> a
`shiftL` Int
8)) forall a. Bits a => a -> a -> a
.&. Word64
0xf00f00f00f00f00f
x4 :: Word64
x4 = (Word64
x3 forall a. Bits a => a -> a -> a
`xor` (Word64
x3 forall a. Bits a => a -> Int -> a
`shiftL` Int
4)) forall a. Bits a => a -> a -> a
.&. Word64
0x30c30c30c30c30c3
x5 :: Word64
x5 = (Word64
x4 forall a. Bits a => a -> a -> a
`xor` (Word64
x4 forall a. Bits a => a -> Int -> a
`shiftL` Int
2)) forall a. Bits a => a -> a -> a
.&. Word64
0x1249249249249249
compact1by1 :: Word -> Word
compact1by1 :: Word -> Word
compact1by1 Word
x = forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
x5 :: Word64)
where
x0 :: Word64
x0 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
x forall a. Bits a => a -> a -> a
.&. Word64
0x5555555555555555
x1 :: Word64
x1 = (Word64
x0 forall a. Bits a => a -> a -> a
`xor` (Word64
x0 forall a. Bits a => a -> Int -> a
`shiftR` Int
1)) forall a. Bits a => a -> a -> a
.&. Word64
0x3333333333333333
x2 :: Word64
x2 = (Word64
x1 forall a. Bits a => a -> a -> a
`xor` (Word64
x1 forall a. Bits a => a -> Int -> a
`shiftR` Int
2)) forall a. Bits a => a -> a -> a
.&. Word64
0x0f0f0f0f0f0f0f0f
x3 :: Word64
x3 = (Word64
x2 forall a. Bits a => a -> a -> a
`xor` (Word64
x2 forall a. Bits a => a -> Int -> a
`shiftR` Int
4)) forall a. Bits a => a -> a -> a
.&. Word64
0x00ff00ff00ff00ff
x4 :: Word64
x4 = (Word64
x3 forall a. Bits a => a -> a -> a
`xor` (Word64
x3 forall a. Bits a => a -> Int -> a
`shiftR` Int
8)) forall a. Bits a => a -> a -> a
.&. Word64
0x0000ffff0000ffff
x5 :: Word64
x5 = (Word64
x4 forall a. Bits a => a -> a -> a
`xor` (Word64
x4 forall a. Bits a => a -> Int -> a
`shiftR` Int
16)) forall a. Bits a => a -> a -> a
.&. Word64
0x00000000ffffffff
compact1by2 :: Word -> Word
compact1by2 :: Word -> Word
compact1by2 Word
x = forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
x5 :: Word64)
where
x0 :: Word64
x0 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
x forall a. Bits a => a -> a -> a
.&. Word64
0x1249249249249249
x1 :: Word64
x1 = (Word64
x0 forall a. Bits a => a -> a -> a
`xor` (Word64
x0 forall a. Bits a => a -> Int -> a
`shiftR` Int
2)) forall a. Bits a => a -> a -> a
.&. Word64
0x30c30c30c30c30c3
x2 :: Word64
x2 = (Word64
x1 forall a. Bits a => a -> a -> a
`xor` (Word64
x1 forall a. Bits a => a -> Int -> a
`shiftR` Int
4)) forall a. Bits a => a -> a -> a
.&. Word64
0xf00f00f00f00f00f
x3 :: Word64
x3 = (Word64
x2 forall a. Bits a => a -> a -> a
`xor` (Word64
x2 forall a. Bits a => a -> Int -> a
`shiftR` Int
8)) forall a. Bits a => a -> a -> a
.&. Word64
0x00ff0000ff0000ff
x4 :: Word64
x4 = (Word64
x3 forall a. Bits a => a -> a -> a
`xor` (Word64
x3 forall a. Bits a => a -> Int -> a
`shiftR` Int
16)) forall a. Bits a => a -> a -> a
.&. Word64
0xffff00000000ffff
x5 :: Word64
x5 = (Word64
x4 forall a. Bits a => a -> a -> a
`xor` (Word64
x4 forall a. Bits a => a -> Int -> a
`shiftR` Int
32)) forall a. Bits a => a -> a -> a
.&. Word64
0x00000000ffffffff