// 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.shadervm;

import net.cellcomputing.himawari.accessory.STLVector;
import net.cellcomputing.himawari.accessory.primitive.p_boolean;
import net.cellcomputing.himawari.library.CqStats;
import net.cellcomputing.himawari.library.EqIntIndex;
import net.cellcomputing.himawari.library.IqShaderData;

/**
 * すべてのシェーダ変数を定義しなければならない抽象的な基底クラス。
 * @author NTT DATA Corporation
 */
public abstract strictfp class CqShaderVariable extends IqShaderData {
 
	protected String		m_strName;		// 変数名
    protected boolean	m_fParameter;	// この変数がシェーダの引数であることを示すフラグ

	/**
	 * コンストラクタ
	 * 統計情報を更新する
	 */
	public CqShaderVariable(){
		m_fParameter = false;
		m_strName = "";
	    CqStats.STATS_INC( EqIntIndex.SHD_var_created_total );
	    CqStats.STATS_INC( EqIntIndex.SHD_var_current );
	    int cSHD = CqStats.STATS_GETI( EqIntIndex.SHD_var_current );
	    int cPeak = CqStats.STATS_GETI( EqIntIndex.SHD_var_peak );

	    CqStats.STATS_SETI( EqIntIndex.SHD_var_peak, cSHD > cPeak ? cSHD : cPeak );
	}
	
	/**
	 * コンストラクタ
	 * 統計情報を更新する
	 * @param strName
	 * @param fParameter
	 */
	public CqShaderVariable(final String strName,boolean fParameter){
		m_strName = strName;
		m_fParameter = fParameter;
		
		CqStats.STATS_INC( EqIntIndex.SHD_var_created_total );
		CqStats.STATS_INC( EqIntIndex.SHD_var_current );
	    int cSHD = CqStats.STATS_GETI( EqIntIndex.SHD_var_current );
	    int cPeak = CqStats.STATS_GETI( EqIntIndex.SHD_var_peak );

	    CqStats.STATS_SETI( EqIntIndex.SHD_var_peak, cSHD > cPeak ? cSHD : cPeak );	
	}
	/**
	 * コンストラクタ
	 * 
	 * @param strName
	 */
	public CqShaderVariable(final String strName){
		this(strName,false);
	}
	
	/**
	 * コピーコンストラクタ
	 * @param val
	 */
	public CqShaderVariable(CqShaderVariable val){
		m_strName = val.m_strName;
		m_fParameter = val.m_fParameter;
	}
	
	/**
	 * デストラクタ
	 */
	public void destruct() {
	    CqStats.STATS_DEC( EqIntIndex.SHD_var_current );
	}

	/**
	 *常に失敗する関数
	 */
	public void GetBoolPtr(final STLVector<p_boolean> vector) {
		assert(false);

	}



	/**
	 *常に失敗する関数
	 */
	public void GetBool(p_boolean res, int index) {
		assert(false);
	}

	/**
	 *常に失敗する関数
	 */
	public void SetBool(final boolean val) {
		assert(false);
	}

	/**
	 *常に失敗する関数
	 */
	public void SetBool(final boolean val, int index) {
		assert(false);
	}
	
	/**
	 * m_strNameのgetter
	 */
	public String strName() {
		return m_strName;
	}

	/**
	 * m_fParameterのsetter
	 * @param fParameter
	 */
	public void setfParameter(boolean fParameter){
		m_fParameter= fParameter;
	}
	
	/**
	 * m_fParameterをtrueにするsetter
	 */
	public final void setfParameter(){
		m_fParameter = true;
	}
	
	/**
	 * m_fParameterのgetter
	 */
	public boolean fParameter() {
		return m_fParameter;
	}
	/**
	 *常に0を返すメソッド
	 */
	public int ArrayLength() {
		return 0;
	}
	
	/**
	 * 自分自身を返すメソッド
	 */
	public IqShaderData ArrayEntry(int i) {
		return this;
	}

}
