Development Flash ActionScript

/*
 * hexagon framework - Multi-Purpose ActionScript 3 Framework.
 * Copyright (C) 2007 Hexagon Star Softworks
 *       __    __
 *    __/  \__/  \__    __
 *   /  \__/HEXAGON \__/  \
 *   \__/  \__/ FRAMEWORK_/
 *            \__/  \__/
 *
 * ``The contents of this file are subject to the Mozilla Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 */
package com.hexagonstar.util.debug
{
  import flash.utils.getTimer;
  
  /**
   * Stopwatch stops the time.
   * 
   * Instantiate this class as follows:
   *   import com.hexagonstar.util.StopWatch;
   *   var stopWatch:StopWatch = new StopWatch();
   * 
   * This will create a still standing stopwatch. You can start
   * and stop the stopwatch to record time as you please.
   *   stopWatch.start();
   *   // Do something
   *   stopWatch.stop();
   * 
   * The recored time is available in milliseconds and seconds.
   *   trace(stopWatch.getTimeInMilliSeconds() + " ms");
   *   trace(stopWatch.getTimeInSeconds() + " s");
   * 
   */
  public class StopWatch
  {
    private var _started:Boolean = false;
    private var _startTimeKeys:Array;
    private var _stopTimeKeys:Array;
    private var _title:String;
    
    /** 
     * Constructs a new StopWatch instance.
     */
    public function StopWatch()
    {
      reset();
    }
    
    /**
     * Resets the stopwatch total running time.
     */
    public function reset():void
    {
      _startTimeKeys = new Array();
      _stopTimeKeys = new Array();
      _started = false;
    }
    
    /**
     * Starts the time recording process.
     */
    public function start(title:String = ""):void
    {
      if (!hasStarted())
      {
        _title = title;
        _started = true;
        _startTimeKeys.push(getTimer());
      }
    }
    
    /**
     * Stops the time recording process if the process has been started before.
     */
    public function stop():void
    {
      if (hasStarted())
      {
        var stopTime:uint = getTimer();
        _stopTimeKeys[_startTimeKeys.length - 1] = stopTime;
        _started = false;
      }
    }
    
    /**
     * Returns whether this stopwatch has been started.
     * 
     * @return           true if this stopwatch has been started else false.
     */
    public function hasStarted():Boolean
    {
      return _started;
    }
    
    /**
     * Calculates and returns the elapsed time in milliseconds.
     * This stopwatch will not be stopped by calling this method. If this stopwatch
     * is still running it takes the current time as stoptime for the result.
     * 
     * @return           the elapsed time in milliseconds.
     */
    public function getTimeInMilliSeconds():int
    {
      if (hasStarted())
      {
        _stopTimeKeys[_startTimeKeys.length - 1] = getTimer();
      }
      var result:int = 0;
      for (var i:int = 0; i < _startTimeKeys.length; i++)
      {
        result += (_stopTimeKeys[i] - _startTimeKeys[i]);
      }
      return result;    
    }
    
    /**
     * Calculates and returns the elapsed time in seconds.
     * This stopwatch will not be stopped by calling this method. If this stopwatch
     * is still running it takes the current time as stoptime for the result.
     * 
     * @return           the elapsed time in seconds.
     */
    public function getTimeInSeconds():Number
    {
      return getTimeInMilliSeconds() / 1000;
    }
    
    /**
     * Generates a string representation of this stopwatch that includes all start and
     * stop times in milliseconds.
     * 
     * @return           the string representation of this stopwatch.
     */
    public function toString():String
    {
      var result:String = "\n ********** [STOPWATCH] **********";
      if (_title != "") result += "\n  " + _title;
      for(var i:int = 0; i < _startTimeKeys.length; i++)
      {
        result += "\n  started [" + _startTimeKeys[i]
          + "ms] stopped [" + _stopTimeKeys[i] + "ms]";
      }
      if (i == 0) result += "\n  never started.";
      else result += "\n  total runnning time: " + getTimeInMilliSeconds() + "ms";
      result += "\n *********************************";
      return result;
    }
  }
}