/* dtkComposerNodeNumberOperator.cpp --- * * Author: David Rey * Copyright (C) 2008-2011 - David Rey, Inria. * Created: Mon Feb 27 14:28:20 2012 (+0100) * Version: $Id: 19280c038a0fc03dd88fe21465e091aff18c7a73 $ * Last-Updated: mar. févr. 4 17:43:02 2014 (+0100) * By: Nicolas Niclausse * Update #: 496 */ /* Commentary: * */ /* Change log: * */ #include "dtkComposerMetatype.h" #include "dtkComposerNodeNumberOperator.h" #include "dtkComposerTransmitterEmitter.h" #include "dtkComposerTransmitterReceiver.h" #include "dtkComposerTransmitterVariant.h" #include #include #include #include // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary // ///////////////////////////////////////////////////////////////// class dtkComposerNodeNumberOperatorUnaryPrivate { public: dtkComposerTransmitterVariant receiver; public: dtkComposerTransmitterVariant emitter; public: qlonglong value_i; double value_r; }; dtkComposerNodeNumberOperatorUnary::dtkComposerNodeNumberOperatorUnary(void) : dtkComposerNodeLeaf(), d(new dtkComposerNodeNumberOperatorUnaryPrivate) { QList variant_list; variant_list << QMetaType::LongLong << QMetaType::Double; d->receiver.setDataTypes(variant_list); this->appendReceiver(&(d->receiver)); d->emitter.setData(&d->value_r); d->emitter.setDataTypes(variant_list); this->appendEmitter(&(d->emitter)); } dtkComposerNodeNumberOperatorUnary::~dtkComposerNodeNumberOperatorUnary(void) { delete d; d = NULL; } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary // ///////////////////////////////////////////////////////////////// class dtkComposerNodeNumberOperatorBinaryPrivate { public: dtkComposerTransmitterVariant receiver_lhs; dtkComposerTransmitterVariant receiver_rhs; public: dtkComposerTransmitterVariant emitter; public: qlonglong value_i; double value_r; }; dtkComposerNodeNumberOperatorBinary::dtkComposerNodeNumberOperatorBinary(void) : dtkComposerNodeLeaf(), d(new dtkComposerNodeNumberOperatorBinaryPrivate) { QList variant_list; variant_list << QMetaType::LongLong << QMetaType::Double; d->receiver_lhs.setDataTypes(variant_list); this->appendReceiver(&(d->receiver_lhs)); d->receiver_rhs.setDataTypes(variant_list); this->appendReceiver(&(d->receiver_rhs)); d->emitter.setData(&d->value_r); d->emitter.setDataTypes(variant_list); this->appendEmitter(&(d->emitter)); } dtkComposerNodeNumberOperatorBinary::~dtkComposerNodeNumberOperatorBinary(void) { delete d; d = NULL; } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberComparator // ///////////////////////////////////////////////////////////////// class dtkComposerNodeNumberComparatorPrivate { public: dtkComposerTransmitterVariant receiver_lhs; dtkComposerTransmitterVariant receiver_rhs; public: dtkComposerTransmitterEmitter emitter; public: bool value; }; dtkComposerNodeNumberComparator::dtkComposerNodeNumberComparator(void) : dtkComposerNodeLeaf(), d(new dtkComposerNodeNumberComparatorPrivate) { QList variant_list; variant_list << QMetaType::LongLong << QMetaType::Double; d->receiver_lhs.setDataTypes(variant_list); this->appendReceiver(&(d->receiver_lhs)); d->receiver_rhs.setDataTypes(variant_list); this->appendReceiver(&(d->receiver_rhs)); d->value = false; d->emitter.setData(&d->value); this->appendEmitter(&(d->emitter)); } dtkComposerNodeNumberComparator::~dtkComposerNodeNumberComparator(void) { delete d; d = NULL; } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeLeaf - ALMOSTEQ // ///////////////////////////////////////////////////////////////// class dtkComposerNodeNumberAlmosteqPrivate { public: dtkComposerTransmitterVariant receiver_lhs; dtkComposerTransmitterVariant receiver_rhs; dtkComposerTransmitterVariant receiver_eps; public: dtkComposerTransmitterEmitter emitter; public: bool value; }; dtkComposerNodeNumberAlmosteq::dtkComposerNodeNumberAlmosteq(void) : dtkComposerNodeLeaf(), d(new dtkComposerNodeNumberAlmosteqPrivate) { QList variant_list; variant_list << QMetaType::LongLong << QMetaType::Double; d->receiver_lhs.setDataTypes(variant_list); this->appendReceiver(&(d->receiver_lhs)); d->receiver_rhs.setDataTypes(variant_list); this->appendReceiver(&(d->receiver_rhs)); d->receiver_eps.setDataTypes(variant_list); this->appendReceiver(&(d->receiver_eps)); d->value = false; d->emitter.setData(&d->value); this->appendEmitter(&(d->emitter)); } dtkComposerNodeNumberAlmosteq::~dtkComposerNodeNumberAlmosteq(void) { delete d; d = NULL; } void dtkComposerNodeNumberAlmosteq::run(void) { if (d->receiver_lhs.dataType() == QMetaType::LongLong && d->receiver_rhs.dataType() == QMetaType::LongLong) { d->value = (*(d->receiver_lhs.data()) == *(d->receiver_rhs.data())); } else { double lhs = *(d->receiver_lhs.data()); double rhs = *(d->receiver_rhs.data()); double eps = *(d->receiver_eps.data()); d->value = dtkAlmostEqualUlpsSimple(lhs, rhs, eps); } } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeLeaf - NOTALMOSTEQ // ///////////////////////////////////////////////////////////////// class dtkComposerNodeNumberNotalmosteqPrivate { public: dtkComposerTransmitterVariant receiver_lhs; dtkComposerTransmitterVariant receiver_rhs; dtkComposerTransmitterVariant receiver_eps; public: dtkComposerTransmitterEmitter emitter; public: bool value; }; dtkComposerNodeNumberNotalmosteq::dtkComposerNodeNumberNotalmosteq(void) : dtkComposerNodeLeaf(), d(new dtkComposerNodeNumberNotalmosteqPrivate) { QList variant_list; variant_list << QMetaType::LongLong << QMetaType::Double; d->receiver_lhs.setDataTypes(variant_list); this->appendReceiver(&(d->receiver_lhs)); d->receiver_rhs.setDataTypes(variant_list); this->appendReceiver(&(d->receiver_rhs)); d->receiver_eps.setDataTypes(variant_list); this->appendReceiver(&(d->receiver_eps)); d->value = false; d->emitter.setData(&d->value); this->appendEmitter(&(d->emitter)); } dtkComposerNodeNumberNotalmosteq::~dtkComposerNodeNumberNotalmosteq(void) { delete d; d = NULL; } void dtkComposerNodeNumberNotalmosteq::run(void) { if (d->receiver_lhs.dataType() == QMetaType::LongLong && d->receiver_rhs.dataType() == QMetaType::LongLong) { d->value = (*(d->receiver_lhs.data()) != *(d->receiver_rhs.data())); } else { double lhs = *(d->receiver_lhs.data()); double rhs = *(d->receiver_rhs.data()); double eps = *(d->receiver_eps.data()); d->value = !dtkAlmostEqualUlpsSimple(lhs, rhs, eps); } } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - INCR // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryIncr::run(void) { switch (d->receiver.dataType()) { case QMetaType::LongLong: { qlonglong *value = d->receiver.data(); ++(*value); d->emitter.setData(value); break; } case QMetaType::Double: { double *value = d->receiver.data(); ++(*value); d->emitter.setData(value); break; } default: dtkWarn() << "Type" << d->receiver.dataType() << "is not handled by the node."; break; } } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - DECR // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryDecr::run(void) { switch (d->receiver.dataType()) { case QMetaType::LongLong: { qlonglong *value = d->receiver.data(); --(*value); d->emitter.setData(value); break; } case QMetaType::Double: { double *value = d->receiver.data(); --(*value); d->emitter.setData(value); break; } default: dtkWarn() << "Type" << d->receiver.dataType() << "is not handled by the node."; break; } } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - SQRT // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnarySqrt::run(void) { switch (d->receiver.dataType()) { case QMetaType::LongLong: { qlonglong *value = d->receiver.data(); *value = qSqrt(*value); d->emitter.setData(value); break; } case QMetaType::Double: { double *value = d->receiver.data(); *value = qSqrt(*value); d->emitter.setData(value); break; } default: dtkWarn() << "Type" << d->receiver.dataType() << "is not handled by the node."; break; } } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - SQUARE // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnarySquare::run(void) { switch (d->receiver.dataType()) { case QMetaType::LongLong: { qlonglong *value = d->receiver.data(); *value *= (*value); d->emitter.setData(value); break; } case QMetaType::Double: { double *value = d->receiver.data(); *value *= (*value); d->emitter.setData(value); break; } default: dtkWarn() << "Type" << d->receiver.dataType() << "is not handled by the node."; break; } } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - LN // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryLn::run(void) { double *value = d->receiver.data(); *value = qLn(*value); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - LOG10 // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryLog10::run(void) { double *value = d->receiver.data(); *value = qLn(*value) / qLn(10.); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - EXP // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryExp::run(void) { double *value = d->receiver.data(); *value = qExp(*value); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - COS // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryCos::run(void) { double *value = d->receiver.data(); *value = qCos(*value); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - SIN // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnarySin::run(void) { double *value = d->receiver.data(); *value = qSin(*value); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - TAN // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryTan::run(void) { double *value = d->receiver.data(); *value = qTan(*value); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - ACOS // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryAcos::run(void) { double *value = d->receiver.data(); *value = qAcos(*value); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - ASIN // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryAsin::run(void) { double *value = d->receiver.data(); *value = qAsin(*value); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - ATAN // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryAtan::run(void) { double *value = d->receiver.data(); *value = qAtan(*value); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - DEG2RAD // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryDeg2Rad::run(void) { double *value = d->receiver.data(); *value = dtkDeg2Rad(*value); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - RAD2DEG // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryRad2Deg::run(void) { double *value = d->receiver.data(); *value = dtkRad2Deg(*value); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - INV // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryInv::run(void) { double *value = d->receiver.data(); *value = 1. / (*value); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - OPP // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryOpp::run(void) { double *value = d->receiver.data(); *value *= -1.; d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - CEIL // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryCeil::run(void) { if (d->receiver.dataType() == QMetaType::Double) { d->value_i = qCeil(*(d->receiver.data())); d->emitter.setData(&d->value_i); } else { d->emitter.setData(d->receiver.data()); } } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - FLOOR // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryFloor::run(void) { if (d->receiver.dataType() == QMetaType::Double) { d->value_i = qFloor(*(d->receiver.data())); d->emitter.setData(&d->value_i); } else { d->emitter.setData(d->receiver.data()); } } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - ROUND // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryRound::run(void) { if (d->receiver.dataType() == QMetaType::Double) { d->value_i = qRound(*(d->receiver.data())); d->emitter.setData(&d->value_i); } else { d->emitter.setData(d->receiver.data()); } } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorUnary - ABS // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorUnaryAbs::run(void) { switch (d->receiver.dataType()) { case QMetaType::LongLong: { qlonglong *value = d->receiver.data(); *value = qAbs(*value); d->emitter.setData(value); break; } case QMetaType::Double: { double *value = d->receiver.data(); *value = qAbs(*value); d->emitter.setData(value); break; } default: dtkWarn() << "Type" << d->receiver.dataType() << "is not handled by the node."; break; } } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary - EUCLDIV // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorBinaryEucldiv::run(void) { qlonglong *lhs = d->receiver_lhs.data(); qlonglong *rhs = d->receiver_rhs.data(); d->value_i = (*lhs) / (*rhs);; d->emitter.setData(&d->value_i); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary - LOGN // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorBinaryLogn::run(void) { double *lhs = d->receiver_lhs.data(); double *rhs = d->receiver_rhs.data(); d->value_r = qLn(*lhs) / qLn(*rhs); d->emitter.setData(&d->value_r); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary - MIN // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorBinaryMin::run(void) { double *lhs = d->receiver_lhs.data(); double *rhs = d->receiver_rhs.data(); d->value_r = (*lhs) < (*rhs) ? (*lhs) : (*rhs); d->emitter.setData(&d->value_r); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary - MINUS // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorBinaryMinus::run(void) { double *lhs = d->receiver_lhs.data(); double *rhs = d->receiver_rhs.data(); d->value_r = (*lhs) - (*rhs); d->emitter.setData(&d->value_r); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary - MAX // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorBinaryMax::run(void) { double *lhs = d->receiver_lhs.data(); double *rhs = d->receiver_rhs.data(); d->value_r = (*lhs) > (*rhs) ? (*lhs) : (*rhs); d->emitter.setData(&d->value_r); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary - MODULO // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorBinaryModulo::run(void) { qlonglong *value = d->receiver_lhs.data(); *value = (*value) % *(d->receiver_rhs.data()); d->emitter.setData(value); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary - MULT // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorBinaryMult::run(void) { double *lhs = d->receiver_lhs.data(); double *rhs = d->receiver_rhs.data(); d->value_r = (*lhs) * (*rhs); d->emitter.setData(&d->value_r); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary - PLUS // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorBinaryPlus::run(void) { double *lhs = d->receiver_lhs.data(); double *rhs = d->receiver_rhs.data(); d->value_r = (*lhs) + (*rhs); d->emitter.setData(&d->value_r); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary - POSNTHROOT // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorBinaryPosnthroot::run(void) { double *lhs = d->receiver_lhs.data(); double *rhs = d->receiver_rhs.data(); d->value_r = qPow((*lhs), 1. / (*rhs)); d->emitter.setData(&d->value_r); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary - POWER // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorBinaryPower::run(void) { double *lhs = d->receiver_lhs.data(); double *rhs = d->receiver_rhs.data(); d->value_r = qPow((*lhs), (*rhs)); d->emitter.setData(&d->value_r); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary - RATIO // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorBinaryRatio::run(void) { double *lhs = d->receiver_lhs.data(); double *rhs = d->receiver_rhs.data(); d->value_r = (*lhs) / (*rhs); d->emitter.setData(&d->value_r); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberOperatorBinary - EXPN // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberOperatorBinaryExpn::run(void) { double *lhs = d->receiver_lhs.data(); double *rhs = d->receiver_rhs.data(); d->value_r = qExp((*lhs) * qLn(*rhs)); d->emitter.setData(&d->value_r); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberComparator - EQUAL // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberComparatorEqual::run(void) { double lhs = *(d->receiver_lhs.data()); double rhs = *(d->receiver_rhs.data()); d->value = (lhs == rhs); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberComparator - NOTEQUAL // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberComparatorNotequal::run(void) { double lhs = *(d->receiver_lhs.data()); double rhs = *(d->receiver_rhs.data()); d->value = (lhs != rhs); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberComparator - GT // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberComparatorGt::run(void) { double lhs = *(d->receiver_lhs.data()); double rhs = *(d->receiver_rhs.data()); d->value = (lhs > rhs); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberComparator - LT // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberComparatorLt::run(void) { double lhs = *(d->receiver_lhs.data()); double rhs = *(d->receiver_rhs.data()); d->value = (lhs < rhs); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberComparator - GTE // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberComparatorGte::run(void) { double lhs = *(d->receiver_lhs.data()); double rhs = *(d->receiver_rhs.data()); d->value = (lhs >= rhs); } // ///////////////////////////////////////////////////////////////// // dtkComposerNodeNumberComparator - LTE // ///////////////////////////////////////////////////////////////// void dtkComposerNodeNumberComparatorLte::run(void) { double lhs = *(d->receiver_lhs.data()); double rhs = *(d->receiver_rhs.data()); d->value = (lhs <= rhs); }