{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)

A structure that provides information to the type system which is
used specifically for managing fundamental types.
-}

module GI.GObject.Structs.TypeFundamentalInfo
    ( 

-- * Exported types
    TypeFundamentalInfo(..)                 ,
    newZeroTypeFundamentalInfo              ,
    noTypeFundamentalInfo                   ,


 -- * Properties
-- ** typeFlags #attr:typeFlags#
    getTypeFundamentalInfoTypeFlags         ,
    setTypeFundamentalInfoTypeFlags         ,
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    typeFundamentalInfo_typeFlags           ,
#endif




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP

import {-# SOURCE #-} qualified GI.GObject.Flags as GObject.Flags

newtype TypeFundamentalInfo = TypeFundamentalInfo (ManagedPtr TypeFundamentalInfo)
instance WrappedPtr TypeFundamentalInfo where
    wrappedPtrCalloc = callocBytes 4
    wrappedPtrCopy = \p -> withManagedPtr p (copyBytes 4 >=> wrapPtr TypeFundamentalInfo)
    wrappedPtrFree = Just ptr_to_g_free

-- | Construct a `TypeFundamentalInfo` struct initialized to zero.
newZeroTypeFundamentalInfo :: MonadIO m => m TypeFundamentalInfo
newZeroTypeFundamentalInfo = liftIO $ wrappedPtrCalloc >>= wrapPtr TypeFundamentalInfo

instance tag ~ 'AttrSet => Constructible TypeFundamentalInfo tag where
    new _ attrs = do
        o <- newZeroTypeFundamentalInfo
        GI.Attributes.set o attrs
        return o


noTypeFundamentalInfo :: Maybe TypeFundamentalInfo
noTypeFundamentalInfo = Nothing

getTypeFundamentalInfoTypeFlags :: MonadIO m => TypeFundamentalInfo -> m [GObject.Flags.TypeFundamentalFlags]
getTypeFundamentalInfoTypeFlags s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 0) :: IO CUInt
    let val' = wordToGFlags val
    return val'

setTypeFundamentalInfoTypeFlags :: MonadIO m => TypeFundamentalInfo -> [GObject.Flags.TypeFundamentalFlags] -> m ()
setTypeFundamentalInfoTypeFlags s val = liftIO $ withManagedPtr s $ \ptr -> do
    let val' = gflagsToWord val
    poke (ptr `plusPtr` 0) (val' :: CUInt)

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data TypeFundamentalInfoTypeFlagsFieldInfo
instance AttrInfo TypeFundamentalInfoTypeFlagsFieldInfo where
    type AttrAllowedOps TypeFundamentalInfoTypeFlagsFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint TypeFundamentalInfoTypeFlagsFieldInfo = (~) [GObject.Flags.TypeFundamentalFlags]
    type AttrBaseTypeConstraint TypeFundamentalInfoTypeFlagsFieldInfo = (~) TypeFundamentalInfo
    type AttrGetType TypeFundamentalInfoTypeFlagsFieldInfo = [GObject.Flags.TypeFundamentalFlags]
    type AttrLabel TypeFundamentalInfoTypeFlagsFieldInfo = "type_flags"
    type AttrOrigin TypeFundamentalInfoTypeFlagsFieldInfo = TypeFundamentalInfo
    attrGet _ = getTypeFundamentalInfoTypeFlags
    attrSet _ = setTypeFundamentalInfoTypeFlags
    attrConstruct = undefined
    attrClear _ = undefined

typeFundamentalInfo_typeFlags :: AttrLabelProxy "typeFlags"
typeFundamentalInfo_typeFlags = AttrLabelProxy

#endif



#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
instance O.HasAttributeList TypeFundamentalInfo
type instance O.AttributeList TypeFundamentalInfo = TypeFundamentalInfoAttributeList
type TypeFundamentalInfoAttributeList = ('[ '("typeFlags", TypeFundamentalInfoTypeFlagsFieldInfo)] :: [(Symbol, *)])
#endif

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
type family ResolveTypeFundamentalInfoMethod (t :: Symbol) (o :: *) :: * where
    ResolveTypeFundamentalInfoMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveTypeFundamentalInfoMethod t TypeFundamentalInfo, O.MethodInfo info TypeFundamentalInfo p) => O.IsLabelProxy t (TypeFundamentalInfo -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveTypeFundamentalInfoMethod t TypeFundamentalInfo, O.MethodInfo info TypeFundamentalInfo p) => O.IsLabel t (TypeFundamentalInfo -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#else
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif
#endif

#endif