{-# LANGUAGE CPP #-}
#include "MachDeps.h"
module Data.Chimera.ContinuousMapping
( intToWord
, wordToInt
#if WORD_SIZE_IN_BITS == 64
, toZCurve
, fromZCurve
, toZCurve3
, fromZCurve3
#endif
) 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
0x00000000ffffffff
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
0x0000ffff0000ffff
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
0x00ff00ff00ff00ff
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
0x0f0f0f0f0f0f0f0f
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
0x3333333333333333
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
0x5555555555555555
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
0x00000000ffffffff
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
0xffff00000000ffff
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
0x00ff0000ff0000ff
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
0xf00f00f00f00f00f
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
0x30c30c30c30c30c3
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
0x1249249249249249
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
0x5555555555555555
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
0x3333333333333333
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
0x0f0f0f0f0f0f0f0f
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
0x00ff00ff00ff00ff
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
0x0000ffff0000ffff
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
0x00000000ffffffff
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
0x1249249249249249
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
0x30c30c30c30c30c3
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
0xf00f00f00f00f00f
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
0x00ff0000ff0000ff
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
0xffff00000000ffff
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
0x00000000ffffffff