#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
&& !defined(__HADDOCK_VERSION__))
module GI.GLib.Structs.Once
(
Once(..) ,
newZeroOnce ,
noOnce ,
onceInitEnter ,
onceInitLeave ,
clearOnceRetval ,
getOnceRetval ,
#if ENABLE_OVERLOADING
once_retval ,
#endif
setOnceRetval ,
getOnceStatus ,
#if ENABLE_OVERLOADING
once_status ,
#endif
setOnceStatus ,
) 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.GClosure as B.GClosure
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GValue as B.GValue
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.GI.Base.Properties as B.Properties
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 qualified GHC.OverloadedLabels as OL
import {-# SOURCE #-} qualified GI.GLib.Enums as GLib.Enums
newtype Once = Once (ManagedPtr Once)
instance WrappedPtr Once where
wrappedPtrCalloc = callocBytes 16
wrappedPtrCopy = \p -> withManagedPtr p (copyBytes 16 >=> wrapPtr Once)
wrappedPtrFree = Just ptr_to_g_free
newZeroOnce :: MonadIO m => m Once
newZeroOnce = liftIO $ wrappedPtrCalloc >>= wrapPtr Once
instance tag ~ 'AttrSet => Constructible Once tag where
new _ attrs = do
o <- newZeroOnce
GI.Attributes.set o attrs
return o
noOnce :: Maybe Once
noOnce = Nothing
getOnceStatus :: MonadIO m => Once -> m GLib.Enums.OnceStatus
getOnceStatus s = liftIO $ withManagedPtr s $ \ptr -> do
val <- peek (ptr `plusPtr` 0) :: IO CUInt
let val' = (toEnum . fromIntegral) val
return val'
setOnceStatus :: MonadIO m => Once -> GLib.Enums.OnceStatus -> m ()
setOnceStatus s val = liftIO $ withManagedPtr s $ \ptr -> do
let val' = (fromIntegral . fromEnum) val
poke (ptr `plusPtr` 0) (val' :: CUInt)
#if ENABLE_OVERLOADING
data OnceStatusFieldInfo
instance AttrInfo OnceStatusFieldInfo where
type AttrAllowedOps OnceStatusFieldInfo = '[ 'AttrSet, 'AttrGet]
type AttrSetTypeConstraint OnceStatusFieldInfo = (~) GLib.Enums.OnceStatus
type AttrBaseTypeConstraint OnceStatusFieldInfo = (~) Once
type AttrGetType OnceStatusFieldInfo = GLib.Enums.OnceStatus
type AttrLabel OnceStatusFieldInfo = "status"
type AttrOrigin OnceStatusFieldInfo = Once
attrGet _ = getOnceStatus
attrSet _ = setOnceStatus
attrConstruct = undefined
attrClear _ = undefined
once_status :: AttrLabelProxy "status"
once_status = AttrLabelProxy
#endif
getOnceRetval :: MonadIO m => Once -> m (Ptr ())
getOnceRetval s = liftIO $ withManagedPtr s $ \ptr -> do
val <- peek (ptr `plusPtr` 8) :: IO (Ptr ())
return val
setOnceRetval :: MonadIO m => Once -> Ptr () -> m ()
setOnceRetval s val = liftIO $ withManagedPtr s $ \ptr -> do
poke (ptr `plusPtr` 8) (val :: Ptr ())
clearOnceRetval :: MonadIO m => Once -> m ()
clearOnceRetval s = liftIO $ withManagedPtr s $ \ptr -> do
poke (ptr `plusPtr` 8) (FP.nullPtr :: Ptr ())
#if ENABLE_OVERLOADING
data OnceRetvalFieldInfo
instance AttrInfo OnceRetvalFieldInfo where
type AttrAllowedOps OnceRetvalFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
type AttrSetTypeConstraint OnceRetvalFieldInfo = (~) (Ptr ())
type AttrBaseTypeConstraint OnceRetvalFieldInfo = (~) Once
type AttrGetType OnceRetvalFieldInfo = Ptr ()
type AttrLabel OnceRetvalFieldInfo = "retval"
type AttrOrigin OnceRetvalFieldInfo = Once
attrGet _ = getOnceRetval
attrSet _ = setOnceRetval
attrConstruct = undefined
attrClear _ = clearOnceRetval
once_retval :: AttrLabelProxy "retval"
once_retval = AttrLabelProxy
#endif
#if ENABLE_OVERLOADING
instance O.HasAttributeList Once
type instance O.AttributeList Once = OnceAttributeList
type OnceAttributeList = ('[ '("status", OnceStatusFieldInfo), '("retval", OnceRetvalFieldInfo)] :: [(Symbol, *)])
#endif
foreign import ccall "g_once_init_enter" g_once_init_enter ::
Ptr () ->
IO CInt
onceInitEnter ::
(B.CallStack.HasCallStack, MonadIO m) =>
Ptr ()
-> m Bool
onceInitEnter location = liftIO $ do
result <- g_once_init_enter location
let result' = (/= 0) result
return result'
#if ENABLE_OVERLOADING
#endif
foreign import ccall "g_once_init_leave" g_once_init_leave ::
Ptr () ->
Word64 ->
IO ()
onceInitLeave ::
(B.CallStack.HasCallStack, MonadIO m) =>
Ptr ()
-> Word64
-> m ()
onceInitLeave location result_ = liftIO $ do
g_once_init_leave location result_
return ()
#if ENABLE_OVERLOADING
#endif
#if ENABLE_OVERLOADING
type family ResolveOnceMethod (t :: Symbol) (o :: *) :: * where
ResolveOnceMethod l o = O.MethodResolutionFailed l o
instance (info ~ ResolveOnceMethod t Once, O.MethodInfo info Once p) => OL.IsLabel t (Once -> 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