{-# LANGUAGE MultiParamTypeClasses #-}
module Language.SpirV.AddressingModel where

import Data.Word (Word32)
import Language.SpirV.SpirEnum
import qualified Language.SpirV.Capability as Capability


-- | <https:\/\/www.khronos.org\/registry\/spir-v\/specs\/1.0\/SPIRV.html#_a_id_addressing_model_a_addressing_model Source for Addressing Model>
data AddressingModel =
    Logical
  | Physical32
  | Physical64
  deriving(Read, Show, Eq, Ord)

instance SpirEnum AddressingModel Word32 where
  toWord Logical = 0
  toWord Physical32 = 1
  toWord Physical64 = 2

  fromWord 0 = Just Logical
  fromWord 1 = Just Physical32
  fromWord 2 = Just Physical64
  fromWord _ = Nothing

  requiredCapabilities Physical32 = [Capability.Addresses]
  requiredCapabilities Physical64 = [Capability.Addresses]
  requiredCapabilities _ = []