/*
 *  slimath.h
 *
 *  This file is part of NEST.
 *
 *  Copyright (C) 2004 The NEST Initiative
 *
 *  NEST 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.
 *
 *  NEST 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 NEST.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef SLIMATH_H
#define SLIMATH_H
/* 
    SLI's math operators
*/

#include "interpret.h"

void init_slimath(SLIInterpreter *);

class Add_diFunction: public SLIFunction
{
public:

Add_diFunction() {}
    void execute(SLIInterpreter *) const;
};

class Add_iiFunction: public SLIFunction
{
public: 
  Add_iiFunction() {}
    void execute(SLIInterpreter *) const;
};

class Add_idFunction: public SLIFunction
{
public:
   Add_idFunction() {}
    void execute(SLIInterpreter *) const;
};

class Add_ddFunction: public SLIFunction
{
public:
Add_ddFunction() {}
    void execute(SLIInterpreter *) const;
};
//---------------------------------------

class Sub_diFunction: public SLIFunction
{
public:
Sub_diFunction() {}
    void execute(SLIInterpreter *) const;
};

class Sub_iiFunction: public SLIFunction
{
public:

Sub_iiFunction() {}

    void execute(SLIInterpreter *) const;
};

class Sub_idFunction: public SLIFunction
{
public:

Sub_idFunction() {}

    void execute(SLIInterpreter *) const;
};

class Sub_ddFunction: public SLIFunction
{
public:

Sub_ddFunction() {}

    void execute(SLIInterpreter *) const;
};
//---------------------------------------

class Mul_diFunction: public SLIFunction
{
public:

Mul_diFunction() {}

    void execute(SLIInterpreter *) const;
};

class Mul_iiFunction: public SLIFunction
{
public:

Mul_iiFunction() {}

    void execute(SLIInterpreter *) const;
};

class Mul_idFunction: public SLIFunction
{
public:

Mul_idFunction() {}

    void execute(SLIInterpreter *) const;
};

class Mul_ddFunction: public SLIFunction
{
public:

Mul_ddFunction() {}

    void execute(SLIInterpreter *) const;
};
//---------------------------------------

class Div_diFunction: public SLIFunction
{
public:

Div_diFunction() {}

    void execute(SLIInterpreter *) const;
};

class Div_iiFunction: public SLIFunction
{
public:

Div_iiFunction() {}

    void execute(SLIInterpreter *) const;
};

class Div_idFunction: public SLIFunction
{
public:

Div_idFunction() {}

    void execute(SLIInterpreter *) const;
};
class Div_ddFunction: public SLIFunction
{
public:

Div_ddFunction() {}

    void execute(SLIInterpreter *) const;
};

//--------------------------------------

class Mod_iiFunction: public SLIFunction
{
public:

Mod_iiFunction() {}

    void execute(SLIInterpreter *) const;
};
//--------------------------------------


class Sin_dFunction: public SLIFunction
{
public:

Sin_dFunction() {}

    void execute(SLIInterpreter *) const;
};

class Asin_dFunction: public SLIFunction
{
public:

Asin_dFunction() {}

    void execute(SLIInterpreter *) const;
};

class Cos_dFunction: public SLIFunction
{
public:

Cos_dFunction() {}

    void execute(SLIInterpreter *) const;
};

class Acos_dFunction: public SLIFunction
{
public:

Acos_dFunction() {}

    void execute(SLIInterpreter *) const;
};

class Exp_dFunction: public SLIFunction
{
public:

Exp_dFunction() {}

    void execute(SLIInterpreter *) const;
};

class Ln_dFunction: public SLIFunction
{
public:
Ln_dFunction() {}

    void execute(SLIInterpreter *) const;
};

class Log_dFunction: public SLIFunction
{
public:

  Log_dFunction() {}

    void execute(SLIInterpreter *) const;
};

class Sqr_dFunction: public SLIFunction
{
public:

Sqr_dFunction() {}

    void execute(SLIInterpreter *) const;
};

class Sqrt_dFunction: public SLIFunction
{
public:

Sqrt_dFunction() {}

    void execute(SLIInterpreter *) const;
};

class Pow_ddFunction: public SLIFunction
{
public:

  Pow_ddFunction() {}

  void execute(SLIInterpreter *) const;
};

class Pow_diFunction: public SLIFunction
{
public:

  Pow_diFunction() {}

  void execute(SLIInterpreter *) const;
};

class Modf_dFunction: public SLIFunction
{
public:

  Modf_dFunction() {}

  void execute(SLIInterpreter *) const;
};

class Frexp_dFunction: public SLIFunction
{
public:

  Frexp_dFunction() {}

  void execute(SLIInterpreter *) const;
};

class Ldexp_diFunction: public SLIFunction
{
public:

  Ldexp_diFunction() {}

  void execute(SLIInterpreter *) const;
};


class Dexp_iFunction: public SLIFunction
{
public:

  Dexp_iFunction() {}

  void execute(SLIInterpreter *) const;
};


//--------------------------------------
class Abs_iFunction: public SLIFunction
{
public:

Abs_iFunction() {}

    void execute(SLIInterpreter *) const;
};
class Abs_dFunction: public SLIFunction
{
public:

Abs_dFunction() {}

    void execute(SLIInterpreter *) const;
};

//--------------------------------------

class Neg_iFunction: public SLIFunction
{
public:

Neg_iFunction() {}

    void execute(SLIInterpreter *) const;
};
class Neg_dFunction: public SLIFunction
{
public:

Neg_dFunction() {}

    void execute(SLIInterpreter *) const;
};

class Inv_dFunction: public SLIFunction
{
public:

Inv_dFunction() {}

    void execute(SLIInterpreter *) const;
};

//-------------------------

class EqFunction: public SLIFunction
{
public:
EqFunction() {}

    void execute(SLIInterpreter *) const;
};

class NeqFunction: public SLIFunction
{
public:

NeqFunction() {}

    void execute(SLIInterpreter *) const;
};

class AndFunction: public SLIFunction
{
public:

AndFunction() {}

    void execute(SLIInterpreter *) const;
};

class OrFunction: public SLIFunction
{
public:

OrFunction() {}

    void execute(SLIInterpreter *) const;
};

class And_iiFunction: public SLIFunction
{
public:

And_iiFunction() {}

    void execute(SLIInterpreter *) const;
};

class Or_iiFunction: public SLIFunction
{
public:

Or_iiFunction() {}

    void execute(SLIInterpreter *) const;
};

class XorFunction: public SLIFunction
{
public:

XorFunction() {}

    void execute(SLIInterpreter *) const;
};

class Not_bFunction: public SLIFunction
{
public:

Not_bFunction() {}

    void execute(SLIInterpreter *) const;
};

class Not_iFunction: public SLIFunction
{
public:

Not_iFunction() {}

    void execute(SLIInterpreter *) const;
};

class Geq_iiFunction: public SLIFunction
{
public:

Geq_iiFunction() {}

    void execute(SLIInterpreter *) const;
};

class Geq_idFunction: public SLIFunction
{
public:

Geq_idFunction() {}

    void execute(SLIInterpreter *) const;
};

class Geq_diFunction: public SLIFunction
{
public:

Geq_diFunction() {}

    void execute(SLIInterpreter *) const;
};

class Geq_ddFunction: public SLIFunction
{
public:

Geq_ddFunction() {}

    void execute(SLIInterpreter *) const;
};

class Leq_iiFunction: public SLIFunction
{
public:

Leq_iiFunction() {}

    void execute(SLIInterpreter *) const;
};

class Leq_idFunction: public SLIFunction
{
public:

Leq_idFunction() {}

    void execute(SLIInterpreter *) const;
};

class Leq_diFunction: public SLIFunction
{
public:

Leq_diFunction() {}

    void execute(SLIInterpreter *) const;
};

class Leq_ddFunction: public SLIFunction
{
public:

Leq_ddFunction() {}

    void execute(SLIInterpreter *) const;
};


//-------------------------

class Gt_iiFunction: public SLIFunction
{
public:

Gt_iiFunction() {}

    void execute(SLIInterpreter *) const;
};

class Gt_ddFunction: public SLIFunction
{
public:

Gt_ddFunction() {}

    void execute(SLIInterpreter *) const;
};

class Gt_idFunction: public SLIFunction
{
public:

Gt_idFunction() {}

    void execute(SLIInterpreter *) const;
};

class Gt_diFunction: public SLIFunction
{
public:

Gt_diFunction() {}

    void execute(SLIInterpreter *) const;
};

class Gt_ssFunction: public SLIFunction
{
public:

Gt_ssFunction() {}

    void execute(SLIInterpreter *) const;
};

class Lt_iiFunction: public SLIFunction
{
public:

Lt_iiFunction() {}

    void execute(SLIInterpreter *) const;
};

class Lt_ddFunction: public SLIFunction
{
public:
Lt_ddFunction() {}

    void execute(SLIInterpreter *) const;
};

class Lt_idFunction: public SLIFunction
{
public:

Lt_idFunction() {}

    void execute(SLIInterpreter *) const;
};

class Lt_diFunction: public SLIFunction
{
public:

Lt_diFunction() {}

    void execute(SLIInterpreter *) const;
};

class Lt_ssFunction: public SLIFunction
{
public:

Lt_ssFunction() {}

    void execute(SLIInterpreter *) const;
};

class IntegerFunction: public SLIFunction
{
public:

IntegerFunction() {}

    void execute(SLIInterpreter *) const;
};

class DoubleFunction: public SLIFunction
{
public:

  DoubleFunction() {}

    void execute(SLIInterpreter *) const;
};

class UnitStep_iFunction: public SLIFunction
{
public:

  UnitStep_iFunction() {}

    void execute(SLIInterpreter *) const;
};

class UnitStep_dFunction: public SLIFunction
{
public:

  UnitStep_dFunction() {}

    void execute(SLIInterpreter *) const;
};

class UnitStep_iaFunction: public SLIFunction
{
public:

  UnitStep_iaFunction() {}

    void execute(SLIInterpreter *) const;
};

class UnitStep_daFunction: public SLIFunction
{
public:

  UnitStep_daFunction() {}

    void execute(SLIInterpreter *) const;
};

class Round_dFunction: public SLIFunction
{
public:

  Round_dFunction() {}
  void execute(SLIInterpreter *) const;
};

class Floor_dFunction: public SLIFunction
{
public:

  Floor_dFunction() {}

    void execute(SLIInterpreter *) const;
};

class Ceil_dFunction: public SLIFunction
{
public:

  Ceil_dFunction() {}

    void execute(SLIInterpreter *) const;
};


class Max_i_iFunction: public SLIFunction
{
public:

  Max_i_iFunction() {}

    void execute(SLIInterpreter *) const;
};
class Max_i_dFunction: public SLIFunction
{
public:

  Max_i_dFunction() {}

    void execute(SLIInterpreter *) const;
};
class Max_d_iFunction: public SLIFunction
{
public:

  Max_d_iFunction() {}

    void execute(SLIInterpreter *) const;
};
class Max_d_dFunction: public SLIFunction
{
public:

  Max_d_dFunction() {}

    void execute(SLIInterpreter *) const;
};


class Min_i_iFunction: public SLIFunction
{
public:

  Min_i_iFunction() {}

    void execute(SLIInterpreter *) const;
};
class Min_i_dFunction: public SLIFunction
{
public:

  Min_i_dFunction() {}

    void execute(SLIInterpreter *) const;
};
class Min_d_iFunction: public SLIFunction
{
public:

  Min_d_iFunction() {}

    void execute(SLIInterpreter *) const;
};
class Min_d_dFunction: public SLIFunction
{
public:

  Min_d_dFunction() {}

    void execute(SLIInterpreter *) const;
};

#endif