{-# LANGUAGE MultiParamTypeClasses #-}
module Language.SpirV.MemoryAccess 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_memory_access_a_memory_access Source for Memory Access>
data MemoryAccess =
    None
  | Volatile
  | Aligned
  | Nontemporal
  deriving(Read, Show, Eq, Ord)

instance SpirEnum MemoryAccess Word32 where
  toWord None = 0
  toWord Volatile = 1
  toWord Aligned = 2
  toWord Nontemporal = 4

  fromWord 0 = Just None
  fromWord 1 = Just Volatile
  fromWord 2 = Just Aligned
  fromWord 4 = Just Nontemporal
  fromWord _ = Nothing

  
  requiredCapabilities _ = []