CurvePtr LazyGraph::newCurve(CurvePtr parent, bool setParent) { CurveId id = nextCurveId; nextCurveId.id++; CurvePtr c = new LazyCurve(this, id); curves.insert(make_pair(id, c.get())); if (curveOffsets.find(id) == curveOffsets.end()) { curveOffsets.insert(make_pair(id, (long int) - 1)); } curveCache->add(c.get(), true); return c; }
CurvePtr LazyGraph::newCurve(CurvePtr model, NodePtr start, NodePtr end) { CurveId id = nextCurveId; nextCurveId.id++; CurvePtr c = new LazyCurve(this, id, start->getId(), end->getId()); start->addCurve(id); end->addCurve(id); if (model != NULL) { map<CurveId, long int>::iterator ci = curveOffsets.find(model->getId()); curveOffsets.insert(make_pair(id, ci->second)); } else { curveOffsets.insert(make_pair(id, (long int) -1)); } curves.insert(make_pair(id, c.get())); curveCache->add(c.get(), true); return c; }
void LazyGraph::movePoint(CurvePtr c, int i, const vec2d &p) { if (i == 0 || i == c->getSize() - 1) { NodePtr n = i == 0 ? c->getStart() : c->getEnd(); nodeCache->add(n.get(), true); } else { curveCache->add(c.get(), true); } Graph::movePoint(c, i, p); }
void LazyGraph::removeArea(AreaId id) { AreaPtr a = getArea(id); if (a != NULL) { for (int i = 0; i < a->getCurveCount(); i++) { CurvePtr c = a->getCurve(i); c->removeArea(a->getId()); curveCache->add(c.get(), true); } while (a->getCurveCount()) { a->removeCurve(0); } } areaCache->changedResources.erase(a.get()); map<AreaId, long int>::iterator k = areaOffsets.find(id); if (k != areaOffsets.end()) { areaOffsets.erase(k); } }
void LazyGraph::removeCurve(CurveId id) { CurvePtr c = getCurve(id); if (c != NULL) { NodePtr start = c->getStart(); NodePtr end = c->getEnd(); NodeId nId; nId.id = NULL_ID; c->addVertex(nId, 0); c->addVertex(nId, 1); if (start != end && start != NULL) { start->removeCurve(id); if (start->getCurveCount() == 0) { NodeId sid = start->getId(); start = NULL; removeNode(sid); } else { nodeCache->add(start.get(), true); } } if (end != NULL) { end->removeCurve(id); if (end->getCurveCount() == 0) { NodeId eid = end->getId(); end = NULL; removeNode(eid); } else { nodeCache->add(end.get(), true); } } } curveCache->changedResources.erase(c.get()); map<CurveId, long int>::iterator k = curveOffsets.find(id); if (k != curveOffsets.end()) { curveOffsets.erase(k); } }
CurvePtr LazyGraph::getCurve(CurveId id) { if (id.id == NULL_ID) { return NULL; } map<CurveId, Curve *>::iterator i = curves.find(id); if (i != curves.end()) { // if the requested resource has already been loaded CurvePtr r = i->second; curveCache->remove(r);// we remove it from the unusedResources Cache //r->owner = this; // and we return the resource return r; } if (Logger::DEBUG_LOGGER != NULL) { ostringstream os; os << "Loading curve '" << id.id << "'"; Logger::DEBUG_LOGGER->log("GRAPH", os.str()); } // otherwise the resource is not already loaded; we first load its descriptor CurvePtr r = NULL; long int offset; map<CurveId, long int>::iterator j = curveOffsets.find(id); if (j != curveOffsets.end()) { offset = j->second; r = loadCurve(offset, id); curves.insert(make_pair(id, r.get())); return r; } if (Logger::ERROR_LOGGER != NULL) { ostringstream os; os << "Loading : Missing or invalid curve '" << id.id << "'"; Logger::ERROR_LOGGER->log("GRAPH", os.str()); } throw exception(); // return NULL; }