{-# LINE 1 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

{-# LINE 2 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

{-# LANGUAGE DataKinds             #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MagicHash             #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Strict                #-}
{-# LANGUAGE TypeApplications      #-}
{-# LANGUAGE TypeFamilies          #-}
module Graphics.Vulkan.Types.Struct.AllocationCallbacks
       (VkAllocationCallbacks(..)) where
import           Foreign.Storable                   (Storable (..))
import           GHC.Base                           (Addr#, ByteArray#,
                                                     byteArrayContents#,
                                                     plusAddr#)
import           Graphics.Vulkan.Marshal
import           Graphics.Vulkan.Marshal.Internal
import           Graphics.Vulkan.Types.Funcpointers (PFN_vkAllocationFunction,
                                                     PFN_vkFreeFunction,
                                                     PFN_vkInternalAllocationNotification,
                                                     PFN_vkInternalFreeNotification,
                                                     PFN_vkReallocationFunction)
import           System.IO.Unsafe                   (unsafeDupablePerformIO)

-- | > typedef struct VkAllocationCallbacks {
--   >     void*           pUserData;
--   >     PFN_vkAllocationFunction   pfnAllocation;
--   >     PFN_vkReallocationFunction pfnReallocation;
--   >     PFN_vkFreeFunction    pfnFree;
--   >     PFN_vkInternalAllocationNotification pfnInternalAllocation;
--   >     PFN_vkInternalFreeNotification pfnInternalFree;
--   > } VkAllocationCallbacks;
--
--   <https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VkAllocationCallbacks VkAllocationCallbacks registry at www.khronos.org>
data VkAllocationCallbacks = VkAllocationCallbacks# Addr#
                                                    ByteArray#

instance Eq VkAllocationCallbacks where
        (VkAllocationCallbacks# a _) == x@(VkAllocationCallbacks# b _)
          = EQ == cmpBytes# (sizeOf x) a b

        {-# INLINE (==) #-}

instance Ord VkAllocationCallbacks where
        (VkAllocationCallbacks# a _) `compare`
          x@(VkAllocationCallbacks# b _) = cmpBytes# (sizeOf x) a b

        {-# INLINE compare #-}

instance Storable VkAllocationCallbacks where
        sizeOf ~_ = (48)
{-# LINE 52 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

        {-# INLINE sizeOf #-}
        alignment ~_ = (8)
{-# LINE 55 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

        {-# INLINE alignment #-}
        peek = peekVkData#

        {-# INLINE peek #-}
        poke = pokeVkData#

        {-# INLINE poke #-}

instance VulkanMarshalPrim VkAllocationCallbacks where
        unsafeAddr (VkAllocationCallbacks# a _) = a

        {-# INLINE unsafeAddr #-}
        unsafeByteArray (VkAllocationCallbacks# _ b) = b

        {-# INLINE unsafeByteArray #-}
        unsafeFromByteArrayOffset off b
          = VkAllocationCallbacks# (plusAddr# (byteArrayContents# b) off) b

        {-# INLINE unsafeFromByteArrayOffset #-}

instance VulkanMarshal VkAllocationCallbacks where
        type StructFields VkAllocationCallbacks =
             '["pUserData", "pfnAllocation", "pfnReallocation", "pfnFree", -- ' closing tick for hsc2hs
               "pfnInternalAllocation", "pfnInternalFree"]
        type CUnionType VkAllocationCallbacks = 'False -- ' closing tick for hsc2hs
        type ReturnedOnly VkAllocationCallbacks = 'False -- ' closing tick for hsc2hs
        type StructExtends VkAllocationCallbacks = '[] -- ' closing tick for hsc2hs

instance {-# OVERLAPPING #-}
         HasField "pUserData" VkAllocationCallbacks where
        type FieldType "pUserData" VkAllocationCallbacks = Ptr Void
        type FieldOptional "pUserData" VkAllocationCallbacks = 'True -- ' closing tick for hsc2hs
        type FieldOffset "pUserData" VkAllocationCallbacks =
             (0)
{-# LINE 90 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}
        type FieldIsArray "pUserData" VkAllocationCallbacks = 'False -- ' closing tick for hsc2hs

        {-# INLINE fieldOptional #-}
        fieldOptional = True

        {-# INLINE fieldOffset #-}
        fieldOffset
          = (0)
{-# LINE 98 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         CanReadField "pUserData" VkAllocationCallbacks where
        {-# NOINLINE getField #-}
        getField x
          = unsafeDupablePerformIO
              (peekByteOff (unsafePtr x) (0))
{-# LINE 105 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

        {-# INLINE readField #-}
        readField p
          = peekByteOff p (0)
{-# LINE 109 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         CanWriteField "pUserData" VkAllocationCallbacks where
        {-# INLINE writeField #-}
        writeField p
          = pokeByteOff p (0)
{-# LINE 115 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         HasField "pfnAllocation" VkAllocationCallbacks where
        type FieldType "pfnAllocation" VkAllocationCallbacks =
             PFN_vkAllocationFunction
        type FieldOptional "pfnAllocation" VkAllocationCallbacks = 'False -- ' closing tick for hsc2hs
        type FieldOffset "pfnAllocation" VkAllocationCallbacks =
             (8)
{-# LINE 123 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}
        type FieldIsArray "pfnAllocation" VkAllocationCallbacks = 'False -- ' closing tick for hsc2hs

        {-# INLINE fieldOptional #-}
        fieldOptional = False

        {-# INLINE fieldOffset #-}
        fieldOffset
          = (8)
{-# LINE 131 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         CanReadField "pfnAllocation" VkAllocationCallbacks where
        {-# NOINLINE getField #-}
        getField x
          = unsafeDupablePerformIO
              (peekByteOff (unsafePtr x) (8))
{-# LINE 138 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

        {-# INLINE readField #-}
        readField p
          = peekByteOff p (8)
{-# LINE 142 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         CanWriteField "pfnAllocation" VkAllocationCallbacks where
        {-# INLINE writeField #-}
        writeField p
          = pokeByteOff p (8)
{-# LINE 148 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         HasField "pfnReallocation" VkAllocationCallbacks where
        type FieldType "pfnReallocation" VkAllocationCallbacks =
             PFN_vkReallocationFunction
        type FieldOptional "pfnReallocation" VkAllocationCallbacks = 'False -- ' closing tick for hsc2hs
        type FieldOffset "pfnReallocation" VkAllocationCallbacks =
             (16)
{-# LINE 156 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}
        type FieldIsArray "pfnReallocation" VkAllocationCallbacks = 'False -- ' closing tick for hsc2hs

        {-# INLINE fieldOptional #-}
        fieldOptional = False

        {-# INLINE fieldOffset #-}
        fieldOffset
          = (16)
{-# LINE 164 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         CanReadField "pfnReallocation" VkAllocationCallbacks where
        {-# NOINLINE getField #-}
        getField x
          = unsafeDupablePerformIO
              (peekByteOff (unsafePtr x) (16))
{-# LINE 171 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

        {-# INLINE readField #-}
        readField p
          = peekByteOff p (16)
{-# LINE 175 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         CanWriteField "pfnReallocation" VkAllocationCallbacks where
        {-# INLINE writeField #-}
        writeField p
          = pokeByteOff p (16)
{-# LINE 181 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         HasField "pfnFree" VkAllocationCallbacks where
        type FieldType "pfnFree" VkAllocationCallbacks = PFN_vkFreeFunction
        type FieldOptional "pfnFree" VkAllocationCallbacks = 'False -- ' closing tick for hsc2hs
        type FieldOffset "pfnFree" VkAllocationCallbacks =
             (24)
{-# LINE 188 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}
        type FieldIsArray "pfnFree" VkAllocationCallbacks = 'False -- ' closing tick for hsc2hs

        {-# INLINE fieldOptional #-}
        fieldOptional = False

        {-# INLINE fieldOffset #-}
        fieldOffset = (24)
{-# LINE 195 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         CanReadField "pfnFree" VkAllocationCallbacks where
        {-# NOINLINE getField #-}
        getField x
          = unsafeDupablePerformIO
              (peekByteOff (unsafePtr x) (24))
{-# LINE 202 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

        {-# INLINE readField #-}
        readField p
          = peekByteOff p (24)
{-# LINE 206 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         CanWriteField "pfnFree" VkAllocationCallbacks where
        {-# INLINE writeField #-}
        writeField p
          = pokeByteOff p (24)
{-# LINE 212 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         HasField "pfnInternalAllocation" VkAllocationCallbacks where
        type FieldType "pfnInternalAllocation" VkAllocationCallbacks =
             PFN_vkInternalAllocationNotification
        type FieldOptional "pfnInternalAllocation" VkAllocationCallbacks =
             'True -- ' closing tick for hsc2hs
        type FieldOffset "pfnInternalAllocation" VkAllocationCallbacks =
             (32)
{-# LINE 221 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}
        type FieldIsArray "pfnInternalAllocation" VkAllocationCallbacks =
             'False -- ' closing tick for hsc2hs

        {-# INLINE fieldOptional #-}
        fieldOptional = True

        {-# INLINE fieldOffset #-}
        fieldOffset
          = (32)
{-# LINE 230 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         CanReadField "pfnInternalAllocation" VkAllocationCallbacks where
        {-# NOINLINE getField #-}
        getField x
          = unsafeDupablePerformIO
              (peekByteOff (unsafePtr x) (32))
{-# LINE 237 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

        {-# INLINE readField #-}
        readField p
          = peekByteOff p (32)
{-# LINE 241 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         CanWriteField "pfnInternalAllocation" VkAllocationCallbacks where
        {-# INLINE writeField #-}
        writeField p
          = pokeByteOff p (32)
{-# LINE 247 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         HasField "pfnInternalFree" VkAllocationCallbacks where
        type FieldType "pfnInternalFree" VkAllocationCallbacks =
             PFN_vkInternalFreeNotification
        type FieldOptional "pfnInternalFree" VkAllocationCallbacks = 'True -- ' closing tick for hsc2hs
        type FieldOffset "pfnInternalFree" VkAllocationCallbacks =
             (40)
{-# LINE 255 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}
        type FieldIsArray "pfnInternalFree" VkAllocationCallbacks = 'False -- ' closing tick for hsc2hs

        {-# INLINE fieldOptional #-}
        fieldOptional = True

        {-# INLINE fieldOffset #-}
        fieldOffset
          = (40)
{-# LINE 263 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         CanReadField "pfnInternalFree" VkAllocationCallbacks where
        {-# NOINLINE getField #-}
        getField x
          = unsafeDupablePerformIO
              (peekByteOff (unsafePtr x) (40))
{-# LINE 270 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

        {-# INLINE readField #-}
        readField p
          = peekByteOff p (40)
{-# LINE 274 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance {-# OVERLAPPING #-}
         CanWriteField "pfnInternalFree" VkAllocationCallbacks where
        {-# INLINE writeField #-}
        writeField p
          = pokeByteOff p (40)
{-# LINE 280 "src-gen/Graphics/Vulkan/Types/Struct/AllocationCallbacks.hsc" #-}

instance Show VkAllocationCallbacks where
        showsPrec d x
          = showString "VkAllocationCallbacks {" .
              showString "pUserData = " .
                showsPrec d (getField @"pUserData" x) .
                  showString ", " .
                    showString "pfnAllocation = " .
                      showsPrec d (getField @"pfnAllocation" x) .
                        showString ", " .
                          showString "pfnReallocation = " .
                            showsPrec d (getField @"pfnReallocation" x) .
                              showString ", " .
                                showString "pfnFree = " .
                                  showsPrec d (getField @"pfnFree" x) .
                                    showString ", " .
                                      showString "pfnInternalAllocation = " .
                                        showsPrec d (getField @"pfnInternalAllocation" x) .
                                          showString ", " .
                                            showString "pfnInternalFree = " .
                                              showsPrec d (getField @"pfnInternalFree" x) .
                                                showChar '}'