packages feed

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 #-}