#include #include #include #include #include using std::map; using std::ostringstream; using std::fabs; bool lt(double arg1, double arg2) { if (equal(arg1,arg2)) return false; else return arg1 < arg2; } ConstantNode* ConstantFactory::getConstantNode(double value) { ConstantNode *cnode = 0; map::const_iterator i = _constmap.find(value); if (i == _constmap.end()) { // Create a new constant node //ostringstream os; long ivalue; /* FIXME: This is, unfortunately, a big problem casting doubles to long that is used everywhere, and is currently broken for negative numbers */ if (value >= 0) { ivalue = static_cast(value + DBL_EPSILON); } else { ivalue = static_cast(value - DBL_EPSILON); } if (fabs(value - ivalue) < DBL_EPSILON) { // Integer value cnode = new ConstantNode(ivalue); //os << ivalue; } else { // Floating point value cnode = new ConstantNode(value); //os << value; } //cnode->setName(os.str()); _graph.add(cnode); _constmap[value] = cnode; return cnode; } else { return i->second; } }