void Pile::copierDans(Pile& P) const { for(int i = 0; i<taille; i++) // On parcours dans l'ordre d'ajout du plus vieux au plus récent { P.push(*litteraux[i]); } }
void Computer::push(Litteral& L) { pushHistorique(*pileActuelle, true); Pile *newP = new Pile(*pileActuelle); newP->push(L); pileActuelle = newP; }
//############# OPERATION ################## void Pile::clone(Pile & p) const{ for(int i = 0; i<this->size(); i++){ Constante * c = this->at(i); if(typeid(*c) ==typeid(CEntier)){ p.push((Constante * )new CEntier(*((CEntier*) c))); }else if(typeid(*c) ==typeid(CRationnel)){ p.push((Constante * )new CRationnel(*((CRationnel*) c))); }else if(typeid(*c) ==typeid(CReel)){ p.push((Constante * )new CReel(*((CReel*) c))); }else if(typeid(*c) ==typeid(CComplexe)){ p.push((Constante * )new CComplexe(*((CComplexe*) c))); }else if(typeid(*c) ==typeid(CExpression)){ p.push((Constante * ) new CExpression(*((CExpression*) c))); } } }
Pile<T>& Pile<T>::clone(){ Pile *copy = new Pile(); for(unsigned int i = 0 ; i < this->size() ; ++i){ T *temp = *this->value(i)->clone(); copy->push(*temp); } return © }
// fabrique soit une constante soit un opérateur (et l'éxécute). void Calculatrice::fabriquer(const QString& text, enumType type) const { Pile* p = &Pile::getInstance(); PileAffichage* pA = &PileAffichage::getInstance(); switch (type) { case ENTIER:{ Constante* res = new Entier(text.toInt()); p->push(res); // ajout log dans le fichier de log LogSystem::add("Push dans la pile : " + res->toString(),FAIBLE); // on push dans la pile d'affichage pA->push(text); break; } case REEL:{ Constante* res = new Reel(text.toDouble()); p->push(res); // ajout log dans le fichier de log LogSystem::add("Push dans la pile : " + res->toString(),FAIBLE); // on push dans la pile d'affichage pA->push(text); break; } case RATIONNEL:{ // séparation num / den QStringList tmp = text.split("/"); Constante* res = new Rationnel(tmp.value(0).toInt(), tmp.value(1).toInt()); p->push(res); // ajout log dans le fichier de log LogSystem::add("Push dans la pile : " + res->toString(),FAIBLE); // on push dans la pile d'affichage pA->push(text); break; } case COMPLEXE:{ // séparation re $ im QStringList tmp = text.split("$"); // push la partie réelle du complexe if (this->isEntier(tmp.value(0))) { this->fabriquer(tmp.value(0),ENTIER); } else if (this->isReel(tmp.value(0))) { this->fabriquer(tmp.value(0),REEL); } else if (this->isRationnel(tmp.value(0))) { this->fabriquer(tmp.value(0),RATIONNEL); } // push la partie imaginaire du complexe if (this->isEntier(tmp.value(1))) { this->fabriquer(tmp.value(1),ENTIER); } else if (this->isReel(tmp.value(1))) { this->fabriquer(tmp.value(1),REEL); } else if (this->isRationnel(tmp.value(1))) { this->fabriquer(tmp.value(1),RATIONNEL); } // pop les deux parties const NonComplexe* c1 = dynamic_cast<const NonComplexe*>(p->pop()); const NonComplexe* c2 = dynamic_cast<const NonComplexe*>(p->pop()); // construction du complexe et push. Complexe* res = new Complexe(*c2, *c1); p->push(res); // ajout log dans le fichier de log LogSystem::add("Push dans la pile : " + res->toString(),FAIBLE); // on push dans la pile d'affichage pA->push(text); break; } case OPERATEUR:{ Operateur* res = new Operateur(text); // ajout log dans le fichier de log LogSystem::add("Traitement opération : " + text,FAIBLE); // on push dans la pile d'affichage pA->push(text); res->effectuerOperation(); break; } case EXPRESSION:{ QString tmp(text); tmp.replace(QString("'"), QString("")); Constante* res = new Expression(tmp); p->push(res); // ajout log dans le fichier de log LogSystem::add("Push dans la pile : " + res->toString(),FAIBLE); // on push dans la pile d'affichage pA->push(text); break; } default:{ QMessageBox::critical(0,"Erreur !", "Fabrication d'objet impossible!"); // ajout log dans le fichier de log LogSystem::add("Fabrication d'objet impossible",ELEVEE); break; } } }