// Aqsis
// Copyright (c) 1997 - 2001, Paul C. Gregory
//
// Contact: pgregory@aqsis.com
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

/**
 * Copyright (C) 2006-2007  NTT DATA CORPORATION
 * 
 * Version: 1.0.0 2007/04/01
 *  
 */
package net.cellcomputing.himawari.library;

/**
 * インターバルごとのレンダリングプロセスのタイミングを計るクラス<br>
 * Start()、Stop()メソッドを用いることで時間を測定する。<br>
 * assignAddメソッドでタイマー同士の時間を合わせることもできる。
 * 
 * @author NTT DATA Corporation
 */

public strictfp class CqStatTimer {
	private long	m_timeStart;		///< Time at which the current interval started.
	private long	m_timeTotal;		///< このタイマーで測定した総時間
	private int	m_cStarted;				///<timerがスタートされると++,Stopされると--されるカウンタ
	
	/**
	 * コンストラクタ
	 * 全ての属性を0に初期化する
	 */
	public CqStatTimer(){
		m_timeStart = 0;
		m_timeTotal = 0;
		m_cStarted =0;
	}
	
	
	/** 
	 * m_timeTotalのgetter
	 */
	long	TimeTotal()
	{
		return ( m_timeTotal );
	}
	
	/** 
	 * Start the timer, asserts that the timer has not already been started, nesting is not allowed.
	 * タイマーがスタートしていない場合
	 * タイマーをスタートさせる。
	 * ネストは許可しない(がチェックの機構は実装されていない)
	 * 
	 */
	void	Start()
	{
		if ( m_cStarted == 0 )
			m_timeStart = System.currentTimeMillis();//変更 2005/08/02 clock();
		m_cStarted++;
	}
	
	/** Stop the timer and update the total time for this timer. Asserts that the timer was actually running.
	 * 既にタイマーが走っている場合、
	 * タイマーを止め、total timeを更新する。
	 * 
	 */
	void	Stop()
	{
		assert( m_cStarted > 0 );
		m_cStarted--;
		if ( m_cStarted == 0 )
			m_timeTotal += System.currentTimeMillis() - m_timeStart;//変更 2005/08/02 clock()
	}
	
	/** Reset the total time for this timer, asserts that the timer is not running.
	 * タイマーが走っていない場合、total timeをリセットする。
	 * (が、チェックの機構は実装されていない)
	 */
	void	Reset()
	{
		m_timeTotal = 0;
		m_cStarted = 0;
	}
	
	/** Check if this timer is started.
	 * タイマーが走っているかどうかを返す
	 * @return timerがスタートしていればtrue
	 * 
	 */
	boolean isStarted()
	{
		return( m_cStarted > 0 );
	}
	
	/** 
	 * ２つの時計の情報を統合する。
	 * 引数で指定された時計の総合時間を加算する。
	 * @param from 統合する時計情報
	 * @return 自分自身を返す
	 */
	CqStatTimer assignAdd(final CqStatTimer from )
	{
		m_timeTotal += from.m_timeTotal;
		return(this);
	}
	
	
	/**
	 * m_cStartedのgetter
	 * @return Returns the m_cStarted.
	 */
	public int getM_cStarted() {
		return m_cStarted;
	}
	
	
	/**
	 * m_timeStartのgetter
	 * @return Returns the m_timeStart.
	 */
	public long getM_timeStart() {
		return m_timeStart;
	}
}
