void RODFNet::buildDetectorDependencies(RODFDetectorCon& detectors) { // !!! this will not work when several detectors are lying on the same edge on different positions buildDetectorEdgeDependencies(detectors); // for each detector, compute the lists of predecessor and following detectors std::map<std::string, ROEdge*>::const_iterator i; for (i = myDetectorEdges.begin(); i != myDetectorEdges.end(); ++i) { const RODFDetector& det = detectors.getDetector((*i).first); if (!det.hasRoutes()) { continue; } // mark current detectors std::vector<RODFDetector*> last; { const std::vector<std::string>& detNames = myDetectorsOnEdges.find((*i).second)->second; for (std::vector<std::string>::const_iterator j = detNames.begin(); j != detNames.end(); ++j) { last.push_back(&detectors.getModifiableDetector(*j)); } } // iterate over the current detector's routes const std::vector<RODFRouteDesc>& routes = det.getRouteVector(); for (std::vector<RODFRouteDesc>::const_iterator j = routes.begin(); j != routes.end(); ++j) { const ROEdgeVector& edges2Pass = (*j).edges2Pass; for (ROEdgeVector::const_iterator k = edges2Pass.begin() + 1; k != edges2Pass.end(); ++k) { if (myDetectorsOnEdges.find(*k) != myDetectorsOnEdges.end()) { const std::vector<std::string>& detNames = myDetectorsOnEdges.find(*k)->second; // ok, consecutive detector found for (std::vector<RODFDetector*>::iterator l = last.begin(); l != last.end(); ++l) { // mark as follower of current for (std::vector<std::string>::const_iterator m = detNames.begin(); m != detNames.end(); ++m) { detectors.getModifiableDetector(*m).addPriorDetector(*l); (*l)->addFollowingDetector(&detectors.getDetector(*m)); } } last.clear(); for (std::vector<std::string>::const_iterator m = detNames.begin(); m != detNames.end(); ++m) { last.push_back(&detectors.getModifiableDetector(*m)); } } } } } }