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

Contains the public fields of a
[Queue][glib-Double-ended-Queues].
-}

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !defined(__HADDOCK_VERSION__))

module GI.GLib.Structs.Queue
    (

-- * Exported types
    Queue(..)                               ,
    newZeroQueue                            ,
    noQueue                                 ,


 -- * Methods
-- ** clear #method:clear#

#if ENABLE_OVERLOADING
    QueueClearMethodInfo                    ,
#endif
    queueClear                              ,


-- ** clearFull #method:clearFull#

#if ENABLE_OVERLOADING
    QueueClearFullMethodInfo                ,
#endif
    queueClearFull                          ,


-- ** free #method:free#

#if ENABLE_OVERLOADING
    QueueFreeMethodInfo                     ,
#endif
    queueFree                               ,


-- ** freeFull #method:freeFull#

#if ENABLE_OVERLOADING
    QueueFreeFullMethodInfo                 ,
#endif
    queueFreeFull                           ,


-- ** getLength #method:getLength#

#if ENABLE_OVERLOADING
    QueueGetLengthMethodInfo                ,
#endif
    queueGetLength                          ,


-- ** index #method:index#

#if ENABLE_OVERLOADING
    QueueIndexMethodInfo                    ,
#endif
    queueIndex                              ,


-- ** init #method:init#

#if ENABLE_OVERLOADING
    QueueInitMethodInfo                     ,
#endif
    queueInit                               ,


-- ** isEmpty #method:isEmpty#

#if ENABLE_OVERLOADING
    QueueIsEmptyMethodInfo                  ,
#endif
    queueIsEmpty                            ,


-- ** peekHead #method:peekHead#

#if ENABLE_OVERLOADING
    QueuePeekHeadMethodInfo                 ,
#endif
    queuePeekHead                           ,


-- ** peekNth #method:peekNth#

#if ENABLE_OVERLOADING
    QueuePeekNthMethodInfo                  ,
#endif
    queuePeekNth                            ,


-- ** peekTail #method:peekTail#

#if ENABLE_OVERLOADING
    QueuePeekTailMethodInfo                 ,
#endif
    queuePeekTail                           ,


-- ** popHead #method:popHead#

#if ENABLE_OVERLOADING
    QueuePopHeadMethodInfo                  ,
#endif
    queuePopHead                            ,


-- ** popNth #method:popNth#

#if ENABLE_OVERLOADING
    QueuePopNthMethodInfo                   ,
#endif
    queuePopNth                             ,


-- ** popTail #method:popTail#

#if ENABLE_OVERLOADING
    QueuePopTailMethodInfo                  ,
#endif
    queuePopTail                            ,


-- ** pushHead #method:pushHead#

#if ENABLE_OVERLOADING
    QueuePushHeadMethodInfo                 ,
#endif
    queuePushHead                           ,


-- ** pushNth #method:pushNth#

#if ENABLE_OVERLOADING
    QueuePushNthMethodInfo                  ,
#endif
    queuePushNth                            ,


-- ** pushTail #method:pushTail#

#if ENABLE_OVERLOADING
    QueuePushTailMethodInfo                 ,
#endif
    queuePushTail                           ,


-- ** remove #method:remove#

#if ENABLE_OVERLOADING
    QueueRemoveMethodInfo                   ,
#endif
    queueRemove                             ,


-- ** removeAll #method:removeAll#

#if ENABLE_OVERLOADING
    QueueRemoveAllMethodInfo                ,
#endif
    queueRemoveAll                          ,


-- ** reverse #method:reverse#

#if ENABLE_OVERLOADING
    QueueReverseMethodInfo                  ,
#endif
    queueReverse                            ,




 -- * Properties
-- ** head #attr:head#
{- | a pointer to the first element of the queue
-}
    clearQueueHead                          ,
    getQueueHead                            ,
#if ENABLE_OVERLOADING
    queue_head                              ,
#endif
    setQueueHead                            ,


-- ** length #attr:length#
{- | the number of elements in the queue
-}
    getQueueLength                          ,
#if ENABLE_OVERLOADING
    queue_length                            ,
#endif
    setQueueLength                          ,


-- ** tail #attr:tail#
{- | a pointer to the last element of the queue
-}
    clearQueueTail                          ,
    getQueueTail                            ,
#if ENABLE_OVERLOADING
    queue_tail                              ,
#endif
    setQueueTail                            ,




    ) 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 qualified GI.GLib.Callbacks as GLib.Callbacks

-- | Memory-managed wrapper type.
newtype Queue = Queue (ManagedPtr Queue)
instance WrappedPtr Queue where
    wrappedPtrCalloc = callocBytes 24
    wrappedPtrCopy = \p -> withManagedPtr p (copyBytes 24 >=> wrapPtr Queue)
    wrappedPtrFree = Just ptr_to_g_free

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

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


-- | A convenience alias for `Nothing` :: `Maybe` `Queue`.
noQueue :: Maybe Queue
noQueue = Nothing

{- |
Get the value of the “@head@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' queue #head
@
-}
getQueueHead :: MonadIO m => Queue -> m ([Ptr ()])
getQueueHead s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 0) :: IO (Ptr (GList (Ptr ())))
    val' <- unpackGList val
    return val'

{- |
Set the value of the “@head@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' queue [ #head 'Data.GI.Base.Attributes.:=' value ]
@
-}
setQueueHead :: MonadIO m => Queue -> Ptr (GList (Ptr ())) -> m ()
setQueueHead s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 0) (val :: Ptr (GList (Ptr ())))

{- |
Set the value of the “@head@” field to `Nothing`.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.clear' #head
@
-}
clearQueueHead :: MonadIO m => Queue -> m ()
clearQueueHead s = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 0) (FP.nullPtr :: Ptr (GList (Ptr ())))

#if ENABLE_OVERLOADING
data QueueHeadFieldInfo
instance AttrInfo QueueHeadFieldInfo where
    type AttrAllowedOps QueueHeadFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
    type AttrSetTypeConstraint QueueHeadFieldInfo = (~) (Ptr (GList (Ptr ())))
    type AttrBaseTypeConstraint QueueHeadFieldInfo = (~) Queue
    type AttrGetType QueueHeadFieldInfo = [Ptr ()]
    type AttrLabel QueueHeadFieldInfo = "head"
    type AttrOrigin QueueHeadFieldInfo = Queue
    attrGet _ = getQueueHead
    attrSet _ = setQueueHead
    attrConstruct = undefined
    attrClear _ = clearQueueHead

queue_head :: AttrLabelProxy "head"
queue_head = AttrLabelProxy

#endif


{- |
Get the value of the “@tail@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' queue #tail
@
-}
getQueueTail :: MonadIO m => Queue -> m ([Ptr ()])
getQueueTail s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 8) :: IO (Ptr (GList (Ptr ())))
    val' <- unpackGList val
    return val'

{- |
Set the value of the “@tail@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' queue [ #tail 'Data.GI.Base.Attributes.:=' value ]
@
-}
setQueueTail :: MonadIO m => Queue -> Ptr (GList (Ptr ())) -> m ()
setQueueTail s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 8) (val :: Ptr (GList (Ptr ())))

{- |
Set the value of the “@tail@” field to `Nothing`.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.clear' #tail
@
-}
clearQueueTail :: MonadIO m => Queue -> m ()
clearQueueTail s = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 8) (FP.nullPtr :: Ptr (GList (Ptr ())))

#if ENABLE_OVERLOADING
data QueueTailFieldInfo
instance AttrInfo QueueTailFieldInfo where
    type AttrAllowedOps QueueTailFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
    type AttrSetTypeConstraint QueueTailFieldInfo = (~) (Ptr (GList (Ptr ())))
    type AttrBaseTypeConstraint QueueTailFieldInfo = (~) Queue
    type AttrGetType QueueTailFieldInfo = [Ptr ()]
    type AttrLabel QueueTailFieldInfo = "tail"
    type AttrOrigin QueueTailFieldInfo = Queue
    attrGet _ = getQueueTail
    attrSet _ = setQueueTail
    attrConstruct = undefined
    attrClear _ = clearQueueTail

queue_tail :: AttrLabelProxy "tail"
queue_tail = AttrLabelProxy

#endif


{- |
Get the value of the “@length@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' queue #length
@
-}
getQueueLength :: MonadIO m => Queue -> m Word32
getQueueLength s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 16) :: IO Word32
    return val

{- |
Set the value of the “@length@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' queue [ #length 'Data.GI.Base.Attributes.:=' value ]
@
-}
setQueueLength :: MonadIO m => Queue -> Word32 -> m ()
setQueueLength s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 16) (val :: Word32)

#if ENABLE_OVERLOADING
data QueueLengthFieldInfo
instance AttrInfo QueueLengthFieldInfo where
    type AttrAllowedOps QueueLengthFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint QueueLengthFieldInfo = (~) Word32
    type AttrBaseTypeConstraint QueueLengthFieldInfo = (~) Queue
    type AttrGetType QueueLengthFieldInfo = Word32
    type AttrLabel QueueLengthFieldInfo = "length"
    type AttrOrigin QueueLengthFieldInfo = Queue
    attrGet _ = getQueueLength
    attrSet _ = setQueueLength
    attrConstruct = undefined
    attrClear _ = undefined

queue_length :: AttrLabelProxy "length"
queue_length = AttrLabelProxy

#endif



#if ENABLE_OVERLOADING
instance O.HasAttributeList Queue
type instance O.AttributeList Queue = QueueAttributeList
type QueueAttributeList = ('[ '("head", QueueHeadFieldInfo), '("tail", QueueTailFieldInfo), '("length", QueueLengthFieldInfo)] :: [(Symbol, *)])
#endif

-- method Queue::clear
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_clear" g_queue_clear ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    IO ()

{- |
Removes all the elements in /@queue@/. If queue elements contain
dynamically-allocated memory, they should be freed first.

/Since: 2.14/
-}
queueClear ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> m ()
queueClear queue = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    g_queue_clear queue'
    touchManagedPtr queue
    return ()

#if ENABLE_OVERLOADING
data QueueClearMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo QueueClearMethodInfo Queue signature where
    overloadedMethod _ = queueClear

#endif

-- method Queue::clear_full
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a pointer to a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "free_func", argType = TInterface (Name {namespace = "GLib", name = "DestroyNotify"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the function to be called to free memory allocated", sinceVersion = Nothing}, argScope = ScopeTypeAsync, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_clear_full" g_queue_clear_full ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    FunPtr GLib.Callbacks.C_DestroyNotify -> -- free_func : TInterface (Name {namespace = "GLib", name = "DestroyNotify"})
    IO ()

{- |
Convenience method, which frees all the memory used by a 'GI.GLib.Structs.Queue.Queue',
and calls the provided /@freeFunc@/ on each item in the 'GI.GLib.Structs.Queue.Queue'.

/Since: 2.60/
-}
queueClearFull ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a pointer to a 'GI.GLib.Structs.Queue.Queue' -}
    -> Maybe (GLib.Callbacks.DestroyNotify)
    {- ^ /@freeFunc@/: the function to be called to free memory allocated -}
    -> m ()
queueClearFull queue freeFunc = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    maybeFreeFunc <- case freeFunc of
        Nothing -> return (castPtrToFunPtr nullPtr)
        Just jFreeFunc -> do
            ptrfreeFunc <- callocMem :: IO (Ptr (FunPtr GLib.Callbacks.C_DestroyNotify))
            jFreeFunc' <- GLib.Callbacks.mk_DestroyNotify (GLib.Callbacks.wrap_DestroyNotify (Just ptrfreeFunc) jFreeFunc)
            poke ptrfreeFunc jFreeFunc'
            return jFreeFunc'
    g_queue_clear_full queue' maybeFreeFunc
    touchManagedPtr queue
    return ()

#if ENABLE_OVERLOADING
data QueueClearFullMethodInfo
instance (signature ~ (Maybe (GLib.Callbacks.DestroyNotify) -> m ()), MonadIO m) => O.MethodInfo QueueClearFullMethodInfo Queue signature where
    overloadedMethod _ = queueClearFull

#endif

-- method Queue::free
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_free" g_queue_free ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    IO ()

{- |
Frees the memory allocated for the 'GI.GLib.Structs.Queue.Queue'. Only call this function
if /@queue@/ was created with @/g_queue_new()/@. If queue elements contain
dynamically-allocated memory, they should be freed first.

If queue elements contain dynamically-allocated memory, you should
either use 'GI.GLib.Structs.Queue.queueFreeFull' or free them manually first.
-}
queueFree ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> m ()
queueFree queue = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    g_queue_free queue'
    touchManagedPtr queue
    return ()

#if ENABLE_OVERLOADING
data QueueFreeMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo QueueFreeMethodInfo Queue signature where
    overloadedMethod _ = queueFree

#endif

-- method Queue::free_full
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a pointer to a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "free_func", argType = TInterface (Name {namespace = "GLib", name = "DestroyNotify"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the function to be called to free each element's data", sinceVersion = Nothing}, argScope = ScopeTypeAsync, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_free_full" g_queue_free_full ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    FunPtr GLib.Callbacks.C_DestroyNotify -> -- free_func : TInterface (Name {namespace = "GLib", name = "DestroyNotify"})
    IO ()

{- |
Convenience method, which frees all the memory used by a 'GI.GLib.Structs.Queue.Queue',
and calls the specified destroy function on every element\'s data.

/@freeFunc@/ should not modify the queue (eg, by removing the freed
element from it).

/Since: 2.32/
-}
queueFreeFull ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a pointer to a 'GI.GLib.Structs.Queue.Queue' -}
    -> GLib.Callbacks.DestroyNotify
    {- ^ /@freeFunc@/: the function to be called to free each element\'s data -}
    -> m ()
queueFreeFull queue freeFunc = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    ptrfreeFunc <- callocMem :: IO (Ptr (FunPtr GLib.Callbacks.C_DestroyNotify))
    freeFunc' <- GLib.Callbacks.mk_DestroyNotify (GLib.Callbacks.wrap_DestroyNotify (Just ptrfreeFunc) freeFunc)
    poke ptrfreeFunc freeFunc'
    g_queue_free_full queue' freeFunc'
    touchManagedPtr queue
    return ()

#if ENABLE_OVERLOADING
data QueueFreeFullMethodInfo
instance (signature ~ (GLib.Callbacks.DestroyNotify -> m ()), MonadIO m) => O.MethodInfo QueueFreeFullMethodInfo Queue signature where
    overloadedMethod _ = queueFreeFull

#endif

-- method Queue::get_length
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUInt)
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_get_length" g_queue_get_length ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    IO Word32

{- |
Returns the number of items in /@queue@/.

/Since: 2.4/
-}
queueGetLength ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> m Word32
    {- ^ __Returns:__ the number of items in /@queue@/ -}
queueGetLength queue = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    result <- g_queue_get_length queue'
    touchManagedPtr queue
    return result

#if ENABLE_OVERLOADING
data QueueGetLengthMethodInfo
instance (signature ~ (m Word32), MonadIO m) => O.MethodInfo QueueGetLengthMethodInfo Queue signature where
    overloadedMethod _ = queueGetLength

#endif

-- method Queue::index
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the data to find", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_index" g_queue_index ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    Ptr () ->                               -- data : TBasicType TPtr
    IO Int32

{- |
Returns the position of the first element in /@queue@/ which contains /@data@/.

/Since: 2.4/
-}
queueIndex ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> Ptr ()
    {- ^ /@data@/: the data to find -}
    -> m Int32
    {- ^ __Returns:__ the position of the first element in /@queue@/ which
    contains /@data@/, or -1 if no element in /@queue@/ contains /@data@/ -}
queueIndex queue data_ = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    result <- g_queue_index queue' data_
    touchManagedPtr queue
    return result

#if ENABLE_OVERLOADING
data QueueIndexMethodInfo
instance (signature ~ (Ptr () -> m Int32), MonadIO m) => O.MethodInfo QueueIndexMethodInfo Queue signature where
    overloadedMethod _ = queueIndex

#endif

-- method Queue::init
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "an uninitialized #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_init" g_queue_init ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    IO ()

{- |
A statically-allocated 'GI.GLib.Structs.Queue.Queue' must be initialized with this function
before it can be used. Alternatively you can initialize it with
@/G_QUEUE_INIT/@. It is not necessary to initialize queues created with
@/g_queue_new()/@.

/Since: 2.14/
-}
queueInit ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: an uninitialized 'GI.GLib.Structs.Queue.Queue' -}
    -> m ()
queueInit queue = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    g_queue_init queue'
    touchManagedPtr queue
    return ()

#if ENABLE_OVERLOADING
data QueueInitMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo QueueInitMethodInfo Queue signature where
    overloadedMethod _ = queueInit

#endif

-- method Queue::is_empty
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_is_empty" g_queue_is_empty ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    IO CInt

{- |
Returns 'True' if the queue is empty.
-}
queueIsEmpty ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue'. -}
    -> m Bool
    {- ^ __Returns:__ 'True' if the queue is empty -}
queueIsEmpty queue = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    result <- g_queue_is_empty queue'
    let result' = (/= 0) result
    touchManagedPtr queue
    return result'

#if ENABLE_OVERLOADING
data QueueIsEmptyMethodInfo
instance (signature ~ (m Bool), MonadIO m) => O.MethodInfo QueueIsEmptyMethodInfo Queue signature where
    overloadedMethod _ = queueIsEmpty

#endif

-- method Queue::peek_head
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TPtr)
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_peek_head" g_queue_peek_head ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    IO (Ptr ())

{- |
Returns the first element of the queue.
-}
queuePeekHead ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> m (Ptr ())
    {- ^ __Returns:__ the data of the first element in the queue, or 'Nothing'
    if the queue is empty -}
queuePeekHead queue = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    result <- g_queue_peek_head queue'
    touchManagedPtr queue
    return result

#if ENABLE_OVERLOADING
data QueuePeekHeadMethodInfo
instance (signature ~ (m (Ptr ())), MonadIO m) => O.MethodInfo QueuePeekHeadMethodInfo Queue signature where
    overloadedMethod _ = queuePeekHead

#endif

-- method Queue::peek_nth
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "n", argType = TBasicType TUInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the position of the element", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TPtr)
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_peek_nth" g_queue_peek_nth ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    Word32 ->                               -- n : TBasicType TUInt
    IO (Ptr ())

{- |
Returns the /@n@/\'th element of /@queue@/.

/Since: 2.4/
-}
queuePeekNth ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> Word32
    {- ^ /@n@/: the position of the element -}
    -> m (Ptr ())
    {- ^ __Returns:__ the data for the /@n@/\'th element of /@queue@/,
    or 'Nothing' if /@n@/ is off the end of /@queue@/ -}
queuePeekNth queue n = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    result <- g_queue_peek_nth queue' n
    touchManagedPtr queue
    return result

#if ENABLE_OVERLOADING
data QueuePeekNthMethodInfo
instance (signature ~ (Word32 -> m (Ptr ())), MonadIO m) => O.MethodInfo QueuePeekNthMethodInfo Queue signature where
    overloadedMethod _ = queuePeekNth

#endif

-- method Queue::peek_tail
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TPtr)
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_peek_tail" g_queue_peek_tail ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    IO (Ptr ())

{- |
Returns the last element of the queue.
-}
queuePeekTail ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> m (Ptr ())
    {- ^ __Returns:__ the data of the last element in the queue, or 'Nothing'
    if the queue is empty -}
queuePeekTail queue = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    result <- g_queue_peek_tail queue'
    touchManagedPtr queue
    return result

#if ENABLE_OVERLOADING
data QueuePeekTailMethodInfo
instance (signature ~ (m (Ptr ())), MonadIO m) => O.MethodInfo QueuePeekTailMethodInfo Queue signature where
    overloadedMethod _ = queuePeekTail

#endif

-- method Queue::pop_head
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TPtr)
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_pop_head" g_queue_pop_head ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    IO (Ptr ())

{- |
Removes the first element of the queue and returns its data.
-}
queuePopHead ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> m (Ptr ())
    {- ^ __Returns:__ the data of the first element in the queue, or 'Nothing'
    if the queue is empty -}
queuePopHead queue = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    result <- g_queue_pop_head queue'
    touchManagedPtr queue
    return result

#if ENABLE_OVERLOADING
data QueuePopHeadMethodInfo
instance (signature ~ (m (Ptr ())), MonadIO m) => O.MethodInfo QueuePopHeadMethodInfo Queue signature where
    overloadedMethod _ = queuePopHead

#endif

-- method Queue::pop_nth
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "n", argType = TBasicType TUInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the position of the element", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TPtr)
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_pop_nth" g_queue_pop_nth ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    Word32 ->                               -- n : TBasicType TUInt
    IO (Ptr ())

{- |
Removes the /@n@/\'th element of /@queue@/ and returns its data.

/Since: 2.4/
-}
queuePopNth ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> Word32
    {- ^ /@n@/: the position of the element -}
    -> m (Ptr ())
    {- ^ __Returns:__ the element\'s data, or 'Nothing' if /@n@/ is off the end of /@queue@/ -}
queuePopNth queue n = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    result <- g_queue_pop_nth queue' n
    touchManagedPtr queue
    return result

#if ENABLE_OVERLOADING
data QueuePopNthMethodInfo
instance (signature ~ (Word32 -> m (Ptr ())), MonadIO m) => O.MethodInfo QueuePopNthMethodInfo Queue signature where
    overloadedMethod _ = queuePopNth

#endif

-- method Queue::pop_tail
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TPtr)
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_pop_tail" g_queue_pop_tail ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    IO (Ptr ())

{- |
Removes the last element of the queue and returns its data.
-}
queuePopTail ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> m (Ptr ())
    {- ^ __Returns:__ the data of the last element in the queue, or 'Nothing'
    if the queue is empty -}
queuePopTail queue = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    result <- g_queue_pop_tail queue'
    touchManagedPtr queue
    return result

#if ENABLE_OVERLOADING
data QueuePopTailMethodInfo
instance (signature ~ (m (Ptr ())), MonadIO m) => O.MethodInfo QueuePopTailMethodInfo Queue signature where
    overloadedMethod _ = queuePopTail

#endif

-- method Queue::push_head
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the data for the new element.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_push_head" g_queue_push_head ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    Ptr () ->                               -- data : TBasicType TPtr
    IO ()

{- |
Adds a new element at the head of the queue.
-}
queuePushHead ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue'. -}
    -> Ptr ()
    {- ^ /@data@/: the data for the new element. -}
    -> m ()
queuePushHead queue data_ = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    g_queue_push_head queue' data_
    touchManagedPtr queue
    return ()

#if ENABLE_OVERLOADING
data QueuePushHeadMethodInfo
instance (signature ~ (Ptr () -> m ()), MonadIO m) => O.MethodInfo QueuePushHeadMethodInfo Queue signature where
    overloadedMethod _ = queuePushHead

#endif

-- method Queue::push_nth
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the data for the new element", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "n", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the position to insert the new element. If @n is negative or\n    larger than the number of elements in the @queue, the element is\n    added to the end of the queue.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_push_nth" g_queue_push_nth ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    Ptr () ->                               -- data : TBasicType TPtr
    Int32 ->                                -- n : TBasicType TInt
    IO ()

{- |
Inserts a new element into /@queue@/ at the given position.

/Since: 2.4/
-}
queuePushNth ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> Ptr ()
    {- ^ /@data@/: the data for the new element -}
    -> Int32
    {- ^ /@n@/: the position to insert the new element. If /@n@/ is negative or
    larger than the number of elements in the /@queue@/, the element is
    added to the end of the queue. -}
    -> m ()
queuePushNth queue data_ n = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    g_queue_push_nth queue' data_ n
    touchManagedPtr queue
    return ()

#if ENABLE_OVERLOADING
data QueuePushNthMethodInfo
instance (signature ~ (Ptr () -> Int32 -> m ()), MonadIO m) => O.MethodInfo QueuePushNthMethodInfo Queue signature where
    overloadedMethod _ = queuePushNth

#endif

-- method Queue::push_tail
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the data for the new element", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_push_tail" g_queue_push_tail ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    Ptr () ->                               -- data : TBasicType TPtr
    IO ()

{- |
Adds a new element at the tail of the queue.
-}
queuePushTail ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> Ptr ()
    {- ^ /@data@/: the data for the new element -}
    -> m ()
queuePushTail queue data_ = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    g_queue_push_tail queue' data_
    touchManagedPtr queue
    return ()

#if ENABLE_OVERLOADING
data QueuePushTailMethodInfo
instance (signature ~ (Ptr () -> m ()), MonadIO m) => O.MethodInfo QueuePushTailMethodInfo Queue signature where
    overloadedMethod _ = queuePushTail

#endif

-- method Queue::remove
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the data to remove", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_remove" g_queue_remove ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    Ptr () ->                               -- data : TBasicType TPtr
    IO CInt

{- |
Removes the first element in /@queue@/ that contains /@data@/.

/Since: 2.4/
-}
queueRemove ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> Ptr ()
    {- ^ /@data@/: the data to remove -}
    -> m Bool
    {- ^ __Returns:__ 'True' if /@data@/ was found and removed from /@queue@/ -}
queueRemove queue data_ = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    result <- g_queue_remove queue' data_
    let result' = (/= 0) result
    touchManagedPtr queue
    return result'

#if ENABLE_OVERLOADING
data QueueRemoveMethodInfo
instance (signature ~ (Ptr () -> m Bool), MonadIO m) => O.MethodInfo QueueRemoveMethodInfo Queue signature where
    overloadedMethod _ = queueRemove

#endif

-- method Queue::remove_all
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the data to remove", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUInt)
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_remove_all" g_queue_remove_all ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    Ptr () ->                               -- data : TBasicType TPtr
    IO Word32

{- |
Remove all elements whose data equals /@data@/ from /@queue@/.

/Since: 2.4/
-}
queueRemoveAll ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> Ptr ()
    {- ^ /@data@/: the data to remove -}
    -> m Word32
    {- ^ __Returns:__ the number of elements removed from /@queue@/ -}
queueRemoveAll queue data_ = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    result <- g_queue_remove_all queue' data_
    touchManagedPtr queue
    return result

#if ENABLE_OVERLOADING
data QueueRemoveAllMethodInfo
instance (signature ~ (Ptr () -> m Word32), MonadIO m) => O.MethodInfo QueueRemoveAllMethodInfo Queue signature where
    overloadedMethod _ = queueRemoveAll

#endif

-- method Queue::reverse
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "queue", argType = TInterface (Name {namespace = "GLib", name = "Queue"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GQueue", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_reverse" g_queue_reverse ::
    Ptr Queue ->                            -- queue : TInterface (Name {namespace = "GLib", name = "Queue"})
    IO ()

{- |
Reverses the order of the items in /@queue@/.

/Since: 2.4/
-}
queueReverse ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Queue
    {- ^ /@queue@/: a 'GI.GLib.Structs.Queue.Queue' -}
    -> m ()
queueReverse queue = liftIO $ do
    queue' <- unsafeManagedPtrGetPtr queue
    g_queue_reverse queue'
    touchManagedPtr queue
    return ()

#if ENABLE_OVERLOADING
data QueueReverseMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo QueueReverseMethodInfo Queue signature where
    overloadedMethod _ = queueReverse

#endif

#if ENABLE_OVERLOADING
type family ResolveQueueMethod (t :: Symbol) (o :: *) :: * where
    ResolveQueueMethod "clear" o = QueueClearMethodInfo
    ResolveQueueMethod "clearFull" o = QueueClearFullMethodInfo
    ResolveQueueMethod "free" o = QueueFreeMethodInfo
    ResolveQueueMethod "freeFull" o = QueueFreeFullMethodInfo
    ResolveQueueMethod "index" o = QueueIndexMethodInfo
    ResolveQueueMethod "init" o = QueueInitMethodInfo
    ResolveQueueMethod "isEmpty" o = QueueIsEmptyMethodInfo
    ResolveQueueMethod "peekHead" o = QueuePeekHeadMethodInfo
    ResolveQueueMethod "peekNth" o = QueuePeekNthMethodInfo
    ResolveQueueMethod "peekTail" o = QueuePeekTailMethodInfo
    ResolveQueueMethod "popHead" o = QueuePopHeadMethodInfo
    ResolveQueueMethod "popNth" o = QueuePopNthMethodInfo
    ResolveQueueMethod "popTail" o = QueuePopTailMethodInfo
    ResolveQueueMethod "pushHead" o = QueuePushHeadMethodInfo
    ResolveQueueMethod "pushNth" o = QueuePushNthMethodInfo
    ResolveQueueMethod "pushTail" o = QueuePushTailMethodInfo
    ResolveQueueMethod "remove" o = QueueRemoveMethodInfo
    ResolveQueueMethod "removeAll" o = QueueRemoveAllMethodInfo
    ResolveQueueMethod "reverse" o = QueueReverseMethodInfo
    ResolveQueueMethod "getLength" o = QueueGetLengthMethodInfo
    ResolveQueueMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveQueueMethod t Queue, O.MethodInfo info Queue p) => OL.IsLabel t (Queue -> 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