{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}
module Geomancy.UVec4
( UVec4
, uvec4
, withUVec4
, pattern WithUVec4
, fromTuple
) where
import Control.DeepSeq (NFData(rnf))
import Data.Word (Word32)
import Foreign (Storable(..))
data UVec4 = UVec4
{-# UNPACK #-} !Word32
{-# UNPACK #-} !Word32
{-# UNPACK #-} !Word32
{-# UNPACK #-} !Word32
deriving (UVec4 -> UVec4 -> Bool
(UVec4 -> UVec4 -> Bool) -> (UVec4 -> UVec4 -> Bool) -> Eq UVec4
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UVec4 -> UVec4 -> Bool
$c/= :: UVec4 -> UVec4 -> Bool
== :: UVec4 -> UVec4 -> Bool
$c== :: UVec4 -> UVec4 -> Bool
Eq, Eq UVec4
Eq UVec4
-> (UVec4 -> UVec4 -> Ordering)
-> (UVec4 -> UVec4 -> Bool)
-> (UVec4 -> UVec4 -> Bool)
-> (UVec4 -> UVec4 -> Bool)
-> (UVec4 -> UVec4 -> Bool)
-> (UVec4 -> UVec4 -> UVec4)
-> (UVec4 -> UVec4 -> UVec4)
-> Ord UVec4
UVec4 -> UVec4 -> Bool
UVec4 -> UVec4 -> Ordering
UVec4 -> UVec4 -> UVec4
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: UVec4 -> UVec4 -> UVec4
$cmin :: UVec4 -> UVec4 -> UVec4
max :: UVec4 -> UVec4 -> UVec4
$cmax :: UVec4 -> UVec4 -> UVec4
>= :: UVec4 -> UVec4 -> Bool
$c>= :: UVec4 -> UVec4 -> Bool
> :: UVec4 -> UVec4 -> Bool
$c> :: UVec4 -> UVec4 -> Bool
<= :: UVec4 -> UVec4 -> Bool
$c<= :: UVec4 -> UVec4 -> Bool
< :: UVec4 -> UVec4 -> Bool
$c< :: UVec4 -> UVec4 -> Bool
compare :: UVec4 -> UVec4 -> Ordering
$ccompare :: UVec4 -> UVec4 -> Ordering
$cp1Ord :: Eq UVec4
Ord, Int -> UVec4 -> ShowS
[UVec4] -> ShowS
UVec4 -> String
(Int -> UVec4 -> ShowS)
-> (UVec4 -> String) -> ([UVec4] -> ShowS) -> Show UVec4
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UVec4] -> ShowS
$cshowList :: [UVec4] -> ShowS
show :: UVec4 -> String
$cshow :: UVec4 -> String
showsPrec :: Int -> UVec4 -> ShowS
$cshowsPrec :: Int -> UVec4 -> ShowS
Show)
{-# INLINE uvec4 #-}
uvec4 :: Word32 -> Word32 -> Word32 -> Word32 -> UVec4
uvec4 :: Word32 -> Word32 -> Word32 -> Word32 -> UVec4
uvec4 = Word32 -> Word32 -> Word32 -> Word32 -> UVec4
UVec4
{-# INLINE withUVec4 #-}
withUVec4
:: UVec4
-> (Word32 -> Word32 -> Word32 -> Word32 -> r)
-> r
withUVec4 :: UVec4 -> (Word32 -> Word32 -> Word32 -> Word32 -> r) -> r
withUVec4 (UVec4 Word32
a Word32
b Word32
c Word32
d) Word32 -> Word32 -> Word32 -> Word32 -> r
f = Word32 -> Word32 -> Word32 -> Word32 -> r
f Word32
a Word32
b Word32
c Word32
d
pattern WithUVec4 :: Word32 -> Word32 -> Word32 -> Word32 -> UVec4
pattern $mWithUVec4 :: forall r.
UVec4
-> (Word32 -> Word32 -> Word32 -> Word32 -> r) -> (Void# -> r) -> r
WithUVec4 a b c d <- ((`withUVec4` (,,,)) -> (a, b, c, d))
{-# COMPLETE WithUVec4 #-}
{-# INLINE fromTuple #-}
fromTuple :: (Word32, Word32, Word32, Word32) -> UVec4
fromTuple :: (Word32, Word32, Word32, Word32) -> UVec4
fromTuple (Word32
x, Word32
y, Word32
z, Word32
w) = Word32 -> Word32 -> Word32 -> Word32 -> UVec4
uvec4 Word32
x Word32
y Word32
z Word32
w
instance NFData UVec4 where
rnf :: UVec4 -> ()
rnf UVec4{} = ()
instance Num UVec4 where
{-# INLINE (+) #-}
UVec4 Word32
l1 Word32
l2 Word32
l3 Word32
l4 + :: UVec4 -> UVec4 -> UVec4
+ UVec4 Word32
r1 Word32
r2 Word32
r3 Word32
r4 =
Word32 -> Word32 -> Word32 -> Word32 -> UVec4
UVec4
(Word32
l1 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
r1)
(Word32
l2 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
r2)
(Word32
l3 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
r3)
(Word32
l4 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
r4)
{-# INLINE (-) #-}
UVec4 Word32
l1 Word32
l2 Word32
l3 Word32
l4 - :: UVec4 -> UVec4 -> UVec4
- UVec4 Word32
r1 Word32
r2 Word32
r3 Word32
r4 =
Word32 -> Word32 -> Word32 -> Word32 -> UVec4
UVec4
(Word32
l1 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
r1)
(Word32
l2 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
r2)
(Word32
l3 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
r3)
(Word32
l4 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
r4)
{-# INLINE (*) #-}
UVec4 Word32
l1 Word32
l2 Word32
l3 Word32
l4 * :: UVec4 -> UVec4 -> UVec4
* UVec4 Word32
r1 Word32
r2 Word32
r3 Word32
r4 =
Word32 -> Word32 -> Word32 -> Word32 -> UVec4
UVec4
(Word32
l1 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
r1)
(Word32
l2 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
r2)
(Word32
l3 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
r3)
(Word32
l4 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
r4)
{-# INLINE abs #-}
abs :: UVec4 -> UVec4
abs UVec4
x = UVec4
x
{-# INLINE signum #-}
signum :: UVec4 -> UVec4
signum UVec4
v4 = UVec4 -> (Word32 -> Word32 -> Word32 -> Word32 -> UVec4) -> UVec4
forall r. UVec4 -> (Word32 -> Word32 -> Word32 -> Word32 -> r) -> r
withUVec4 UVec4
v4 \Word32
a Word32
b Word32
c Word32
d ->
Word32 -> Word32 -> Word32 -> Word32 -> UVec4
uvec4 (Word32 -> Word32
forall a. Num a => a -> a
signum Word32
a) (Word32 -> Word32
forall a. Num a => a -> a
signum Word32
b) (Word32 -> Word32
forall a. Num a => a -> a
signum Word32
c) (Word32 -> Word32
forall a. Num a => a -> a
signum Word32
d)
{-# INLINE fromInteger #-}
fromInteger :: Integer -> UVec4
fromInteger Integer
x = Word32 -> Word32 -> Word32 -> Word32 -> UVec4
UVec4 Word32
x' Word32
x' Word32
x' Word32
x'
where
x' :: Word32
x' = Integer -> Word32
forall a. Num a => Integer -> a
fromInteger Integer
x
instance Storable UVec4 where
{-# INLINE sizeOf #-}
sizeOf :: UVec4 -> Int
sizeOf UVec4
_ = Int
16
{-# INLINE alignment #-}
alignment :: UVec4 -> Int
alignment UVec4
_ = Int
8
{-# INLINE poke #-}
poke :: Ptr UVec4 -> UVec4 -> IO ()
poke Ptr UVec4
ptr UVec4
v4 =
UVec4 -> (Word32 -> Word32 -> Word32 -> Word32 -> IO ()) -> IO ()
forall r. UVec4 -> (Word32 -> Word32 -> Word32 -> Word32 -> r) -> r
withUVec4 UVec4
v4 \Word32
a Word32
b Word32
c Word32
d -> do
Ptr UVec4 -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr UVec4
ptr Int
0 Word32
a
Ptr UVec4 -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr UVec4
ptr Int
4 Word32
b
Ptr UVec4 -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr UVec4
ptr Int
8 Word32
c
Ptr UVec4 -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr UVec4
ptr Int
12 Word32
d
{-# INLINE peek #-}
peek :: Ptr UVec4 -> IO UVec4
peek Ptr UVec4
ptr = Word32 -> Word32 -> Word32 -> Word32 -> UVec4
uvec4
(Word32 -> Word32 -> Word32 -> Word32 -> UVec4)
-> IO Word32 -> IO (Word32 -> Word32 -> Word32 -> UVec4)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr UVec4 -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr UVec4
ptr Int
0
IO (Word32 -> Word32 -> Word32 -> UVec4)
-> IO Word32 -> IO (Word32 -> Word32 -> UVec4)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr UVec4 -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr UVec4
ptr Int
4
IO (Word32 -> Word32 -> UVec4) -> IO Word32 -> IO (Word32 -> UVec4)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr UVec4 -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr UVec4
ptr Int
8
IO (Word32 -> UVec4) -> IO Word32 -> IO UVec4
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr UVec4 -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr UVec4
ptr Int
12