{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoFieldSelectors #-}
{-# LANGUAGE NoImplicitPrelude #-}

-- | A GUID is a 128-bit value that represents something that is uniquely identifiable by this value: \"globally unique.\"
--
--     SDL provides functions to convert a GUID to\/from a string. An 'SDL_GUID' is a 128-bit identifier for an input device that identifies that device across runs of SDL programs on the same platform.
--
--     If the device is detached and then re-attached to a different port, or if the base system is rebooted, the device should still report the same GUID.
--
--     GUIDs are as precise as possible but are not guaranteed to distinguish physically distinct but equivalent devices. For example, two game controllers from the same vendor with the same product ID and revision may have the same GUID.
--
--     GUIDs may be platform-dependent (i.e., the same device may report different GUIDs on different operating systems).
--
--     @since 3.2.0
module SDL3.Sys.Bindgen.Guid (
  SDL3.Sys.Bindgen.Guid.SDL_GUID (..),
)
where

import Prelude (Eq, Int, Show, pure, (<*>), type (~))

import HsBindgen.Runtime.ConstantArray qualified as CA
import HsBindgen.Runtime.HasCField qualified as HasCField
import HsBindgen.Runtime.Marshal qualified as Marshal
import HsBindgen.Runtime.Struct qualified as Struct
import HsBindgen.Runtime.Support qualified as BG
import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
import SDL3.Sys.Bindgen.Stdinc qualified

-- | [C declaration]: @struct SDL_GUID@, defined at @SDL3\/SDL_guid.h 61:16@
data SDL_GUID = SDL_GUID
  { SDL_GUID -> ConstantArray 16 Uint8
data' :: CA.ConstantArray 16 SDL3.Sys.Bindgen.Stdinc.Uint8
  -- ^ [C declaration]: @data@, defined at @SDL3\/SDL_guid.h 62:11@
  }
  deriving stock ((forall x. SDL_GUID -> Rep SDL_GUID x)
-> (forall x. Rep SDL_GUID x -> SDL_GUID) -> Generic SDL_GUID
forall x. Rep SDL_GUID x -> SDL_GUID
forall x. SDL_GUID -> Rep SDL_GUID x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. SDL_GUID -> Rep SDL_GUID x
from :: forall x. SDL_GUID -> Rep SDL_GUID x
$cto :: forall x. Rep SDL_GUID x -> SDL_GUID
to :: forall x. Rep SDL_GUID x -> SDL_GUID
BG.Generic, SDL_GUID -> SDL_GUID -> Bool
(SDL_GUID -> SDL_GUID -> Bool)
-> (SDL_GUID -> SDL_GUID -> Bool) -> Eq SDL_GUID
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SDL_GUID -> SDL_GUID -> Bool
== :: SDL_GUID -> SDL_GUID -> Bool
$c/= :: SDL_GUID -> SDL_GUID -> Bool
/= :: SDL_GUID -> SDL_GUID -> Bool
Eq, Int -> SDL_GUID -> ShowS
[SDL_GUID] -> ShowS
SDL_GUID -> String
(Int -> SDL_GUID -> ShowS)
-> (SDL_GUID -> String) -> ([SDL_GUID] -> ShowS) -> Show SDL_GUID
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SDL_GUID -> ShowS
showsPrec :: Int -> SDL_GUID -> ShowS
$cshow :: SDL_GUID -> String
show :: SDL_GUID -> String
$cshowList :: [SDL_GUID] -> ShowS
showList :: [SDL_GUID] -> ShowS
Show)

instance Marshal.StaticSize SDL_GUID where
  staticSizeOf :: Proxy SDL_GUID -> Int
staticSizeOf = \Proxy SDL_GUID
_ -> (Int
16 :: Int)

  staticAlignment :: Proxy SDL_GUID -> Int
staticAlignment = \Proxy SDL_GUID
_ -> (Int
1 :: Int)

instance Marshal.ReadRaw SDL_GUID where
  readRaw :: Ptr SDL_GUID -> IO SDL_GUID
readRaw =
    \Ptr SDL_GUID
ptr0 ->
      (ConstantArray 16 Uint8 -> SDL_GUID)
-> IO (ConstantArray 16 Uint8 -> SDL_GUID)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ConstantArray 16 Uint8 -> SDL_GUID
SDL_GUID
        IO (ConstantArray 16 Uint8 -> SDL_GUID)
-> IO (ConstantArray 16 Uint8) -> IO SDL_GUID
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Proxy "data'" -> Ptr SDL_GUID -> IO (CFieldType SDL_GUID "data'")
forall a (field :: Symbol).
(HasCField a field, ReadRaw (CFieldType a field)) =>
Proxy field -> Ptr a -> IO (CFieldType a field)
HasCField.readRaw (forall {k} (t :: k). Proxy t
forall (t :: Symbol). Proxy t
BG.Proxy @"data'") Ptr SDL_GUID
ptr0

instance Marshal.WriteRaw SDL_GUID where
  writeRaw :: Ptr SDL_GUID -> SDL_GUID -> IO ()
writeRaw =
    \Ptr SDL_GUID
ptr0 ->
      \SDL_GUID
s1 ->
        case SDL_GUID
s1 of
          SDL_GUID ConstantArray 16 Uint8
data'2 ->
            Proxy "data'"
-> Ptr SDL_GUID -> CFieldType SDL_GUID "data'" -> IO ()
forall a (field :: Symbol).
(HasCField a field, WriteRaw (CFieldType a field)) =>
Proxy field -> Ptr a -> CFieldType a field -> IO ()
HasCField.writeRaw (forall {k} (t :: k). Proxy t
forall (t :: Symbol). Proxy t
BG.Proxy @"data'") Ptr SDL_GUID
ptr0 CFieldType SDL_GUID "data'"
ConstantArray 16 Uint8
data'2

deriving via Marshal.EquivStorable SDL_GUID instance BG.Storable SDL_GUID

deriving via Struct.IsStructViaReadRaw SDL_GUID instance Struct.IsStruct SDL_GUID

-- | [C declaration]: @data@, defined at @SDL3\/SDL_guid.h 62:11@
instance
  (ty ~ CA.ConstantArray 16 SDL3.Sys.Bindgen.Stdinc.Uint8)
  => BG.CompatHasField.HasField "data'" SDL_GUID ty
  where
  hasField :: SDL_GUID -> (ty -> SDL_GUID, ty)
hasField =
    \SDL_GUID
x0 ->
      ( \ty
y1 ->
          SDL_GUID{data' :: ConstantArray 16 Uint8
data' = ty
ConstantArray 16 Uint8
y1}
      , forall {k} (x :: k) r a. HasField x r a => r -> a
forall (x :: Symbol) r a. HasField x r a => r -> a
BG.getField @"data'" SDL_GUID
x0
      )

instance
  (ty ~ CA.ConstantArray 16 SDL3.Sys.Bindgen.Stdinc.Uint8)
  => BG.HasField "data'" (BG.Ptr SDL_GUID) (BG.Ptr ty)
  where
  getField :: Ptr SDL_GUID -> Ptr ty
getField = Proxy "data'" -> Ptr SDL_GUID -> Ptr (CFieldType SDL_GUID "data'")
forall a (field :: Symbol).
HasCField a field =>
Proxy field -> Ptr a -> Ptr (CFieldType a field)
HasCField.fromPtr (forall {k} (t :: k). Proxy t
forall (t :: Symbol). Proxy t
BG.Proxy @"data'")

instance HasCField.HasCField SDL_GUID "data'" where
  type
    CFieldType SDL_GUID "data'" =
      CA.ConstantArray 16 SDL3.Sys.Bindgen.Stdinc.Uint8

  offset# :: Proxy# SDL_GUID -> Proxy# "data'" -> Int
offset# = \Proxy# SDL_GUID
_ -> \Proxy# "data'"
_ -> Int
0