#include <iostream>
#include <vector>
#include "Thread.h"

using namespace std;

class Multiplicateur : public Thread
{
public:
    Multiplicateur(int x, vector<int> *binaire);
    void run();
    void giveNumber(int nb);
    void inventaire();

private:
    const int m_x;
    vector<int> *m_binaire;
};

Multiplicateur::Multiplicateur(int x, vector<int> *binaire) : m_x(x), m_binaire(binaire)
{
    createLockMutex("nb");
    unlockMutex("nb");
}

void Multiplicateur::run()
{

    while (1==1) giveNumber(m_x);
}

void Multiplicateur::giveNumber(int nb)
{
    if ( lockMutex("nb") )
    {
        m_binaire->push_back(nb);
        unlockMutex("nb");
    }
}

void inventaire(vector<int> *binaire)
{
    int nb[3];
    nb[0] = nb[1] = nb[2] = 0;
    while (!binaire->empty())
    {
        nb[(*binaire)[binaire->size()-1]]++;
        binaire->pop_back();
    }

    cout << "Il y a eu "<<nb[0]<<"x0 et "<<nb[1]<<"x1 et "<<nb[2]<<"x2."<<endl;
}

int main()
{
    cout << "Test de la classe Thread développée par Nathan Touroux." << endl;

    vector<int>* tableau(0);
    tableau = new vector<int>(0);

    Multiplicateur process1(1, tableau), process2(2, tableau);
    process1.start();
    process2.start();

    for (int i(0); i<10000; i++) process1.giveNumber(0);

    process1.stop();
    process2.stop();

    inventaire(tableau);

    delete tableau;
    return 0;
}