{-# OPTIONS_HADDOCK ignore-exports#-}
{-# LANGUAGE DataKinds                  #-}
{-# LANGUAGE FlexibleInstances          #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE KindSignatures             #-}
{-# LANGUAGE PatternSynonyms            #-}
{-# LANGUAGE StandaloneDeriving         #-}
{-# LANGUAGE Strict                     #-}
{-# LANGUAGE TypeSynonymInstances       #-}
module Graphics.Vulkan.Types.Enum.Fence
       (VkFenceCreateBitmask(VkFenceCreateBitmask, VkFenceCreateFlags,
                             VkFenceCreateFlagBits, VK_FENCE_CREATE_SIGNALED_BIT),
        VkFenceCreateFlags, VkFenceCreateFlagBits,
        VkFenceImportFlagBitsKHR(..),
        VkFenceImportBitmask(VkFenceImportBitmask, VkFenceImportFlags,
                             VkFenceImportFlagBits, VK_FENCE_IMPORT_TEMPORARY_BIT),
        VkFenceImportFlags, VkFenceImportFlagBits)
       where
import Data.Bits                       (Bits, FiniteBits)
import Data.Coerce                     (coerce)
import Foreign.Storable                (Storable)
import GHC.Read                        (choose, expectP)
import Graphics.Vulkan.Marshal         (FlagBit, FlagMask, FlagType)
import Graphics.Vulkan.Types.BaseTypes (VkFlags (..))
import Text.ParserCombinators.ReadPrec (prec, step, (+++))
import Text.Read                       (Read (..), parens)
import Text.Read.Lex                   (Lexeme (..))

newtype VkFenceCreateBitmask (a ::
                                FlagType) = VkFenceCreateBitmask VkFlags
                                            deriving (Eq, Ord, Storable)

type VkFenceCreateFlags = VkFenceCreateBitmask FlagMask

type VkFenceCreateFlagBits = VkFenceCreateBitmask FlagBit

pattern VkFenceCreateFlagBits ::
        VkFlags -> VkFenceCreateBitmask FlagBit

pattern VkFenceCreateFlagBits n = VkFenceCreateBitmask n

pattern VkFenceCreateFlags ::
        VkFlags -> VkFenceCreateBitmask FlagMask

pattern VkFenceCreateFlags n = VkFenceCreateBitmask n

deriving instance Bits (VkFenceCreateBitmask FlagMask)

deriving instance FiniteBits (VkFenceCreateBitmask FlagMask)

instance Show (VkFenceCreateBitmask a) where
    showsPrec _ VK_FENCE_CREATE_SIGNALED_BIT
      = showString "VK_FENCE_CREATE_SIGNALED_BIT"
    showsPrec p (VkFenceCreateBitmask x)
      = showParen (p >= 11)
          (showString "VkFenceCreateBitmask " . showsPrec 11 x)

instance Read (VkFenceCreateBitmask a) where
    readPrec
      = parens
          (choose
             [("VK_FENCE_CREATE_SIGNALED_BIT",
               pure VK_FENCE_CREATE_SIGNALED_BIT)]
             +++
             prec 10
               (expectP (Ident "VkFenceCreateBitmask") >>
                  (VkFenceCreateBitmask <$> step readPrec)))

-- | bitpos = @0@
pattern VK_FENCE_CREATE_SIGNALED_BIT :: VkFenceCreateBitmask a

pattern VK_FENCE_CREATE_SIGNALED_BIT = VkFenceCreateBitmask 1

newtype VkFenceImportFlagBitsKHR = VkFenceImportFlagBitsKHR VkFlags
                                   deriving (Eq, Ord, Enum, Bits, FiniteBits, Storable)

instance Show VkFenceImportFlagBitsKHR where
    {-# INLINE showsPrec #-}
    showsPrec = coerce (showsPrec :: Int -> VkFlags -> ShowS)

instance Read VkFenceImportFlagBitsKHR where
    {-# INLINE readsPrec #-}
    readsPrec = coerce (readsPrec :: Int -> ReadS VkFlags)

newtype VkFenceImportBitmask (a ::
                                FlagType) = VkFenceImportBitmask VkFlags
                                            deriving (Eq, Ord, Storable)

type VkFenceImportFlags = VkFenceImportBitmask FlagMask

type VkFenceImportFlagBits = VkFenceImportBitmask FlagBit

pattern VkFenceImportFlagBits ::
        VkFlags -> VkFenceImportBitmask FlagBit

pattern VkFenceImportFlagBits n = VkFenceImportBitmask n

pattern VkFenceImportFlags ::
        VkFlags -> VkFenceImportBitmask FlagMask

pattern VkFenceImportFlags n = VkFenceImportBitmask n

deriving instance Bits (VkFenceImportBitmask FlagMask)

deriving instance FiniteBits (VkFenceImportBitmask FlagMask)

instance Show (VkFenceImportBitmask a) where
    showsPrec _ VK_FENCE_IMPORT_TEMPORARY_BIT
      = showString "VK_FENCE_IMPORT_TEMPORARY_BIT"
    showsPrec p (VkFenceImportBitmask x)
      = showParen (p >= 11)
          (showString "VkFenceImportBitmask " . showsPrec 11 x)

instance Read (VkFenceImportBitmask a) where
    readPrec
      = parens
          (choose
             [("VK_FENCE_IMPORT_TEMPORARY_BIT",
               pure VK_FENCE_IMPORT_TEMPORARY_BIT)]
             +++
             prec 10
               (expectP (Ident "VkFenceImportBitmask") >>
                  (VkFenceImportBitmask <$> step readPrec)))

-- | bitpos = @0@
pattern VK_FENCE_IMPORT_TEMPORARY_BIT :: VkFenceImportBitmask a

pattern VK_FENCE_IMPORT_TEMPORARY_BIT = VkFenceImportBitmask 1