
/** G. Hagopian
2. Write a template function that takes a vector<T> vt
and a vector<U> vu as arguments and
returns the sum of all vt[i]*vu[i]s.
*/

#include<iostream>
#include<vector>
using namespace std;

int Euclid(int m, int n) {
    m = abs(m);
    n = abs(n);
    if(m > n) swap(m,n);  /// m is the smallest
    if(m == 0) return n;
    Euclid(n%m, m);
}

class Rational {
    int numerator;
    int denominator;
public:
    Rational(int n, int d) :
        numerator(n/Euclid(n,d)),
        denominator(d/Euclid(n,d)) {}
    int showNum() const { return numerator;}
    int showDen() const { return denominator; }
    Rational operator*(Rational roper) {
        return(Rational(this->numerator*roper.numerator,
                        this->denominator*roper.denominator));
    }
};

ostream& operator<<(ostream& os, const Rational& r) {
    os << r.showNum() << '/' << r.showDen();
    return os;
}

template<typename T, typename U> ///typename std::common_type<T,U>::type
typename std::common_type<T,U>::type dot(vector<T>& vt, vector<U>& vu ) {
    auto dotProduct{0};
    for(int i = 0; i < min(vt.size(),vu.size()); ++i)
        dotProduct = dotProduct + vt[i]*vu[i];
    return dotProduct;
}

int main() {
    vector<int> v1{1,2,3};
    vector<double> v2{4.0,5.1,6.2,7.3};
    cout << dot(v1,v2);
    /**Rational r1(20,32);
    Rational r2(16,37);
    cout << "\n" << r1 << '*' << r2 << " = " << r1*r2;*/
    vector<Rational> vr1, vr2;
    for(int i = 0; i < 5; ++i) {
        vr1.push_back(Rational(i+5,i+7));
        vr2.push_back(Rational(i+4,i+9));
    }
    cout << "\nThe vector vr1 is ";
    cout << "\n{";
    for(int i = 0; i < vr1.size()-1; ++i)
        cout << vr1[i] << ',';
    cout << vr1[vr1.size()-1] << '}';

    cout << "\nThe vector vr2 is ";
    cout << "\n{";
    for(int i = 0; i < vr2.size()-1; ++i)
        cout << vr2[i] << ',';
    cout << vr2[vr2.size()-1] << '}';
    //Rational dotR = dot(vr1,vr2);
    //cout << "\nThe dot product of vr1 and vr2 is " << dotR;
}

