moonlight-triangulation-0.1.0.0: src-core/Moonlight/Triangulation/Internal/PackedIndex.hs
module Moonlight.Triangulation.Internal.PackedIndex
( noIndex
, indexLimit
, packIndex
, unpackIndex
, unpackOptionalIndex
) where
import Data.Word (Word32)
noIndex :: Word32
noIndex = maxBound
indexLimit :: Int
indexLimit = fromIntegral (maxBound - 1 :: Word32)
-- | Pack an admitted arena handle. The build boundary limits vertex capacity
-- so the mutable topology reservation, @8n + 16@, stays below 'indexLimit';
-- every caller supplies a non-negative handle or worklist position derived
-- from those arenas. Optional @-1@ handles are represented separately by
-- 'noIndex' before this function is reached.
packIndex :: Int -> Word32
packIndex = fromIntegral
{-# INLINE packIndex #-}
unpackIndex :: Word32 -> Int
unpackIndex = fromIntegral
{-# INLINE unpackIndex #-}
unpackOptionalIndex :: Word32 -> Maybe Int
unpackOptionalIndex value
| value == noIndex = Nothing
| otherwise = Just (unpackIndex value)
{-# INLINE unpackOptionalIndex #-}