bool operator() (const Datum &i, const Datum &j) { if(i.valueKnown() && !j.valueKnown()) return true; if(!i.valueKnown() && j.valueKnown()) return false; return i.getValue()<j.getValue(); }
PyObject* ShapeInputHandler::getValue() const { // Otherwise, OR together all of the input shapes // (or return NULL if any of them are invalid) PyObject* out = NULL; bool valid = true; PyObject* or_function = PyUnicode_FromString("__or__"); for (auto i : in) { // We check to see if the pointer has been deleted or has been reduced // to a QObject (because destroyed is emitted before complete destruction, // see note above in SingleInputHandler::hasInput) if (i.isNull() || dynamic_cast<Datum*>(i->parent()) == NULL) { continue; } // Link source and target Q_ASSERT(dynamic_cast<Datum*>(i->parent())); Datum* source = static_cast<Datum*>(i->parent()); Q_ASSERT(dynamic_cast<Datum*>(parent())); Datum* target = static_cast<Datum*>(parent()); valid &= target->connectUpstream(source) && source->getValid(); if (!valid) continue; if (out == NULL) { out = source->getValue(); Py_INCREF(out); } else { PyObject* next = PyObject_CallMethodObjArgs( out, or_function, source->getValue(), NULL); Py_DECREF(out); out = next; } } Py_DECREF(or_function); if (valid) { return out; } else { Py_XDECREF(out); return NULL; } }
PyObject* NodeProxy::getAttr(std::string name) { Datum* datum = node->getDatum(QString::fromStdString(name)); if (!datum) throw proxy::ProxyException("Nonexistent datum lookup."); // If we have a known caller, then mark that this datum is an upstream node // for the caller. if (caller) { // Try to connect this datum as an upstream datum of the caller if (!caller->connectUpstream(datum)) throw proxy::ProxyException("Recursive loop in lookup."); // Also connect the node's name as an upstream datum // (since if the name changes, the expression may become invalid) Q_ASSERT(dynamic_cast<Node*>(datum->parent())); Node* n = static_cast<Node*>(datum->parent()); auto name = n->getDatum("__name"); Q_ASSERT(name); caller->connectUpstream(name); } if (!datum->getValid()) throw proxy::ProxyException("Invalid datum lookup."); PyObject* value = datum->getValue(); Py_INCREF(value); return value; }
PyObject* SingleInputHandler::getValue() const { Q_ASSERT(!in.isNull()); Q_ASSERT(dynamic_cast<Datum*>(in->parent())); Datum* source = static_cast<Datum*>(in->parent()); Q_ASSERT(dynamic_cast<Datum*>(parent())); Datum* target = static_cast<Datum*>(parent()); if (target->connectUpstream(source) && source->getValid()) { PyObject* v = source->getValue(); Py_INCREF(v); return v; } else { return NULL; } }