/*
 * $Id: CommunBufStatistics.java,v 1.2 1999/11/24 08:40:35 yamauchi Exp $
 *
 *     (M\pi)^2 : CommunBufStatistics
 *	Copyright 1999 By YAMAUCHI Hitoshi 山内 斉 
 *	@author YAMAUCHI Hitoshi 山内 斉
 *	
 * 通信バッファ用の統計情報
 *	(送・受信オブジェクトの総数 / 送・受信回数) で平均一回あたりい
 *	くつのオブジェクトを送・受信したのかわかる．
 *
 * original source Statistics.h
 *
 * 1999年8月19日(木)
 */

package jp.ac.tohoku.is.archi.mpi2.net;

import jp.ac.tohoku.is.archi.mpi2.util.*;
import jp.ac.tohoku.is.archi.mpi2.sysparam.*;

/**
 * 通信バッファの用いる statistics
 */
public final class CommunBufStatistics  {
    private int mMaxQueueLen;	// 送信側のキュー長 (送信側のみ)
    private int mNSendRecv;	// 送信 or 受信回数
    private int mNObjs;		// 送信 or 受信オブジェクト総数
    
    /**
     * constructor
     */
    public CommunBufStatistics ()
    {
	this.init();
    }
    public CommunBufStatistics(CommunBufStatistics  rhs)
    {
	this.mMaxQueueLen = rhs.mMaxQueueLen;
	this.mNSendRecv   = rhs.mNSendRecv;
	this.mNObjs	  = rhs.mNObjs;
    }

    /**
     * initializer
     */
    public void init()
    {
	this.mMaxQueueLen = 0;
	this.mNSendRecv   = 0;
	this.mNObjs	  = 0;
    }

    /**
     * 常に現在のキュー長を受け，最大のキュー長を記録する．
     */
    public void reportQueLen(int quelen)
    {
	if(Config.USE_STAT)
	{
	    if(quelen > this.mMaxQueueLen)
	    {
		this.mMaxQueueLen = quelen;
	    }
	}
    }

    /**
     * 一回の送信で送った(受信で受けた)物体数の記録
     */
    public void reportNSendRecvObjs(int n_objes)
    {
	if(Config.USE_STAT)
	{
	    this.mNSendRecv++;
	    this.mNObjs += n_objes;
	}
    }

    /**
     * 
     */
    public int getMaxQueueLen() 	
    {
	return(this.mMaxQueueLen);	
    }

    /**
     * 
     */
    public int getNSendRecv() 	
    {
	return(this.mNSendRecv);	
    }

    /**
     * 
     */
    public int getNObjs() 		
    {
	return(this.mNObjs);		
    }

    /**
     * 
     */
    public double getNObjParSend() 
    {
	if(this.mNSendRecv == 0)
	{
	    return(0.0);	// 利用されなかった場合には 0.0 を返す
	}else
	{
	    return(((double)this.mNObjs) / ((double)this.mNSendRecv));
	}
    }
}

