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

//

//  Time-stamp: < 05/02/01 23:18 Kenneth L Moore>

//

// :File: BinOp.cpp

// :Purpose: Clarify the discussion in section 1.4.1

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

 

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

// includes

 

#include <iostream.h>

#include <stdlib.h>

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

 

 

// implement recursive gcd algorithm:

// see http://www.mike95.com/c_plusplus/tutorial/algorithms/Euclid.asp

int gcd_implement( int num1, int num2 )

{

            int remainder = num2 % num1;

           

            if ( remainder != 0 )

                        return gcd_implement( remainder,num1 );

           

            return num1;

}

 

 

// typedefs, globals

struct GCD  {

  typedef int  res_type;

  typedef int  arg1_type;

  typedef int  arg2_type;

  int  operator()(int  x, int  y) const  {

    return gcd_implement( x, y );

  }

};

 

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

// function declarations

 

template <class BinOp>

struct BindFirst  {

 

  BinOp  op;

  typename BinOp::arg1_type  value;

 

  // constructor

  BindFirst(BinOp const& f, typename BinOp::arg1_type const& v):

   op(f), value(v)  {cout << "in BindFirst" << " value " << value <<

   " op intialized " << endl;}

 

  typename BinOp::res_type

   operator()(typename BinOp::arg2_type const& x) const  {

    cout << "in BinOP calling op with value " << value << " x " << x << endl;

    return op(value, x);

  }

};

 

 

 

int main()

{

 

   GCD  gcd;

   BindFirst<GCD>  gcd10(gcd, 10); // instantiate gcd10 using a gcd struct and 10

   int n;

 

   // ask user for a number to compare to 10

   cout << " input a positive integer - neg to stop " << endl;

   cin >> n;

   while (n > 0){

     cout <<" the greatest common denominator of 10 and " << n << " is " << gcd10(n)<< endl;

     cout << " input a positive integer - neg to stop " << endl;

     cin >> n;

   }

   return 0;

}

// eof