UnderwareDESIGN

PlayBASIC => Resources => Source Codes => Topic started by: kevin on March 25, 2015, 12:30:31 PM

Title: Execution Stack Example
Post by: kevin on March 25, 2015, 12:30:31 PM
  Execution Stack Example

   This is more a conceptual demonstration than a shining example.   The primary idea here is that we can create a stack of execution events and then call them at run time.   Since the order is created at run time and not at compile time, we can insert / change the order as the program is executing.  

   In the following example source code bellow, we're drawing a scene made up of only two functions for the sake of simplicity.  When the program starts, we adds our two render functions to the stack that we want to be called during each Render() call.     The Render() Function runs through our array of stacked events calls the function(s) if they exist.  

 
[pbcode]


/*
      define the order that Render() should darw the screen.
      render will call each function in the execution stack from first
      to last.
*/      
      
      AddToExectionStack("ClearScreen")
      AddToExectionStack("DrawMessages")
      

      // --------------------------------------------------------------------
      // MAIN LOOP
      // --------------------------------------------------------------------
      Do
         render()
      loop

      end
      


      // Render Functions

Function CLearScreen()
      cls $102030
EndFunction



Function DrawMessages()
      For ylp =0 to getsurfaceheight() step GetTextHeight("|")
         text 0,ylp,"Hello World........."      
      next
EndFunction






/*
 ----------------------------------------------------------------------------
 ----------------------------------------------------------------------------
 ----------------------------------------------------------------------------
 ---[ EXECUTION STACK ]------------------------------------------------------
 ----------------------------------------------------------------------------
 ----------------------------------------------------------------------------
 ----------------------------------------------------------------------------

  This is bare bones version to introduce you to the concept.  SO we don't
  have any fancy depth sorting or management functiosn that could be attached
  to each exectuion event in the stack.

*/


      Type tExecutionStack
            NameOfFunction$
            IndexOfFunction      
      EndType

      Dim ExeStack(0) as tExecutionStack
      

Function AddToExectionStack(Name$)

      if getarrayStatus(ExeStack())=false
            Dim ExeStack(0) as tExecutionStack
      endif

      index=getfreecell(ExeStack())
      
      ExeStack(index)=new tExecutionStack
      ExeStack(index).NameOfFunction=Name$
      ExeStack(index).IndexOfFunction=FunctionIndex(name$)
                        
EndFunction Index



Function Render()

      if getarrayStatus(ExeStack())
         // find the depth of the stackl
         for lp=1 to getarrayelements(ExeStack())

                  if ExeStack(lp)
                  
                     Index=ExeStack(lp).IndexOfFunction
                     if Index=0
                        index=FunctionIndex(ExeStack(lp).NameOfFunction$)
                        ExeStack(lp).IndexOfFunction=Index
                     endif

                     if Index>0
                           CallFunction Index
                     endif


                  endif
         next
      endif
      
      sync
EndFunction


[/pbcode]


    Related Examples:

         * Action GUI (http://www.underwaredesign.com/forums/index.php?topic=3899.0)
         * Abstraction Layer  (http://www.underwaredesign.com/forums/index.php?topic=3611.0)