/*
    Functors vs. functions. How to return multiple values
*/

#include <iostream>
#include <cmath>
using namespace std;

// cos(a*x), sin(a*x)
double cossin1(double x, double a)
{   
   return cos(a*x);  // How to return multiple values??
}

// references
double cossin2(double x, double a, double &cosax, double &sinax)
{   
   cosax=cos(a*x);
   sinax=sin(a*x);   
}

// define class with a functor interface.
class Functor
{
   double cosax;  // local variable to store result
   double sinax;  // local variable to store result
   
 public:
   // Constructor
   Functor() : cosax(0.0), sinax(0.0) { }

   // Calculates result
   void operator()(double x, double a)
      {
         cosax=cos(a*x);
         sinax=sin(a*x);
      }

   // return results
   double getcos() { return cosax; }
   double getsin() { return sinax; }
};



int main()
{
    double a=3;
    double x=2;

    cout << "Function call:" << endl;
    cout << "cos(a*x)=" << cossin1(x,a) << endl;

    cout << "Function call return values by-reference:" << endl;
    double cosax,sinax;      // Variables for return values
    cossin2(x,a,cosax,sinax);   
    cout << "cos(a*x)=" << cosax << "   sin(ax)=" << sinax << endl;

    cout << "Functor class:" << endl;
    Functor F;  // defines functor
    F(x,a);     // function call operator()
    cout << "cos(a*x)=" << F.getcos() << "   sin(ax)=" << F.getsin() << endl;
}


