1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
/*************************************************************************************
* Copyright (C) 2007 by Aleix Pol <aleixpol@kde.org> *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software *
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA *
*************************************************************************************/
#include "variables.h"
#include "expression.h"
#include "value.h"
#include "container.h"
using namespace Analitza;
Variables::Variables() : QHash<QString, Object*>()
{
initializeConstants();
}
void Variables::initializeConstants()
{
insert(QStringLiteral("true"), new Cn(true));
insert(QStringLiteral("false"), new Cn(false));
insert(QStringLiteral("pi"), new Cn(Cn::pi()));
insert(QStringLiteral("e"), new Cn(Cn::e()));
insert(QStringLiteral("euler"), new Cn(Cn::euler()));
insert(QStringLiteral("i"), new Cn(0, 1));
}
Variables::Variables(const Variables& v) : QHash<QString, Object*>(v)
{
QHash<QString, Object*>::iterator i;
for (i = this->begin(); i != this->end(); ++i)
*i = (*i)->copy();
}
Variables::~Variables()
{
qDeleteAll(*this);
}
void Variables::modify(const QString & name, const Expression & e)
{
const Analitza::Object* o=e.tree();
if(o->isContainer() && static_cast<const Container*>(o)->containerType()==Container::math) {
o=*static_cast<const Container*>(o)->constBegin();
}
modify(name, o);
}
Cn* Variables::modify(const QString & name, const double & d)
{
iterator it = find(name);
if(it==end() || (*it)->type()!=Object::value) {
Cn* val=new Cn(d);
insert(name, val);
return val;
} else {
Cn* val = static_cast<Cn*>(*it);
val->setValue(d);
return val;
}
}
void Variables::modify(const QString& name, const Object* o)
{
delete value(name);
insert(name, o->copy());
}
void Variables::rename(const QString& orig, const QString& dest)
{
Q_ASSERT(contains(orig));
insert(dest, take(orig));
}
Expression Variables::valueExpression(const QString& name) const
{
return Expression(value(name)->copy());
}
|