#include "classe.h"

using namespace std;

Nstring::Nstring()
{
    m_chaine = NULL;
    len = 0;
}

Nstring::Nstring(const char *chaine)
{
    m_chaine = copie(chaine);
    len = longueur(chaine);
}

Nstring::Nstring(const Nstring &chaine)
{
    m_chaine = copie(chaine.m_chaine);
    len = chaine.len;
}


Nstring Nstring::operator=(const char *chaine)
{
    delete[] m_chaine;
    m_chaine = copie(chaine);
    len = longueur(chaine);

    return *this;
}

Nstring Nstring::operator=(const Nstring &chaine)
{
    delete[] m_chaine;
    m_chaine = copie(chaine.m_chaine);
    len = chaine.len;

    return *this;
}

Nstring Nstring::operator+(const char *chaine)
{
    int tailleTotale = len + longueur(chaine);
    char *sommeChaines = new char[tailleTotale + 1];

    for (int i = 0 ; i < len ; i++)
    {
        sommeChaines[i] = m_chaine[i];
    }

    for (int i = len ; i < tailleTotale ; i++)
    {
        sommeChaines[i] = chaine[i - len];
    }
    sommeChaines[tailleTotale] = '\0';

    Nstring resultat(sommeChaines);
    delete[] sommeChaines;
    return resultat;
}

Nstring Nstring::operator+(const Nstring &chaine)
{
    int tailleTotale = len + chaine.len;
    char *sommeChaines = new char[tailleTotale + 1];

    for (int i = 0 ; i < len ; i++)
    {
        sommeChaines[i] = m_chaine[i];
    }

    for (int i = len ; i < tailleTotale ; i++)
    {
        sommeChaines[i] = chaine.m_chaine[i - len];
    }
    sommeChaines[tailleTotale] = '\0';

    Nstring resultat(sommeChaines);
    delete[] sommeChaines;
    return resultat;
}

ostream &operator<<( ostream &out, Nstring &chaine )
{
    out << chaine.getChaine();
    return out;
}

istream &operator>>( istream &in, Nstring &chaine )
{
    char t[100];
    in>>t;
    chaine.m_chaine=chaine.copie(t);
    //in >> chaine.m_chaine;
    return in;
}



char *Nstring::getChaine()
{
    return m_chaine;
}

void Nstring::afficher()
{
    cout << m_chaine << endl;
}

int Nstring::longueur(const char *chaine)
{
    int i = 0;

    while (chaine[i] != '\0')
    {
        i++;
    }

    return i;
}

char *Nstring::copie(const char *chaine)
{
    int taille = longueur(chaine);
    if(m_chaine!=NULL)
      delete m_chaine;
    char *chaineCopie = new char[taille + 1];


    for (int i = 0 ; i < taille ; i++)
    {
        chaineCopie[i] = chaine[i];
    }
    chaineCopie[taille] = '\0';
    len=taille;
    return chaineCopie;
}


Nstring::~Nstring()
{
    delete[] m_chaine;
}
