#include <iostream>
#include <cstdlib>

using namespace std;
#include "Nodo.h"

// Metodos para las constantes

Cte::Cte(int v)
{
   val= v;
}

Cte::~Cte()
{
}

int Cte::eval() const
{
   return val;
}

// Metodos para las variables

Var::Var(int* v)
{
   var= v;
}

Var::~Var()
{
}

int Var::eval() const
{
   return *var;
}


// Metodos del cambio de signo

Chs::Chs(Nodo* d)
{
   der= d;
}

Chs::~Chs()
{
   delete der;
}

int Chs::eval() const
{
   return - der->eval();
}

// Metodos de la suma
Sum::Sum(Nodo* i, Nodo* d)
{
   izq= i;
   der= d;
}

Sum::~Sum()
{
   delete izq;
   delete der;
}

int Sum::eval() const
{
   return izq->eval() + der->eval();
}

// Metodos de la resta
Res::Res(Nodo* i, Nodo* d)
{
   izq= i;
   der= d;
}

Res::~Res()
{
   delete izq;
   delete der;
}

int Res::eval() const
{
   return izq->eval() - der->eval();
}


// Metodos de la Division
Divs::Divs(Nodo* i, Nodo* d)
{
   izq= i;
   der= d;
}

Divs::~Divs()
{
   delete izq;
   delete der;
}

int Divs::eval() const
{
   return izq->eval() / der->eval();
}


// Metodos del Modulo
Mods::Mods(Nodo* i, Nodo* d)
{
   izq= i;
   der= d;
}

Mods::~Mods()
{
   delete izq;
   delete der;
}

int Mods::eval() const
{
   return izq->eval() % der->eval();
}

// Metodos del Producto
Muls::Muls(Nodo* i, Nodo* d)
{
   izq= i;
   der= d;
}

Muls::~Muls()
{
   delete izq;
   delete der;
}

int Muls::eval() const
{
   return izq->eval() * der->eval();
}


// Metodos de la Exponenciacion
Expo::Expo(Nodo* i, Nodo* d)
{
   izq= i;
   der= d;
}

Expo::~Expo()
{
   delete izq;
   delete der;
}

int pot(int a, int b)
{
   if (b<0)
     return 1; 
   int p= 1;
   while (b)
      {
       if ( b&1 )
         p*= a;
       b>>= 1;
       a*=a;
      } 
   return p;
}


int Expo::eval() const
{
   return pot(izq->eval(), der->eval());
}
