#include <config.h>
#include <functions/Multiply.h>
#include <sarray/SArray.h>

using std::vector;

Multiply::Multiply ()
  : ScalarFunc ("*", 0)
{
}

double
Multiply::eval (vector < SArray const *>const &args) const
{
  double val = *args[0]->value();
  /* We adopt the convention that any argument multiplied by zero
     is zero. This is required to do calculations like x*log(x)
     when x is zero.
  */
  if (val == 0) {
    return 0;
  }
  for (unsigned int i = 1; i < args.size(); ++i) {
    double vali = *args[i]->value();
    if (vali == 0) {
      return 0;
    }
    val *= vali;
  }
  return val;
}

bool Multiply::isDiscreteValued(vector<SArray const *> const &args) const
{
  for (unsigned int i = 0; i < args.size(); ++i) {
    if (!args[i]->isDiscreteValued())
      return false;
  }
  return true;
}


syntax highlighted by Code2HTML, v. 0.9.1