// adds an edge. Invalidates edge iterators for the source node EdgeIterator InsertEdge(const NodeIterator from, const NodeIterator to, const EdgeDataT &data) { Node &node = node_list[from]; EdgeIterator newFirstEdge = node.edges + node.firstEdge; if (newFirstEdge >= edge_list.size() || !isDummy(newFirstEdge)) { if (node.firstEdge != 0 && isDummy(node.firstEdge - 1)) { node.firstEdge--; edge_list[node.firstEdge] = edge_list[node.firstEdge + node.edges]; } else { EdgeIterator newFirstEdge = (EdgeIterator)edge_list.size(); unsigned newSize = node.edges * 1.1 + 2; EdgeIterator requiredCapacity = newSize + edge_list.size(); EdgeIterator oldCapacity = edge_list.capacity(); if (requiredCapacity >= oldCapacity) { edge_list.reserve(requiredCapacity * 1.1); } edge_list.resize(edge_list.size() + newSize); for (const auto i : osrm::irange(0u, node.edges)) { edge_list[newFirstEdge + i] = edge_list[node.firstEdge + i]; makeDummy(node.firstEdge + i); } for (const auto i : osrm::irange(node.edges + 1, newSize)) { makeDummy(newFirstEdge + i); } node.firstEdge = newFirstEdge; } } Edge &edge = edge_list[node.firstEdge + node.edges]; edge.target = to; edge.data = data; ++number_of_edges; ++node.edges; return EdgeIterator(node.firstEdge + node.edges); }
// removes an edge. Invalidates edge iterators for the source node void DeleteEdge(const NodeIterator source, const EdgeIterator e) { Node &node = node_list[source]; --number_of_edges; --node.edges; BOOST_ASSERT(std::numeric_limits<unsigned>::max() != node.edges); const unsigned last = node.firstEdge + node.edges; BOOST_ASSERT(std::numeric_limits<unsigned>::max() != last); // swap with last edge edge_list[e] = edge_list[last]; makeDummy(last); }
// ************************************************************************ void CTextureBlend::doGenerate(bool async) { if (!_BlendTex[0] || !_BlendTex[1]) { makeDummy(); return; } //NLMISC::TTicks start = NLMISC::CTime::getPerformanceTime(); _BlendTex[0]->generate(); _BlendTex[1]->generate(); this->blend(*_BlendTex[0], *_BlendTex[1], _BlendFactor, true); /*NLMISC::TTicks end = NLMISC::CTime::getPerformanceTime(); nlinfo("blend time = %.2f", (float) (1000 * NLMISC::CTime::ticksToSecond(end - start)));*/ }
// removes all edges (source,target) int32_t DeleteEdgesTo(const NodeIterator source, const NodeIterator target) { int32_t deleted = 0; for (EdgeIterator i = BeginEdges(source), iend = EndEdges(source); i < iend - deleted; ++i) { if (edge_list[i].target == target) { do { deleted++; edge_list[i] = edge_list[iend - deleted]; makeDummy(iend - deleted); } while (i < iend - deleted && edge_list[i].target == target); } } number_of_edges -= deleted; node_list[source].edges -= deleted; return deleted; }
/*------------------------------------------------------------------*\ doGenerate() \*------------------------------------------------------------------*/ void CTextureMem::doGenerate(bool /* async */) { if (_Data) { if (_IsFile) { NLMISC::CMemStream m (true); m.fill (_Data, _Length); load (m); } else { resize(_TexWidth, _TexHeight, _TexType); ::memcpy(&getPixels(0)[0], _Data, _Length); buildMipMaps(); } } else { makeDummy(); } }