{- | Copyright : Will Thompson, Iñaki García Etxebarria and Jonas Platte License : LGPL-2.1 Maintainer : Iñaki García Etxebarria (garetxe@gmail.com) Each piece of memory that is pushed onto the stack is cast to a GTrashStack*. -} module GI.GLib.Structs.TrashStack ( -- * Exported types TrashStack(..) , newZeroTrashStack , noTrashStack , -- * Methods -- ** trashStackHeight trashStackHeight , -- ** trashStackPush trashStackPush , -- * Properties -- ** Next trashStackClearNext , trashStackNext , trashStackReadNext , trashStackWriteNext , ) where import Data.GI.Base.ShortPrelude import qualified Data.GI.Base.Attributes as GI.Attributes import qualified Data.Text as T import qualified Data.ByteString.Char8 as B import qualified Data.Map as Map import GI.GLib.Types import GI.GLib.Callbacks newtype TrashStack = TrashStack (ForeignPtr TrashStack) instance WrappedPtr TrashStack where wrappedPtrCalloc = callocBytes 8 wrappedPtrCopy = copyPtr 8 wrappedPtrFree = Just ptr_to_g_free -- | Construct a `TrashStack` struct initialized to zero. newZeroTrashStack :: MonadIO m => m TrashStack newZeroTrashStack = liftIO $ wrappedPtrCalloc >>= wrapPtr TrashStack instance tag ~ 'AttrSet => Constructible TrashStack tag where new _ attrs = do o <- newZeroTrashStack GI.Attributes.set o attrs return o noTrashStack :: Maybe TrashStack noTrashStack = Nothing trashStackReadNext :: MonadIO m => TrashStack -> m (Maybe TrashStack) trashStackReadNext s = liftIO $ withManagedPtr s $ \ptr -> do val <- peek (ptr `plusPtr` 0) :: IO (Ptr TrashStack) result <- convertIfNonNull val $ \val' -> do val'' <- (newPtr TrashStack) val' return val'' return result trashStackWriteNext :: MonadIO m => TrashStack -> Ptr TrashStack -> m () trashStackWriteNext s val = liftIO $ withManagedPtr s $ \ptr -> do poke (ptr `plusPtr` 0) (val :: Ptr TrashStack) trashStackClearNext :: MonadIO m => TrashStack -> m () trashStackClearNext s = liftIO $ withManagedPtr s $ \ptr -> do poke (ptr `plusPtr` 0) (nullPtr :: Ptr TrashStack) data TrashStackNextFieldInfo instance AttrInfo TrashStackNextFieldInfo where type AttrAllowedOps TrashStackNextFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear] type AttrSetTypeConstraint TrashStackNextFieldInfo = (~) (Ptr TrashStack) type AttrBaseTypeConstraint TrashStackNextFieldInfo = (~) TrashStack type AttrGetType TrashStackNextFieldInfo = Maybe TrashStack type AttrLabel TrashStackNextFieldInfo = "next" attrGet _ = trashStackReadNext attrSet _ = trashStackWriteNext attrConstruct = undefined attrClear _ = trashStackClearNext trashStackNext :: AttrLabelProxy "next" trashStackNext = AttrLabelProxy type instance AttributeList TrashStack = TrashStackAttributeList type TrashStackAttributeList = ('[ '("next", TrashStackNextFieldInfo)] :: [(Symbol, *)]) -- method TrashStack::height -- method type : MemberFunction -- Args : [Arg {argCName = "stack_p", argType = TInterface "GLib" "TrashStack", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Just (TBasicType TUInt) -- throws : False -- Skip return : False foreign import ccall "g_trash_stack_height" g_trash_stack_height :: Ptr TrashStack -> -- stack_p : TInterface "GLib" "TrashStack" IO Word32 trashStackHeight :: (MonadIO m) => TrashStack -- stackP -> m Word32 -- result trashStackHeight stackP = liftIO $ do let stackP' = unsafeManagedPtrGetPtr stackP result <- g_trash_stack_height stackP' touchManagedPtr stackP return result -- method TrashStack::push -- method type : MemberFunction -- Args : [Arg {argCName = "stack_p", argType = TInterface "GLib" "TrashStack", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data_p", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "g_trash_stack_push" g_trash_stack_push :: Ptr TrashStack -> -- stack_p : TInterface "GLib" "TrashStack" Ptr () -> -- data_p : TBasicType TPtr IO () trashStackPush :: (MonadIO m) => TrashStack -- stackP -> Ptr () -- dataP -> m () -- result trashStackPush stackP dataP = liftIO $ do let stackP' = unsafeManagedPtrGetPtr stackP g_trash_stack_push stackP' dataP touchManagedPtr stackP return () type family ResolveTrashStackMethod (t :: Symbol) (o :: *) :: * where ResolveTrashStackMethod l o = MethodResolutionFailed l o instance (info ~ ResolveTrashStackMethod t TrashStack, MethodInfo info TrashStack p) => IsLabelProxy t (TrashStack -> p) where fromLabelProxy _ = overloadedMethod (MethodProxy :: MethodProxy info) #if MIN_VERSION_base(4,9,0) instance (info ~ ResolveTrashStackMethod t TrashStack, MethodInfo info TrashStack p) => IsLabel t (TrashStack -> p) where fromLabel _ = overloadedMethod (MethodProxy :: MethodProxy info) #endif