{-# language CPP #-}

module OpenXR.Zero
  ( Zero(..)
  ) where

#if defined(USE_VULKAN_TYPES)

import           Vulkan.Zero

#else

import           Data.Int                       ( Int16 )
import           Data.Int                       ( Int32 )
import           Data.Int                       ( Int64 )
import           Data.Int                       ( Int8 )
import           Data.Word                      ( Word16 )
import           Data.Word                      ( Word32 )
import           Data.Word                      ( Word64 )
import           Data.Word                      ( Word8 )
import           Foreign.C.Types                ( CChar )
import           Foreign.C.Types                ( CFloat )
import           Foreign.C.Types                ( CInt )
import           Foreign.C.Types                ( CSize )
import           Foreign.Ptr                    ( nullPtr )
import           Foreign.Ptr                    ( FunPtr )
import           Foreign.Ptr                    ( Ptr )
import           Foreign.Storable               ( Storable )
import           GHC.Ptr                        ( nullFunPtr )
import           GHC.TypeNats                   ( KnownNat )

-- | A class for initializing things with all zero data
--
-- Any instance should satisfy the following law:
--
-- @ new zero = calloc @ or @ with zero = withZeroCStruct @
--
-- i.e. Marshaling @zero@ to memory yeilds only zero-valued bytes, except
-- for structs which require a "type" tag, or pointers to empty strings etc...
class Zero a where
  zero :: a

instance Zero Bool where
  zero = False

instance Zero (FunPtr a) where
  zero = nullFunPtr

instance Zero (Ptr a) where
  zero = nullPtr

instance Zero Int8 where
  zero = 0

instance Zero Int16 where
  zero = 0

instance Zero Int32 where
  zero = 0

instance Zero Int64 where
  zero = 0

instance Zero Word8 where
  zero = 0

instance Zero Word16 where
  zero = 0

instance Zero Word32 where
  zero = 0

instance Zero Word64 where
  zero = 0

instance Zero Float where
  zero = 0

instance Zero CFloat where
  zero = 0

instance Zero CChar where
  zero = 0

instance Zero CSize where
  zero = 0

instance Zero CInt where
  zero = 0

#endif