//Include implementarea containerului list din STL
#include "list.h"
#include <iostream.h>

void main (void)
{
    //Defineste o lista vida de intregi
    list<int> bit_seq;
    //Valoarea care va fi citita de la intrare
    //initializata explicit cu 0. Oricum, ar fi
    //fost initializata si implicit cu zero.
    int input(0);
    //Contor pentru numarul de simboluri 1.
    int count_1(0);

    cout << "Introduceti valori 0 si 1, sau o alta valoare pentru oprire..." << endl;
    while(cin >> input)
    {
        if(!(input == 0 || input == 1))
                break;
        //Se utilizeaza metoda push_bach pentru inserarea
        //valorii la sfarsitul listei. Operatia se face prin copiere.
        bit_seq.push_back (input);
    }

    //Se creaza o noua lista, copie a primeia, care va contine
    //Secventa de biti prelucrata.
    list<int> bit_stuffed_seq(bit_seq);

    //Sunt definiti iteratori pentru parcurgerea unui ciclu.
    list<int>::iterator first(bit_stuffed_seq.begin());
    list<int>::iterator last(bit_stuffed_seq.end());

    //Ciclul in care se realizeaza prelucrarea secventei de biti
    while(first != last)
    {
        if (*first == 0)
                //Daca apare un 0 atunci se reseteaza contorul
                //care numara simbolurile 1 consecutive.
                count_1 = 0;
        else
        if(*first == 1)
                //Cazul unui simbol 1 dupa cel putin un alt simbol 1.
                //Este cazul sa se incrementeze contorul de 1 consecutivi.
                count_1++;
        //Se trece la urmatorul element din lista.
        first++;
        if (count_1 == 5)
        {
            //Insereaza un 0 dupa 5 1 consecutivi.
            bit_stuffed_seq.insert (first, 0);
            count_1 = 0; //Se reseteaza contorul de 1 consecutivi.
        }
    }

    //Ia sa vedem rezultatele ...
    cout << "Secventa de biti originala este :" << endl;
    //Se plaseaza iteratorii pe lista corespunzatoare si
    //li se atribuie valorile corecte pentru operatia care urmeaza...
    first = bit_seq.begin();
    last = bit_seq.end();
    while(first != last)
        cout << *first++;
    cout << endl;
    
    cout << "Secventa de biti prelucrata este :" << endl;
    first = bit_stuffed_seq.begin();
    last = bit_stuffed_seq.end();
    while(first != last)
        cout << *first++;
    cout << endl;
}
