/**********************************************************************
** This program is part of 'MOOSE', the
** Messaging Object Oriented Simulation Environment,
** also known as GENESIS 3 base code.
**           copyright (C) 2014 Upinder S. Bhalla. and NCBS
** It is made available under the terms of the
** GNU Lesser General Public License version 2.1
** See the file COPYING.LIB for the full notice.
**********************************************************************/
#ifndef _FUNC_TERM_H
#define _FUNC_TERM_H

#include "muParser.h"

class FuncTerm
{
	public:
		FuncTerm();
		~FuncTerm();
		/**
		 * This computes the value. The time t is an argument needed by
		 * some functions.
		 */
		double operator() ( const double* S, double t ) const;
		const FuncTerm& operator=( const FuncTerm& other );

		void evalPool( double* s, double t ) const;

		/**
		 * This function finds the reactant indices in the vector
		 * S. It returns the number of indices found, which are the
		 * entries in molIndex.
		 */
		void setReactantIndex( const vector< unsigned int >& mol );
		const vector< unsigned int >& getReactantIndex() const;
		const string& getExpr() const;
		void setExpr( const string& e );
		const unsigned int getTarget() const;
		void setTarget( unsigned int tgt );
		void setVolScale( double vs );
		double getVolScale() const;
	private: 
		double* args_;
		// Look up reactants in the S vec.
		vector< unsigned int > reactantIndex_; 
		mu::Parser parser_;
		string expr_;
		/**
		 * Scale factor to account for pool volume if we are assigning conc
		 * rather than N. Note that this conc will not be further updated 
		 * so this is an undesirable option.
		 */
		double volScale_; 
		unsigned int target_; /// Index of the entity to be updated by Func
};

#endif // _FUNC_TERM_H